【发布时间】: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<uchar>,也许吧。
标签: c++ opencv matrix vector graphics