opencv - 如何使用轮廓来检测具有 1 个不均匀边的矩形?
问题描述
这是矩形:
我想检测这个的原因是因为我试图检测图像中的交通灯箱。当我查看某些图像的边缘图时,交通灯的下边缘可能会失真或不均匀,这导致我的轮廓算法无法检测到框。
红绿灯:
解决方案
基本上,无论物体的形状如何,您都可以找到物体的轮廓。在你的情况下,我找到最大的轮廓(绿色),然后得到它的边界矩形(红色)。
imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
for i,c in enumerate(contours):
area = cv2.contourArea(c)
#remove small contours and too big contours
if area > 500 and area < 30000:
rect = cv2.boundingRect(c)
cv2.drawContours(img, contours, i ,(0,255,0), 1)
cv2.rectangle(img,(rect[0],rect[1]),(rect[0]+rect[2],rect[1]+rect[3]),(0,0,255),2)
但我认为在现实生活中,你永远不会得到如此高分辨率的红绿灯,因此找到它们可能会更加复杂。我建议在提取轮廓之前使用一些预处理技术,例如 sobelx、threshold、morphologyEx、...。您还需要找到合适的条件,例如比率检查、面积检查……来过滤这些轮廓以获得正确的交通灯。
推荐阅读
- unit-testing - Quarkus kubernetesMockServer 用于应用程序初始化
- java - 让我的 Spring 测试切片扫描单个类而不是整个包
- inheritance - 与继承相关的 F# 编译错误
- typescript - 如何打破 Firestore 上的 querySnapshot?
- javascript - 如何使用 jQuery 在不同列表上分离和重新附加具有不同类的项目?
- ios - 如何在没有 Google 帐户的情况下使用 Firebase App 分发?
- php - php + mysql 查询仅从类函数返回单行(std 类)
- python - AttributeError:“Path3DCollection”对象没有属性“view_init”
- go - 如何从 cgo 获取 ac 变量?
- javascript - 在 shadow dom 中渲染 Google ReCaptcha