首页 文章

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

    主要的问题是,你不能有一个图像,部分是3chan / rgb,部分是1chan / grey .

    我的解决方案是,在第一个位置处理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
    

相关问题