python-3.x - 使用 Python (3.7) 在 OpenCV (4.2.0) 中检测矩形,
问题描述
我正在做一个个人项目,我检测矩形(所有相同的尺寸),然后将这些矩形以相同的顺序(从上到下)放在一个列表中,然后使用一些函数处理每个矩形内的信息。下面是我的测试图像。
我已经设法检测到感兴趣的矩形,但是我不断得到其他我不想要的矩形。如您所见,我只希望将带有信息 (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()
解决方案
Contour 中有一个功能cv2.contourArea
,您的轮廓尺寸是这样输入的cv2.contourArea(contours)
。你可以使用条件,
if cv2.contourArea(contours)>#Rectangle area
通过使用它,您的问题将得到解决
推荐阅读
- javascript - 用户更改页面时使用 XHR/Ajax 上传文件
- c++ - 通过 const 引用传递后使用 Eigen::Map 发生错误
- java - 如何压缩我的 jar 文件
- mysql - 如何使用 CodeIngiter 将连接表查询结果调整为所需的 JSON 格式
- python - 如何使用python从图表中获取实际数据点?
- bash - 将 URL 变量传递给“打开”命令时出现双斜杠问题
- c# - 无法在 IIS 上发布 Asp.Net Core 应用程序
- mysql - MySQL HAVING 给了我不同的结果
- c# - 带有密码迭代功能的 AES CBC 端口从 C# 到 Node
- video - FFmpeg 在视频顶部添加标题,如模因