Python 3.x 使用Python(3.7)检测OpenCV(4.2.0)中的矩形,

Python 3.x 使用Python(3.7)检测OpenCV(4.2.0)中的矩形,,python-3.x,opencv,opencv-contour,Python 3.x,Opencv,Opencv Contour,我正在做一个个人项目,在这个项目中,我检测矩形(所有尺寸都相同),然后将这些矩形按相同的顺序(上下)放在列表中,然后使用一些函数处理每个矩形中的信息。下面是我的测试图像 我已经成功地检测到了感兴趣的矩形,但是我不断地得到我不想要的其他矩形。正如你所看到的,我只想把包含信息(6,9,3)的三个矩形放入一个列表中 我的代码 import cv2 width=700 height=700 y1=0 y2=700 x1=500 x2=700 img=cv2.imread('test.jpg') #

我正在做一个个人项目,在这个项目中,我检测矩形(所有尺寸都相同),然后将这些矩形按相同的顺序(上下)放在列表中,然后使用一些函数处理每个矩形中的信息。下面是我的测试图像

我已经成功地检测到了感兴趣的矩形,但是我不断地得到我不想要的其他矩形。正如你所看到的,我只想把包含信息(6,9,3)的三个矩形放入一个列表中

我的代码

import cv2

width=700
height=700
y1=0
y2=700
x1=500
x2=700
img=cv2.imread('test.jpg') #read image
img=cv2.resize(img,(width,height)) #resize image
roi = img[y1:y2, x1:x2] #region of interest i.e where the rectangles will be
gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY) #convert roi into gray
Blur=cv2.GaussianBlur(gray,(5,5),1) #apply blur to roi
Canny=cv2.Canny(Blur,10,50) #apply canny to roi

#Find my contours
contours =cv2.findContours(Canny,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)[0]

#Loop through my contours to find rectangles and put them in a list, so i can view them individually later.
cntrRect = []
for i in contours:
        epsilon = 0.05*cv2.arcLength(i,True)
        approx = cv2.approxPolyDP(i,epsilon,True)
        if len(approx) == 4:
            cv2.drawContours(roi,cntrRect,-1,(0,255,0),2)
            cv2.imshow('Roi Rect ONLY',roi)
            cntrRect.append(approx)



cv2.waitKey(0)
cv2.destroyAllWindows()

轮廓中有一个名为
cv2.contourArea
的功能,您的轮廓尺寸是这样输入的
cv2.contourArea(contours)
。你可以使用这个条件

if cv2.contourArea(contours)>#Rectangle area

通过使用此选项,您的问题将得到解决

我建议您获得轮廓的边界矩形,然后按面积降序对矩形进行排序。默认情况下裁剪第一个矩形,然后循环遍历剩余的矩形,如果它们的面积大于等于第一个矩形面积的90%,则进行裁剪。这将确保您有较大的矩形,而忽略较小的矩形。

我使用了该函数,但是我得到了4个较大的矩形,而不是3个。@AlanJones您提供的#矩形区域是什么?是否使用
关键字或任何其他方式将其添加到您的
if语句中?我正在遍历所有区域,以查看每个轮廓的面积。这就是为什么我看到的是4个大区域,而不是3个(如预期的那样)。