OpenCV元素矩阵乘法

Ros*_*one 7 c++ opencv

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了类似的效果.

mar*_*rol 7

我建议将单通道转换为三个通道:

    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)