You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 03:36:01