c++ - OpenCV - 在 cvtColor 之后使用 ROI

标签 c++ image opencv colors threshold

我正在图像中进行一些椭圆识别,为此我打开了一个简单的图像:

img = imread("M:/Desktop/PsEyeRight.jpg", CV_LOAD_IMAGE_COLOR);

选择 ROI(这是我能看到的在 OpenCV 2.4.6 中设置 ROI 的唯一方法,其中旧库有 cvSetImageROI() 和 cvResetImageROI(),我认为这更简单):

Mat roi(img, Rect(Point(205, 72), Point(419,285)));

用 cvtColor 改变它的颜色空间:

cvtColor(roi, roi, CV_BGR2GRAY); 

应用阈值:

threshold(roi, roi, 150, 255, THRESH_BINARY); 

然后我使用克隆的图像执行 findContours,因为 findContours 修改了函数中传递的图像,然后我将 ROI 更改回 BG​​R 颜色空间:

cvtColor(roi, roi, CV_GRAY2BGR);

并在roi中画出所有找到的椭圆。

当我显示 roi 时,我可以看到一切都 100% 有效,但我期望当我显示原始图像时,它将是原始图像,其中 ROI 为阈值,绘图在其中,但我只是得到原始图像本身,就像什么都没有改变一样。我相信这是因为 cvtColor 正在复制 roi,所以它不再“指向”img。

执行相同处理并在原始图像中显示 ROI 以显示算法进度的最佳方式(或推荐方式)是什么?

最佳答案

主要问题是,您无法获得图像,部分是 3chan/rgb 部分是 1chan/gray。

我的解决方案是,首先处理 roi 的拷贝,然后将其转换回 rgb 并将其粘贴到原始图像中。

img = imread("M:/Desktop/PsEyeRight.jpg", CV_LOAD_IMAGE_COLOR); // original
Mat roi(img, Rect(Point(205, 72), Point(419,285)));
Mat work = roi.clone();
cvtColor(work , work , CV_BGR2GRAY); 
threshold(work , work , 150, 255, THRESH_BINARY); 
// findContours(work,...);
cvtColor(work , roi, CV_GRAY2BGR); //here's the trick

关于c++ - OpenCV - 在 cvtColor 之后使用 ROI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19854941/

相关文章:

c++ - 将派生自 QAbstractListModel 的类提供的 QIcon 绑定(bind)到 QML Image

html - 如何从桌面读取图像并输入到​​ div 标签中?

java - 如何从 Java/Android 的 Arraylist 中保留最好的 500 个关键点?

c++ - Visual Studio生成调试目标.exe文件名不匹配

c++11 move 不生效?

html - 如何将图像制作成链接

c++ - 在 Windows 下为 OpenCV 编译 MinGW 库

ruby - 如何: getThresholdedImage with ruby-opencv

c++ - 在C++中将数组中的所有数字相加

java - 如何将图像向左(或向右)移动?