【问题标题】:OpenCV - Using ROI after a cvtColorOpenCV - 在 cvtColor 之后使用 ROI
【发布时间】:2013-11-20 05:16:47
【问题描述】:

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

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

【问题讨论】:

    标签: c++ image opencv colors threshold


    【解决方案1】:

    主要问题是,您不能拥有部分为 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
    

    【讨论】:

    • 这行得通...我没有将 cvtColor() 视为“复印机”,非常感谢!
    猜你喜欢
    • 2011-12-18
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多