OpenCV 文档说A.mul(B)是按元素乘法.然而,以下代码生成以下输出,然后给出此错误:
OpenCV Error: Sizes of input arguments do not match
Run Code Online (Sandbox Code Playgroud)
.
cout << laplacian_pyramids[i][numLevels - 1 - l].rows << endl;
cout << gaussian_weight_pyramids[i][l].rows << endl;
cout << laplacian_pyramids[i][numLevels - 1 - l].cols << endl;
cout << gaussian_weight_pyramids[i][l].cols << endl;
Run Code Online (Sandbox Code Playgroud)
得到:
339
339
571
571
Run Code Online (Sandbox Code Playgroud)
然后:
Mat prod = gaussian_weight_pyramids[i][l].mul(laplacian_pyramids[i][numLevels - 1 - l]);
Run Code Online (Sandbox Code Playgroud)
给出了错误.我尝试Mat::multiply了类似的效果.
我建议将单通道转换为三个通道:
Mat A = Mat::zeros(100, 200, CV_32FC1);
Mat B = Mat::zeros(100, 200, CV_32FC3);
// Mat C = A.mul(B); // Sizes of input arguments do not match
Mat Afc3;
Mat t[] = {A, A, A};
merge(t, 3, Afc3);
Mat C = Afc3.mul(B); // now Afc3 has 3 channels ans it is type of 32_FC3
// we can multiply each elem in B by the same coef from A
Run Code Online (Sandbox Code Playgroud)
但是如果B是CV_8UC3类型,它不起作用,因为opencv不允许乘以具有不同类型像素的Mats.在这种情况下,将8UC3转换为32FC3记录以将每个像素缩放1/255.0因为32FC3中的每个像素具有介于0.0和1.0之间的值(当然,8UC3中的每个像素具有0到255之间的值).
Mat A = Mat::zeros(100, 200, CV_32FC1);
Mat B = Mat::zeros(100, 200, CV_8UC3);
// Mat C = A.mul(B);
Mat Afc3, Bfc3;
Mat t[] = {A, A, A};
merge(t, 3, Afc3);
B.convertTo(Bfc3, CV_32FC3, 1/255.0);
Mat C = Afc3.mul(Bfc3);
Run Code Online (Sandbox Code Playgroud)