Select cv::Mat 的一部分基于另一个 Mat 的非零像素?

Select part of a cv::Mat based on non-zero pixels of another Mat?

我正在尝试根据另一个垫子更新垫子的一部分。例如,我想 select imgmask 中不为零的部分,并向其添加一个常量值。当我尝试这个时:

Mat mask = imread("some grayscale image with a white area in a black background", IMREAD_GRAYSCALE);
Mat img = Mat::zeros(mask.rows, mask.cols, CV_8UC1);
Mat bnry, locations;
threshold(mask, bnry, 100, 255, THRESH_BINARY);
findNonZero(bnry, locations);
img(locations) += 5;

我收到这个错误:

Error: Assertion failed ((int)ranges.size() == d)

imgmask 大小相同。

如何 select 一个图像区域基于另一个图像(蒙版)?

很多OpenCV的函数默认都支持掩码,换句话说,你不需要找到非零值,基于那个做求和运算,你只需要使用cv::add函数,在默认支持使用掩码作为参数,

cv::add(img,10,img,mask);  // 10 is an arbitrary constant value

关于您的代码

img(locations) += 5;

据我所知,我们在 OpenCV 中没有这样的重载 operator+ 可供使用。