OpenCV - 在cvtColor之后使用ROI

OpenCV - Using ROI after a cvtColor

本文关键字:ROI 之后 cvtColor OpenCV      更新时间:2023-10-16

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

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 更改回 BGR 颜色空间:

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