检测图像中的填充矩形

时间:2019-02-27 18:52:35

标签: c++ opencv

如何检测图像中的实心矩形?

我需要在图像的右侧获得4个白色(用白色填充)矩形的边界框,而不是在中间带有白色轮廓的大矩形

enter image description here

1 个答案:

答案 0 :(得分:1)

您可以通过在蒙版上绘制轮廓来隔离每个轮廓。然后,您可以在图像上使用该蒙版来计算平均颜色。高平均值表示轮廓线主要包含白色,因此很可能是您想要的轮廓线。

结果:

enter image description here

代码:

    import numpy as np 
    import cv2
    #load the image
    img = cv2.imread("form.png") 
    # create grayscale
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    #Find contours (external only):  
    im, contours, hierarchy = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)  
    #draw contours on original image
    for cnt in contours:
        # disregard small contours cause by logo and noise
        if cv2.contourArea(cnt) > 10000:
            #isolate contour and calculate average pixel value
            mask = np.zeros(gray.shape[:2],np.uint8)
            cv2.drawContours(mask,[cnt],0,255,-1)
            mean_val = cv2.mean(gray,mask = mask)
            # a high value indicates the contour contains mostly white, so draw the contour (I used the boundingRect)
            if mean_val[0] > 200:
                x,y,w,h = cv2.boundingRect(cnt)
                cv2.rectangle(img, (x,y),(x+w,y+h), (0,0,255), thickness=4)
    # show/save image
    cv2.imshow("Image", mask)
    cv2.imwrite("result.jpg", img)

    cv2.waitKey(0)
    cv2.destroyAllWindows()

注意:您也可以将图像加载为灰度图像并跳过创建图像的操作,但是我在这里使用了它,因此可以绘制更明显的红色框。
另外请注意,给出的代码可能无法很好地泛化,但可以说明概念。