我正在尝试编写一些使用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; }
如果我想能够进行分工&amp;除了获得我的色度,然后r_chroma&amp; g_chroma必须是矩阵,然后我不能合并它们。如果我有r_chroma&amp; g_chroma作为向量,然后我可以合并它们,但我不能对它们进行数学运算。
有没有办法合并()2个矩阵,或者我是以错误的方式解决这个问题?如果有人能指出我正确的方向,我会很感激。
感谢阅读!
[edit]:添加矩阵 - &gt;矢量转换使合并输出矩阵成为可能。
答案 0 :(得分:1)
cv::merge是cv :: split的对应物,1st arg是vector<Mat>
或Mat [],第二个arg是结果Mat。
所以,你只是把args弄错了。
你的方法中的另一个问题是这一部分:
r_chroma = spl_r / (spl_r + spl_g + spl_b);
是的,您可以使用数学运算符,但(spl_r + spl_g + spl_b)
会饱和,结果Mat仍然是一个uchar。
[edit]:首先尝试修复矢量问题:
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 );