如何使用OpenCV仅检测参考图像中出现的黑色矩形
黑色矩形检测优化方案

原有代码仅做了四边轮廓判定,没有筛选颜色、面积、矩形规整度,导致大量误检:
需要识别的目标黑色矩形如下:
修改后可直接运行的代码
import cv2 import numpy as np img = cv2.imread('vision.png') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 阈值分割提取黑色区域,50为灰度阈值,可根据实际图像亮度调整 _, thresh = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY_INV) # 形态学开运算去除小噪点 kernel = np.ones((3,3), np.uint8) thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1) # 提取外轮廓 contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0] cntrRect = [] for cnt in contours: # 过滤面积过小的噪点轮廓,面积阈值可根据图像分辨率调整 area = cv2.contourArea(cnt) if area < 100: continue # 多边形拟合 epsilon = 0.05 * cv2.arcLength(cnt, True) approx = cv2.approxPolyDP(cnt, epsilon, True) # 同时满足:4条边+轮廓面积与外接矩形面积接近(为正规矩形) if len(approx) == 4: x,y,w,h = cv2.boundingRect(approx) if 0.9 < area / (w*h) < 1.1: cntrRect.append(approx) # 统一绘制符合要求的黑色矩形 cv2.drawContours(img, cntrRect, -1, (0,255,0), 2) cv2.imshow('Image Rect ONLY', img) cv2.waitKey(0) cv2.destroyAllWindows()
核心调整点
- 新增阈值分割逻辑:直接筛选黑色区域,替换了原有Canny边缘检测步骤,从根源上过滤浅色无关对象的边缘
- 新增面积过滤规则:排除尺寸过小的噪点轮廓,减少误检
- 新增矩形规整度校验:通过轮廓面积和外接矩形面积的比值,排除不规则的四边轮廓
- 优化绘制逻辑:全部轮廓筛选完成后统一绘制,避免中间过程展示错误结果
内容的提问来源于stack exchange,提问作者user15898019
相关产品推荐
相关产品推荐

