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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:57:47