使用OpenCV怎么检测图片中的箭头图标?

Q294275943 2023-02-25 16:18:24

图片中有一个或多个箭头,怎么使用opencv将其检测出来,然后将箭头替换为另外的图形?箭头的形状会有差别(如图片所示,有二种),大家是否有处理过类似的逻辑?没接触过这方面的编程,完全是新手。。。

 

 

 

...全文
37 2 打赏 收藏 举报
写回复
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
CODER8R 03-16
  • 打赏
  • 举报
回复

1. 读取图片并进行灰度化处理。使用OpenCV的cv::imread()函数读取图片,然后使用cv::cvtColor()函数将彩色图像转换为灰度图像。

2. 进行边缘检测。使用OpenCV的cv::Canny()函数进行边缘检测。

3. 进行轮廓检测。使用OpenCV的cv::findContours()函数进行轮廓检测,并使用cv::drawContours()函数将检测到的轮廓绘制出来。

4. 进行箭头判断。对于检测到的轮廓,可以使用OpenCV的cv::minAreaRect()函数计算出轮廓的最小矩形区域,然后根据该区域的长宽比和面积进行判断是否为箭头。箭头通常具有标志性的三角形形状和长方形的尾部,可以根据这些特征进行判断。

以下是示例代码:

import cv2 as cv
import numpy as np

# 读取图片
img = cv.imread("image_with_arrow.png")

# 灰度化处理
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 边缘检测
edges = cv.Canny(gray, 50, 150, apertureSize=3)

# 轮廓检测
contours, hierarchy = cv.findContours(edges, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
cv.drawContours(img, contours, -1, (0, 0, 255), 2)

# 箭头判断
for cnt in contours:
    rect = cv.minAreaRect(cnt)
    area = rect[1][0] * rect[1][1]
    if area > 200 and area < 1000:
        ratio = rect[1][0] / rect[1][1]
        if ratio > 2 and ratio < 4:
            box = cv.boxPoints(rect)
            box = np.int0(box)
            cv.drawContours(img, [box], 0, (0, 255, 0), 2)
            
cv.imshow("Image", img)
cv.waitKey(0)
cv.destroyAllWindows()

注意,箭头检测的结果可能受到很多因素的影响,例如图像的清晰度、箭头的大小和方向等,需要根据实际情况进行调整。

赵4老师 02-28
  • 打赏
  • 举报
回复

提取红色区域

相关推荐
发帖
OpenCV

3772

社区成员

OpenCV相关技术交流专区
语音识别计算机视觉人工智能 技术论坛(原bbs)
社区管理员
  • OpenCV
加入社区
帖子事件
编辑了帖子 (查看)
2023-02-25 18:05
编辑了帖子 (查看)
2023-02-25 16:19
创建了帖子
2023-02-25 16:18
社区公告
暂无公告