OpenCV - 在cvtColor之后使用ROI

3

我正在对图像进行椭圆识别,为此我打开了一张简单的图片:

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,显示算法的进度?

1个回答

4
主要问题是,您无法拥有一部分为3通道/RGB,另一部分为1通道/灰度的图像。
我的解决方案是,在第一步中使用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

这很有效...我没有把cvtColor()视为“复制器”,非常感谢! - Michel Feinstein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接