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

Posted

技术标签:

【中文标题】C++ 等价于 Python 的带有比较的数组访问 (array[condition] = value)【英文标题】:C++ equivalent of Python's array access with comparison (array[condition] = value) 【发布时间】:2020-01-20 14:15:29 【问题描述】:

我正在关注这个 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 解决方案。

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

【问题讨论】:

你检查this example了吗? 我没有。然而,这需要手动标记您想要分割的区域,即使是粗略的。我会看看我是否可以将其调整为自动。此外,它们似乎执行简单的访问,带有两个 for 循环。我希望这不是唯一的方法。 C++ 中没有对应的 Python 语法。你可以查看std::replace_if(),但我不知道OpenCV是否适用于标准库算法。 好的。感谢您的帮助。 【参考方案1】:

您可以使用 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;

这是一些输入图像:

这是得到的掩码:

这是更新后的图片:

希望有帮助!

【讨论】:

以上是关于C++ 等价于 Python 的带有比较的数组访问 (array[condition] = value)的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ 和 Python 访问数组

PHP 关联数组等价于 Python dict.get()

具有类似于 Python/NumPy 的数组操作的 C++ 库 [关闭]

C++ 对 Python 的扩展——安全的内存访问和内存布局

斯威夫特:C++朋友等价?

如何将 C++ 中的空字符序列转换为 Python 中的等效字符?