向量下标超出范围opencv c++

Posted

技术标签:

【中文标题】向量下标超出范围opencv c++【英文标题】:Vector Subscript Out Of Range opencv c++ 【发布时间】:2014-11-13 19:21:45 【问题描述】:

我正在尝试编写一些代码,使用 OpenCV 首先将视频逐帧转换为其 r,g 色度,然后将其制成直方图以进行比较。但是,我遇到了一些问题,即在向量或矩阵上不允许进行某些操作(反之亦然)。

Mat src, res, out, hsv_vid;
vector<Mat> spl;
Mat spl_r, spl_g, spl_b;
Mat r_chroma, g_chroma, frame_chroma;

for(;;)
    cap1 >> src; //read video frame into src matrix
    if (src.empty()) break;

    //extract channels
    split(src, spl);
    spl_r = spl[2];
    spl_g = spl[1];
    spl_b = spl[0];

    //convert whole frame to chromaticity
    r_chroma = spl_r / (spl_r + spl_g + spl_b);
    g_chroma = spl_g / (spl_r + spl_g + spl_b);

    //convert matrix to vector
    vector<vector<Mat>> r_chroma_vec;
    for (int i = 0; i < r_chroma.rows; i++) 
        vector<Mat> row;    
        r_chroma.row(i).copyTo(row);
        r_chroma_vec.push_back(row);
    
    vector<vector<Mat>> g_chroma_vec;
    for (int i = 0; i < g_chroma.rows; i++) 
        vector<Mat> row;    
        g_chroma.row(i).copyTo(row);
        g_chroma_vec.push_back(row);
    

    merge(r_chroma_vec, frame_chroma);
    merge(g_chroma_vec, frame_chroma);

 //end for(;;)

//disp chromaticity test img
vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION); //use .PNG compression
compression_params.push_back(9);
try  imwrite("ChromaTest.png", frame_chroma, compression_params);  //write output matrix to file
catch (runtime_error& ex)  return -2; 

如果我希望能够进行除法和加法以获得我的色度,那么 r_chroma 和 g_chroma 必须是矩阵,那么我无法合并它们。如果我有 r_chroma 和 g_chroma 作为向量,那么我可以合并它们,但我不能对它们进行数学运算。

有什么方法可以合并() 2 个矩阵,还是我走错了路?如果有人能指出我正确的方向,我将不胜感激。

感谢阅读!

[编辑]:添加矩阵 -> 向量转换以使合并到输出矩阵成为可能。

【问题讨论】:

Vector Subscript Out Of Range 这意味着您正在访问向量中的越界条目。如果您使用数组,则会发生相同的错误(但运行时崩溃或静默)。所以这真的不是std::vector 问题。 @PaulMcKenzie 我还没有运行它。 VS2012 只是给我红色下划线,因为矩阵/向量不允许某些操作(即合并)。但是您是说 spl[ ] 存在边界错误? 也许只有我一个人,但是这个 for 循环有右括号吗?也许您应该显示所有代码,而不仅仅是一个 sn-p。 @Owl_Prophet 是的。我进行了一些修改以反映这一点。 亲爱的,一般来说,您的代码中错误多于正确。 ` 向量 行; r_chroma.row(i).copyTo(row);` // 不,不会得到想要的结果。 vector&lt;uchar&gt;,也许吧。 【参考方案1】:

cv::merge 对应于 cv::split,第一个参数是 vector&lt;Mat&gt; 或 Mat[],第二个参数是结果 Mat。

所以,你只是弄错了参数。

您方法中的另一个问题是这部分:

r_chroma = spl_r / (spl_r + spl_g + spl_b);

是的,您可以使用数学运算符,但 (spl_r + spl_g + spl_b) 会饱和,结果 Mat 仍然是一个 uchar。

[编辑]:第一次尝试修复矢量问题:

vector<Mat> spl_new;
spl_new.push_back( spl_b ); // <-- ???
spl_new.push_back( g_chroma );
spl_new.push_back( r_chroma );

Mat result;
merge( spl_new, result );

【讨论】:

嗯。你是说我的 r_chroma & g_chroma 应该是一个向量?但如果是这样的话,那我就不能做加法和除法了。另外,如果我不能使用 r,g = R,G / (R+G+B) 那么我应该如何获得色度?感谢您到目前为止的帮助:) 不,您必须先将它们打包成向量。结果图片中的第三个(b)通道是什么?原来的? 我已对帖子进行了编辑。我使用 for 循环将矩阵(由数学运算产生)简单地放入向量中,以使合并到输出数组成为可能。但是我遇到了越界错误。我还得继续努力。但到目前为止,您怎么看? 让我们说 - 我放弃了你。 我认为色度意味着每个像素只有 r,g 值,由 r,g = R,G / (R+G+B) 计算得出。那么结果不是只有2个通道/像素,所以不会有(B)?还是我弄错了?我应该将 b 设置为零矩阵吗?

以上是关于向量下标超出范围opencv c++的主要内容,如果未能解决你的问题,请参考以下文章

向量下标超出范围错误 - C++ Vectors & Open CV

opencv图像处理,向量下标超出范围

(opencv) 调试断言失败,向量下标超出范围

C++ 调试断言失败。向量下标超出范围

向量下标超出范围 C++ 合并排序

二维向量下标超出范围