Opencv检测边界和ROI掩码

时间:2015-10-12 09:38:34

标签: opencv image-processing

enter image description here

嗨,我已将下面的图片附在黄色边框上。在Opencv中是否有任何算法或(算法序列),我可以通过它检测黄色像素并创建ROI掩码(这将阻挡其外的所有像素)。

1 个答案:

答案 0 :(得分:3)

你可以这样做:

  1. 找到黄色多边形
  2. 填充多边形内部
  3. 仅将多边形内部复制到黑色初始化图像
  4. 找到黄色多边形

    不幸的是,您使用消除锯齿来绘制黄线,因此黄色不是纯黄色,而是由于插值而具有更宽的范围。这也影响最终结果,因为一些非黄色像素将包含在结果图像中。您可以通过不使用抗锯齿来轻松纠正此问题。

    因此,最好的选择是转换HSV空间中的图像(它可以更容易地分割单个颜色),并且只保留纯黄色范围内的值。

    如果您不使用抗锯齿,您甚至不需要转换为HSV,只需保留其值为纯黄色的点。

    填充多边形内部 您可以使用floodFill填充多边形。你需要一个起点。由于我们不知道一个点是否在多边形内部(并且由于多边形不是凸面而使得中心可能不安全),我们可以安全地假设点(0,0),即左上角图像的一角在多边形之外。然后我们可以填充多边形的外部,然后反转结果。

    仅将多边形内部复制到黑色初始化图像

    获得蒙版后,只需使用带有该蒙版的copyTo即可在黑色图像上复制蒙版中非零像素下的内容。

    这里是完整的代码:

    #include <opencv2\opencv.hpp>
    using namespace cv;
    
    int main()
    {
        Mat3b img = imread("path_to_image");
    
        // Convert to HSV color space
        Mat3b hsv;
        cvtColor(img, hsv, COLOR_BGR2HSV);
    
        // Get yellow pixels
        Mat1b polyMask;
        inRange(hsv, Scalar(29, 220, 220), Scalar(31, 255, 255), polyMask);
    
        // Fill outside of polygon
        floodFill(polyMask, Point(0, 0), Scalar(255));
    
        // Invert (inside of polygon filled)
        polyMask = ~polyMask;
    
        // Create a black image
        Mat3b res(img.size(), Vec3b(0,0,0));
    
        // Copy only masked part
        img.copyTo(res, polyMask);
    
        imshow("Result", res);
        waitKey();
    
        return 0;
    }
    

    结果:

    enter image description here

    备注

    请注意,结果图像中几乎有黄色像素。这是由于抗锯齿,如上所述。