python - C++ 等价于 Python 的带有比较的数组访问 (array[condition] = value)

标签 python c++ opencv

我正在关注这个 OpenCV Watershed 教程,但将其移植到 C++:https://docs.opencv.org/master/d3/db4/tutorial_py_watershed.html

简而言之,在本教程的某些地方,作者将使用类似于以下的操作访问和分配矩阵中的像素:

markers[unknown==255] = 0

或这个

img[markers == -1] = [255,0,0]

我想做的是相当于所说的操作,但是在 C++ 中。感觉很简单,但我就是想不通如何优雅地做到这一点。

对于第一种情况,我可以使用 cv::findNonZero 来解决它。 ,但是对于第二个它变得稍微复杂一些,我想避免使用hacky解决方案。

老实说,这可能已经得到了回答,但我不知道哪些术语会在搜索中提出这个问题,任何指针或帮助将不胜感激。

最佳答案

您可以使用 OpenCV 的 inRange 使用 lower = Upper 边界的方法来获得一个表示要更改的所需像素的掩码,然后在 OpenCV 的 setTo 中使用此掩码方法:

// Read image
cv::Mat img = cv::imread("image.png");

// Mask everything, that's pure blue (#0000FF)
cv::Mat mask;
cv::inRange(img, cv::Scalar(255, 0, 0), cv::Scalar(255, 0, 0), mask);

// Write mask
cv::imwrite("mask.png", mask);

// Update value in mask to red
img.setTo(cv::Scalar(0, 0, 255), mask);
cv::imwrite("image_new.png", img);

return 0;

这是一些输入图像:

Input

这是获得的面具:

Mask

这是更新的图像:

New image

希望有帮助!

关于python - C++ 等价于 Python 的带有比较的数组访问 (array[condition] = value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59825112/

相关文章:

python - Django : ModelForm with OneToOneField

python - 我如何在 Python 中找到下个月的第 n 天?

c++ - C++ 中的构造函数

python - 输入图像大小不为8时如何实现dct?

python - 导入包时会发生什么?

python - 数据帧结构操作

c++ - 一种将派生类型传递给基本成员模板函数的优雅方法?

c++ - 识别应用程序的架构

c++ - 从网络摄像头快速提取帧 : C++ & OpenCV vs. Matlab

opencv - 在 OpenCV 中绘制平面的法向量