【发布时间】:2019-10-12 17:02:33
【问题描述】:
我有 2 个垫子,它们的尺寸相同。然后我拆分这 2 个 Mat 来处理每个 Mat 的 BGR 值(在我的例子中,它实际上是 BGRA)。然后我想从这两个 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 个像素值,我将面临 Exception Unhandled,如下所示:
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);
}
}
有人能指出我犯的错误吗?谢谢
【问题讨论】:
-
因为它在提供的代码中,您没有初始化非 cv::Mat。我猜 img1 和 img2 在您的代码中已初始化,但蓝色、绿色和红色是否已初始化?
-
@api55 img1 和 img2 被初始化(imread real image)。而蓝色、绿色和红色的写法与上面的示例完全相同。我必须用全 0 或其他东西来初始化它们吗?
-
是的,试试
Mat blue(img1.rows, img1.cols, img1.type), green(img1.rows, img1.cols, img1.type), red((img1.rows, img1.cols, img1.type) -
@api55 红色、绿色和蓝色不应该是
CV_8UC1类型,因为它们各自代表输入图像的单个通道? -
@zindarod 是的,我想念那个,但是我在我的电脑上试过了,我没有收到错误,由于 CV_8UC1 vs CV_8UC3,我得到了三分之一的图像
标签: c++ opencv image-processing colors