【问题标题】:How to add 2 Mat pixel values while iterating through pixels using OpenCV?如何在使用 OpenCV 遍历像素时添加 2 个 Mat 像素值?
【发布时间】: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


【解决方案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

【讨论】:

  • 抱歉回复晚了。将类型更改为CV_8UC1 后即可使用。感谢您的额外解释
  • 1次编辑,应该是green(img1.rows, img1.cols, CV_8UC1)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多