C++ 如何在使用OpenCV遍历像素时添加2个Mat像素值?

C++ 如何在使用OpenCV遍历像素时添加2个Mat像素值?,c++,opencv,image-processing,colors,C++,Opencv,Image Processing,Colors,我有两个垫子,两个尺寸都一样。然后,我将这两个Mat拆分,以处理每个Mat的BGR值(在我的例子中,它实际上是BGRA)。然后我想将这两个Mat中的每个BGR值相加,并将其存储在蓝、绿、红变量中 我在不使用像素迭代的情况下成功添加了2个Mat,如下所示: //below operation works blue = img1_split1[0] + img2_split[0]; green = img1_split[1] + img2_split[1]; red = img1_split[2]

我有两个垫子,两个尺寸都一样。然后,我将这两个Mat拆分,以处理每个Mat的BGR值(在我的例子中,它实际上是BGRA)。然后我想将这两个Mat中的每个BGR值相加,并将其存储在
蓝、绿、红
变量中

我在不使用像素迭代的情况下成功添加了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处未处理的异常: 微软C++异常:CV::内存位置异常 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);
        }
    }
matimg1、img2;
img1=imread(“some_image.jpg”)//这只是一个例子
img2=imread(“some_image.jpg”);
向量img1_分割,img2_分割;
分割(img1,img1\u分割);
拆分(img2,img2_拆分);
席蓝、绿、红;
对于(int i=0;i

有人能指出我犯的错误吗?感谢

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
,因为一旦分割它们,它们就是单通道图像


当你像这样设置像素时,你必须小心下溢和溢出。。。有一个很好的函数,它是call。

因为它在提供的代码中,您还没有初始化cv::Mat的non。我猜img1和img2在您的代码中已初始化,但蓝色、绿色和红色是否已初始化?@api55 img1和img2已初始化(imread real image)。而蓝色、绿色和红色的书写方式与上面的示例完全相同。我必须用所有0或其他东西初始化它们吗?是的,只需尝试
Mat蓝色(img1.rows,img1.cols,img1.type),绿色(img1.rows,img1.cols,img1.type),红色((img1.rows,img1.cols,img1.type)
@api55不应该是红色、绿色和蓝色的类型
CV_8UC1
,因为它们各自代表输入图像的一个通道吗?@zindarod true,我错过了这一点,但是我在我的电脑中尝试了,没有得到错误,我得到了三分之一的图像,因为CV_8UC1与CV_8UC3sorry的延迟响应。它在将类型更改为
CV_8UC1后工作。感谢额外的解释1编辑,它应该是绿色的(img1.rows、img1.cols、CV_8UC1)