Python图像识别生成四边形外接框 规避拟合目标内部轮廓问题
解决方案
要实现生成轮廓对应的块外接四边形框,只需替换原代码中轮廓多边形拟合的逻辑,直接计算轮廓的外接矩形即可,修改思路和代码如下:
核心修改说明
- 原代码中
cv2.approxPolyDP的作用是对轮廓做多边形逼近,会贴合轮廓的细节边缘,这是导致框线贴合内部轮廓的原因 - 替换为
cv2.boundingRect可直接得到轮廓的轴对齐外接矩形,若需要适配倾斜块的最小旋转外接矩形,可以用cv2.minAreaRect实现
修改后代码
import cv2 import numpy as np # 读取图像 img = cv2.imread("map3.png") imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) _,thresh = cv2.threshold(imgray, 110, 255, cv2.THRESH_BINARY) contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) for contour in contours: area = cv2.contourArea(contour) if area > 500: # 方式1:计算轴对齐外接矩形,返回值为 (左上角x, 左上角y, 宽度w, 高度h) x, y, w, h = cv2.boundingRect(contour) # 绘制矩形框 cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2) # 方式2:如果需要倾斜的最小外接四边形,注释掉方式1,启用以下代码即可 # rect = cv2.minAreaRect(contour) # box = cv2.boxPoints(rect) # box = np.int0(box) # cv2.drawContours(img, [box], 0, (0, 0, 255), 2) cv2.imshow("IMAGE", img) cv2.waitKey(0)
参数调整提示
如果出现框选范围不符合预期的情况,可以调整两个阈值参数:
- 阈值分割的
110参数,适配不同亮度的图像分割效果 - 面积过滤的
500参数,过滤掉不需要的小噪点轮廓
内容的提问来源于stack exchange,提问作者don
相关产品推荐
相关产品推荐

