本帖最后由 lingdon 于 2024-10-1 09:45 编辑
[Python] 纯文本查看 复制代码 import numpy as np
import cv2
import base64
from io import BytesIO
def 识别缺口(self, bg, tp):
'''
bg: 背景图片{B64格式}
tp: 缺口图片{B64格式}
out:输出坐标{int格式}
'''
# 将 BytesIO 对象转换为 numpy 数组
bg_arr = np.frombuffer(BytesIO(base64.b64decode(bg.read())), np.uint8)
tp_arr = np.frombuffer(BytesIO(base64.b64decode(tp.read())), np.uint8)
# 读取背景图片和缺口图片
bg_img = cv2.imdecode(bg_arr, cv2.IMREAD_COLOR) # 背景图片
tp_img = cv2.imdecode(tp_arr, cv2.IMREAD_COLOR) # 缺口图片
bg_edge = cv2.Canny(bg_img, 300, 100)
tp_edge = cv2.Canny(tp_img, 1200, 1000)
# 转换图片格式
bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
# 缺口匹配
res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻找最优匹配
# 绘制方框
th, tw = tp_pic.shape[:2]
tl = max_loc # 左上角点的坐标
br = (tl[0] + tw, tl[1] + th) # 右下角点的坐标
cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 绘制矩形
# # 查看图片
# cv2.imshow("1", tp_pic)
# cv2.waitKey(0)
# 返回缺口的X坐标
return tl[0]
可以微调边缘的参数bg_edge = cv2.Canny(bg_img, 300, 100)
tp_edge = cv2.Canny(tp_img, 1200, 1000)
还有升级版和轨迹我觉得效果差不太多就不放出来了
|