简体   繁体   English

如何忽略图像区域进行轮廓检测,OpenCV

[英]How to ignore a image region for contour detection, OpenCV

--Original images for reference--- --原图供参考-- 在此处输入图像描述 original image for reference原图供参考在此处输入图像描述 原始图像

Hello OpenCV pro users!您好 OpenCV 专业用户!

I am working on a use case to detect rectangle contours and extract them for analysis in these kind of images我正在研究一个用例来检测矩形轮廓并提取它们以在此类图像中进行分析

I want to ignore these 1 region (marked in yellow) in the image as it's not needed, how to ignore this region while using the contour detection?我想忽略图像中的这 1 个区域(标记为黄色),因为它不需要,如何在使用轮廓检测时忽略该区域?

Any tips will be helpful, thanks in advance.. :)任何提示都会有所帮助,在此先感谢.. :)

在此处输入图像描述

def getContours(img_name, img, img_color):
    
    FLAG = 200
    _, contours, hierachy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    has_Mask =False
    has_hori_mask = False
    has_vertical_mask = False
    
    coordinates_dict = {}
    
    for cnt in contours:
        area = cv2.contourArea(cnt)
        if area > 1000:
            #cv2.drawContours(imgContour, cnt, -1, (0,0,255), 3)
            peri = cv2.arcLength(cnt, True)
            approx = cv2.approxPolyDP(cnt, 0.02*peri,True)
            if len(approx)==4: # only interested in squares/rectangles
                has_Mask = True
                objCorner = 4
                x, y, w, h = cv2.boundingRect(approx)
                if h>150 and w<40:
                    has_vertical_mask = True
                    cv2.rectangle(img_color, (x,y), (x+w, y+h), (0,0,255), 3)
                    coordinates_dict["vertical"]=y+h
                elif w>150 and h<24:
                    has_hori_mask = True
                    cv2.rectangle(img_color, (x,y), (x+w, y+h), (0,255,0), 3)
                    coordinates_dict["horizontal"]=y+h

    # save the image
    cv2.imwrite(os.path.join(validation_folder, img_name), img_color)

在此处输入图像描述

As your images always have the same margin at the top, you can just exclude this image region in the detection process:由于您的图像在顶部始终具有相同的边距,因此您可以在检测过程中排除此图像区域:

# margin in pixels
top_margin = 85

src = cv2.imread('test.jpg')
src_cropped = src[top_margin:src.shape[0], :]
src_gray = cv2.cvtColor(src_cropped, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(src_gray, 127, 255, cv2.THRESH_BINARY_INV)
im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(src_cropped, contours, -1, (0,0,255), 3)

You can then apply this to the original image to get your bounding boxes in the cropped area for the whole image:然后,您可以将其应用于原始图像,以在整个图像的裁剪区域中获取边界框:

src[top_margin:src.shape[0], :] = src_cropped

You get the following result when drawing all contours:绘制所有轮廓时,您会得到以下结果:

在此处输入图像描述

If you apply this together with your constraints, it should eliminate the unwanted contour in the top.如果将其与约束一起应用,它应该会消除顶部不需要的轮廓。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM