如何乘以Mat A * B?

时间:2017-08-07 19:06:56

标签: c++ opencv matrix

我试图在不使用multiply()函数的情况下将两个Mat类型A和B(灰度缩放)相乘。 到目前为止,我开发了下面的代码,它不起作用。我检查了它运行的乘法(A,B,AB)函数,但下面的代码不起作用。

Mat A,B,AB, src;
float AB_yx;
src = imread("as.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Sobel(src , A, CV_32FC1 , 1, 0, 3, BORDER_DEFAULT);
Sobel(src , B, CV_32FC1 , 0, 1, 3, BORDER_DEFAULT);
// multiply(A, B, AB); //worked
AB= src.clone();

for (int y = 0; y < A.rows; y++) {
    for (int x = 0; x < B.cols; x++) {
         AB_yx= 0;
         for (int y = 0; y < B.rows; y++) {
         // for (int k = 0; k < B.rows; k++) {

            AB.at<float>(y, x) = A.at<float>(y, x) * B.at<float>(y, x); //sturkmen's method
            //AB_yx = AB_yx + A.at<float>(y, k) * B.at<float>(k, x);//
        }
        //AB.at<float>(y, x) = AB_yx; 
    }
}




namedWindow("AB");
imshow("AB", AB);

问题visual studio给出了abort()被称为

OpenCV Error: Assertion failed (((((sizeof(size_t)<<28)|0x8442211) >> ((DataType<_Tp>::depth) & ((1 << 3) - 1))*4) & 15) == elemSize1()) in cv::Mat::at, file d:\opencv\opencv\build\include\opencv2\core\mat.inl.hpp, line 957

3 个答案:

答案 0 :(得分:1)

这是为了改善概念

    Mat A = (Mat_<float>(3, 4) << 1, 2, 3, 4, 5, 6, 7, 8, 9, 0.1, 0.1, 0.3);
    Mat B = (Mat_<float>(3, 4) << 1, 2, 3, 4, 5, 6, 7, 8, 9, 0.1, 0.1, 0.3);

    Mat AB0;
    multiply(A, B, AB0);
    cout << A << endl;
    cout << B << endl;
    cout << AB0 << endl;
    Mat AB1 = Mat(A.size(), CV_32FC1);

        for (int x = 0; x < B.cols; x++)
        {
            for (int y = 0; y < B.rows; y++)
            {
                AB1.at<float>(y, x) = A.at<float>(y, x) * B.at<float>(y, x);
            }
        }

    cout << AB1 << endl;

这应该对你有用

Mat A, B, AB, src;
src = imread("as.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Sobel(src, A, CV_32FC1, 1, 0, 3, BORDER_DEFAULT);
Sobel(src, B, CV_32FC1, 0, 1, 3, BORDER_DEFAULT);

AB = Mat(A.size(), CV_32FC1);

for (int x = 0; x < B.cols; x++)
{
    for (int y = 0; y < B.rows; y++)
    {
        AB.at<float>(y, x) = A.at<float>(y, x) * B.at<float>(y, x);
    }
}


namedWindow("AB");
imshow("AB", AB);
waitKey();

但请记住,此代码运行缓慢。你需要使用指针来加速这个过程

答案 1 :(得分:0)

最大问题来自int AB_yx;变量的管理。它未初始化,也应在每次x次迭代开始时重置为0。

另一个问题是AB也是未初始化的,你应该在开始在其中的任意索引处分配数据之前将其调整到适当的维度。

答案 2 :(得分:0)

AB.at<float>错误,因为ABsrc的副本,很可能是CV_8UC1 matrix,所以它必须是AB.at<uchar>或者你是&#39} ;我必须先将AB转换为floatCV_32FC1