使用OpenCV迭代像素时,如何添加2个Mat像素值?

时间:2019-05-27 06:24:03

标签: c++ opencv image-processing colors

我有2个Mat,它们的大小相同。然后,我将这两个Mat拆分为每个Mat的BGR值(在我的情况下,实际上是BGRA)。然后,我想从这2个Mat中添加每个BGR值,并将其存储在blue, green, red变量中。

我成功添加了2个Mat,而无需使用像素迭代:

//below operation works
blue = img1_split1[0] + img2_split[0];
green = img1_split[1] + img2_split[1];
red = img1_split[2] + img2_split[2];

但是如果我使用像素迭代并从每个Mat中添加2个像素值,我将面临未处理的异常,像这样:

  

VideoStitcher.exe中0x00007FF89AA69129处未处理的异常:   Microsoft C ++异常:内存位置的cv :: Exception   0x000000ADA5CFD020。

这是我的代码:

Mat img1, img2;
img1 = imread("some_image.jpg");  //this is just for example
img2 = imread("some_image.jpg");

vector<Mat> img1_split, img2_split;

split(img1, img1_split);
split(img2, img2_split);

Mat blue, green, red;

    for (int i = 0; i < img1.rows; i++)
    {
        for (int j = 0; j < img1.cols; j++)
        { //below operation doesn't work
            blue.at<uchar>(i, j) = img1_split1[0].at<uchar>(i, j) + img2_split[0].at<uchar>(i, j);
            green.at<uchar>(i, j) = img1_split[1].at<uchar>(i, j) + img2_split[1].at<uchar>(i, j);
            red.at<uchar>(i, j) = img1_split[2].at<uchar>(i, j) + img2_split[2].at<uchar>(i, j);
        }
    }

有人可以指出我犯的错误吗?谢谢

1 个答案:

答案 0 :(得分:1)

cv :: Mat就像共享的智能指针一样工作,因此当使用默认构造函数(即cv::Mat x;)创建它时,它没有任何数据或类型,并且其.data成员指向任何地方

您需要至少传递行和列,然后键入,以便能够分配图像数据,例如,在您的情况下,它将像这样:

Mat blue(img1.rows, img1.cols, CV_8UC1), green(img1.rows, img1.cols, CV_8UC1), red(img1.rows, img1.cols, CV_8UC1);

我使用了CV_8UC1,因为一旦分割它们,它们就是一个通道的图像。

设置像这样的像素时,必须注意下溢和上溢...为此有一个很好的功能,它称为saturate_cast