如何在检测到的Logo周围绘制矩形?OpenCV代码实现求助
解决Logo检测并绘制矩形的方案
你的代码目前有两个关键问题:一是自适应阈值的API用错了(应该用cv2.adaptiveThreshold而非cv2.threshold),二是缺少轮廓检测的步骤——要先找到Logo的轮廓,才能在它周围画矩形。下面是修正后的完整方案:
修正后的代码
import cv2 import matplotlib.pyplot as plt # 1. 读取图像并预处理 img = cv2.imread('9.png') img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 转RGB用于matplotlib显示 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转灰度图 blur = cv2.GaussianBlur(gray, (3, 3), 0) # 灰度图做高斯模糊,避免彩色通道干扰 # 2. 正确生成二值图(自适应阈值) binary = cv2.adaptiveThreshold(blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) # 用INV让Logo区域为白色 # 3. 查找轮廓并筛选目标Logo contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 遍历轮廓,筛选面积符合Logo大小的(可根据实际情况调整阈值) for cnt in contours: area = cv2.contourArea(cnt) if 500 < area < 5000: # 假设Logo面积在这个区间,可自行调整 # 获取轮廓的外接矩形 x, y, w, h = cv2.boundingRect(cnt) # 在RGB图上绘制红色矩形((0,0,255)对应RGB的红色) cv2.rectangle(img_rgb, (x, y), (x+w, y+h), (0, 0, 255), 2) # 4. 显示结果 plt.imshow(img_rgb) plt.axis('off') # 隐藏坐标轴 plt.show()
关键说明
- 预处理阶段:必须用灰度图做模糊和阈值,彩色图会引入不必要的通道干扰,导致二值图效果差。
- 自适应阈值:
cv2.adaptiveThreshold的参数要对应正确,用THRESH_BINARY_INV可以让深色的Logo变成白色区域,更易检测轮廓。 - 轮廓筛选:通过面积过滤掉小噪点和大背景区域,你可以根据自己的Logo实际大小调整
500 < area < 5000这个范围。 - 绘制矩形:
cv2.rectangle的最后一个参数是线条粗细,这里设为2,可按需调整。
内容的提问来源于stack exchange,提问作者Fleep
相关产品推荐
相关产品推荐

