如何用OpenCV和Python检测图像中连接两个图形的箭头
解决方案建议
针对你用Python+OpenCV识别流程图连接箭头及图形关系的问题,可以试试以下步骤:
1. 屏蔽已识别图形区域,减少线条干扰
既然已经能识别矩形、椭圆,先把这些图形区域从原图中"隔离"出来,只保留箭头和连接线条:
- 基于已检测到的矩形、椭圆轮廓,创建mask画布,用
cv2.fillPoly()或cv2.ellipse()把图形区域填充为背景色 - 将原图与mask做差运算,得到仅包含箭头和连接线条的图像,避免图形边框被误判为连接线条
示例代码片段:
import cv2 import numpy as np # 假设已识别得到矩形列表rects(格式:(x,y,w,h))、椭圆列表ellipses(格式:(center, axes, angle)) img = cv2.imread('your_flowchart.png') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) mask = np.zeros_like(gray) # 填充矩形区域 for (x, y, w, h) in rects: cv2.rectangle(mask, (x, y), (x+w, y+h), 255, -1) # 填充椭圆区域 for (center, axes, angle) in ellipses: cv2.ellipse(mask, center, axes, angle, 0, 360, 255, -1) # 得到仅保留箭头的图像 arrow_only = cv2.bitwise_not(cv2.bitwise_and(gray, gray, mask=mask))
2. 检测箭头的直线部分
对处理后的arrow_only图像做针对性线条检测:
- 先通过
cv2.Canny()做边缘检测,再用cv2.HoughLinesP()检测线段,根据场景筛选长度合适的结果
3. 识别箭头头部
箭头头部多为三角形或近似多边形,在arrow_only图像中提取并筛选:
- 用
cv2.findContours()提取轮廓,过滤面积过小的噪点 - 对轮廓做多边形近似(
cv2.approxPolyDP()),筛选出近似为3边形的轮廓,或通过外接矩形的宽高比、角度特征判断是否为箭头头部
4. 关联箭头与图形,建立连接关系
- 提取每条箭头线段的两个端点,计算端点与各矩形/椭圆边界的距离,距离最近的图形即为箭头的连接对象
- 结合箭头头部位置判断指向:头部所在端点为箭头终点,另一端为起点
补充提示
- 若箭头线条较细,可先对
arrow_only做形态学膨胀(cv2.dilate()),增强线条辨识度 - 椭圆边界距离计算可简化为点到其外接矩形的距离(精度足够的场景下)
内容的提问来源于stack exchange,提问作者Alexandre Goossens
相关产品推荐
相关产品推荐

