4,269
社区成员




图片中有一个或多个箭头,怎么使用opencv将其检测出来,然后将箭头替换为另外的图形?箭头的形状会有差别(如图片所示,有二种),大家是否有处理过类似的逻辑?没接触过这方面的编程,完全是新手。。。
你好,可以使用模板匹配
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()
注意,箭头检测的结果可能受到很多因素的影响,例如图像的清晰度、箭头的大小和方向等,需要根据实际情况进行调整。
提取红色区域