opencv计算机视觉--模板匹配&物体跟踪

一、模板匹配

cv2.matchTemplate(image, templ, method)

image:待搜索图像

templ:模板图像

method:计算匹配程度的方法:

TM_SQDIFF平方差匹配法:该方法采用平方差来进行匹配;匹配越好,值越小;匹配越差,值越大。

TM_CCORR相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。

TM_CCOEFF相关系数匹配法:数值越大表明匹配程度越好。

TM_SQDIFF_NORMED归一化平方差匹配法,匹配越好,值越小;匹配越差,值越大。

TM_CCORR_NORMED归一化相关匹配法,数值越大表明匹配程度越好。

TM_CCOEFF_NORMED 归一化相关系数匹配法,数值越大表明匹配程度越好。

相关代码
python 复制代码
import cv2

# 读取图像
kele = cv2.imread('kele.png')   
kele=cv2.resize(kele,dsize=None,fx=1.5,fy=1.5)
tubiao = cv2.imread('tubiao.png') 
tubiao=cv2.resize(tubiao,dsize=None,fx=1.5,fy=1.5)
cv2.imshow('kele', kele) 
cv2.waitKey(0)
cv2.imshow('tubiao', tubiao)  
cv2.waitKey(0)
h, w = tubiao.shape[:2]  # 获取模板图像的高度和宽度

# 使用模板匹配方法
res = cv2.matchTemplate(kele, tubiao, cv2.TM_CCOEFF_NORMED)

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
# min_val:最小匹配值
# max_val:最大匹配值(最匹配的位置)
# min_loc:最小匹配值的位置坐标
# max_loc:最大匹配值的位置坐标(最佳匹配位置)

top_left = max_loc  
bottom_right = (top_left[0] + w, top_left[1] + h)  

kele_tubiao = cv2.rectangle(kele, top_left, bottom_right, (0, 255, 0), 2)
cv2.imshow('kele_tubiao', kele_tubiao)
cv2.waitKey(0)
cv2.destroyAllWindows()

注:模板的大小,要和图形中的所对应模板大小相同

二、物体跟踪

1、概念

物体跟踪是计算机视觉中的一个重要任务,指在视频序列中持续定位和追踪特定目标对象的位置。它不同于物体检测(每帧独立检测),跟踪需要维护目标的身份信息,在连续的帧中跟随同一个目标。

2、实际运用
1. 创建跟踪器
python 复制代码
tracker = cv2.TrackerCSRT_create()
  • cv2.TrackerCSRT_create(): 创建 CSRT 跟踪器

  • OpenCV 提供了多种跟踪算法:

    • TrackerCSRT_create(): 高精度,速度较慢

    • TrackerKCF_create(): 平衡精度和速度

    • TrackerMOSSE_create(): 速度最快,精度较低

    • TrackerMIL_create(): 中等性能

2. 选择目标区域
python 复制代码
roi = cv2.selectROI(windowName='Tracking', img=frame, showCrosshair=False)
  • cv2.selectROI(): 让用户在图像上选择矩形区域

  • 参数:

    • windowName: 窗口名称

    • img: 要选择ROI的图像

    • showCrosshair: 是否显示十字准线

  • 返回值:(x, y, width, height) 元组

3. 初始化跟踪器
python 复制代码
tracker.init(frame, roi)
  • tracker.init(): 用第一帧和初始边界框初始化跟踪器

  • 参数:

    • frame: 第一帧图像

    • roi: 初始边界框

4. 更新跟踪器
python 复制代码
success, box = tracker.update(frame)
  • tracker.update(): 在后续帧中更新跟踪器

  • 参数:当前帧图像

  • 返回值:

    • success: 布尔值,跟踪是否成功

    • box: 跟踪到的边界框 (x, y, width, height)

5. 绘制跟踪结果
python 复制代码
cv2.rectangle(frame, pt1=(x, y), pt2=(x + w, y + h), color=(0, 255, 0), thickness=2)
  • 在跟踪到的位置上绘制绿色矩形框
完整代码
python 复制代码
import cv2
# 创建一个CSRT跟踪器实例
tracker = cv2.TrackerCSRT_create()
# 跟踪标志,默认为False
tracking = False
# 打开默认摄像头(通常编号为0)
cap = cv2.VideoCapture(0)
while True:
    # 从摄像头读取一帧图像
    ret, frame = cap.read()
    # 如果没有正确读取到图像,则退出循环
    if not ret:
        break
    # 检查是否有按键被按下,如果是'a'键,则设置跟踪标志为True,并选择ROI
    if cv2.waitKey(1) == ord('s'):
        tracking = True
        # 让用户在当前帧中选择一个矩形区域作为要跟踪的对象
        roi = cv2.selectROI(windowName='Tracking', img=frame, showCrosshair=False)  # 是否显示十字线
        # 初始化跟踪器,传入当前帧和选定的ROI
        tracker.init(frame, roi)
    # 如果跟踪标志为True,则更新跟踪器
    if tracking:
        success, box = tracker.update(frame)
        # 如果跟踪成功,获取对象的位置
        if success:
            x, y, w, h = [int(v) for v in box]  # 确保所有坐标都是整数
            # 在frame上绘制矩形框以显示跟踪结果
            cv2.rectangle(frame, pt1=(x, y), pt2=(x + w, y + h), color=(0, 255, 0), thickness=2)
    # 显示处理后的帧
    cv2.imshow('Tracking',frame)
    # 检查是否按下ESC键(ASCII码27),如果按下则退出循环
    if cv2.waitKey(1) == 27:
        break
# 释放摄像头资源
cap.release()
# 关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()
相关推荐
字节跳动数据库3 小时前
火山引擎 Milvus 发布官方 CLI + Skill ,终端与对话双通道掌控向量数据库
数据库·人工智能
颜淡慕潇3 小时前
鸿蒙 PC的 vcpkg 交叉编译库在x86_64宿主环境下的AI自动化验证方案
人工智能·自动化·harmonyos
战族狼魂3 小时前
MetaPrompt编译器核心逻辑拆解
开发语言·人工智能·python
lunzi_08263 小时前
【学习笔记】《Python编程 从入门到实践》第5章:if语句、条件测试与列表处理实战
笔记·python·学习
硅谷秋水3 小时前
Qwen-VLA:跨任务、环境与机器人形态的视觉-语言-动作统一建模
人工智能·深度学习·算法·计算机视觉·语言模型·机器人
sunshineine3 小时前
FreeCAD
python
向宇it3 小时前
【AI视频】生成AI短剧、漫剧
人工智能·ai·音视频·动画·ai视频·短剧
金融RPA机器人丨实在智能3 小时前
选择Agent平台如何避免“厂商锁定”?深度解析企业级AI智能体架构解耦与落地实践
人工智能·ai·架构
dinl_vin3 小时前
Python 并发编程实战:多线程、协程与多进程全解析
开发语言·人工智能·python
码农小白AI3 小时前
代餐食品营养管控升级,报告数据差错或阻断上市 ——IACheck 助力 AI 报告审核精准锁定成分核算问题
人工智能