我有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);
}
}
有人可以指出我犯的错误吗?谢谢
答案 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。