基于模板的物体跟踪

  • 模板匹配
  • 核心函数
  • 完整代码
  • 效果展示
  • 多目标检测

模板匹配

调用函数:

cv.matchTemplate(image, templ, method, result=None, mask=None)

image: 输入图片1,图中包含模板的完整图片;
templ: 输入图片2,模板图片。size必须小于image;
method:采用何种匹配方式;
result:比较结果的映射图像,必须是单通道32位浮点格式,一般不设置;
mask: 搜索模板的mask(不知道咋翻译会好一点),它必须与templ具有相同的类型和大小。 默认情况下未设置。

参数 method:
CV_TM_SQDIFF 平方差匹配法:该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大。
CV_TM_CCORR 相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。
CV_TM_CCOEFF 相关系数匹配法:1表示完美的匹配;-1表示最差的匹配。
CV_TM_SQDIFF_NORMED 归一化平方差匹配法
CV_TM_CCORR_NORMED 归一化相关匹配法
CV_TM_CCOEFF_NORMED 归一化相关系数匹配法,一般情况下用的最多吧

需要注意的是不同的方式返回的参数大小代表的意义不同

核心函数

def template_demo(tpl, target, method = cv2.TM_CCORR_NORMED):th, tw = tpl.shape[:2]# 取高宽,不取通道 模板高宽result = cv2.matchTemplate(target, tpl, method)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result) # 寻找最小值,最大值。最小值位置,最大值位置tl = max_locbr = (tl[0]+tw, tl[1]+th)print(max_val, tl, br)if max_val < 0.45:lost = 1else:lost = 0return tl, br, lost

输入的参数意义:
tpl:完整的图片;
target: 模板;
method: 默认的是cv2.TM_CCORR_NORMED;

输出的参数意义:
tl: 左上角坐标;
br:右下角坐标;
lost:目标是否丢失在视野,1代表丢失;

完整代码

大致的原理图如下图所示,具体的思路都在代码里。

import cv2 as cv2
import numpy as np
from subprocess import calldef template_demo(tpl, target, method = cv2.TM_CCORR_NORMED):th, tw = tpl.shape[:2]# 取高宽,不取通道 模板高宽result = cv2.matchTemplate(target, tpl, method)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result) # 寻找最小值,最大值。最小值位置,最大值位置tl = max_locbr = (tl[0]+tw, tl[1]+th)print(max_val, tl, br)if max_val < 0.45:lost = 1else:lost = 0return tl, br, lostif __name__ == '__main__':print("--------- Python OpenCV Tutorial ---------")cap = cv2.VideoCapture('person.mp4')ret, frame = cap.read()print(frame.shape)lam = 1fourcc = cv2.VideoWriter_fourcc(*'XVID')  # 保存视频的编码out = cv2.VideoWriter('person_output.avi',fourcc, 20.0, (frame.shape[1], frame.shape[0]))gROI = cv2.selectROI("ROI frame", frame, False) # 用鼠标设置要跟踪的目标ROI = frame[gROI[1]: gROI[1]+gROI[3], gROI[0]:gROI[0]+gROI[2], :] # 截取相关的区域area = [0, frame.shape[1], 0, frame.shape[0]] # area代表着被匹配的图片在完整图片中的区域while True:ret, frame = cap.read()if ret:frame1 = frame[area[2]:area[3], area[0]:area[1], :] # 为了增加稳定性,截取模板周围的图片当做被匹配的图片,不会跑到很远的地方tl, br, lost = template_demo(ROI, frame1, method=cv2.TM_CCOEFF_NORMED)if lost==1: # 如果目标丢失,则加大搜索范围,正常范围是模板的4倍面积,丢失的话就是16倍面积lam = 2else:lam = 1# ROI = frame1[tl[1]:br[1], tl[0]:br[0], :] # 一开始是想根据检测的结果更新模板,但是程序运行过程中,会有误差的累积,会越来越大,导致检测失败,目前还没有很好地方法。# cv2.imshow('ROI', ROI)result = cv2.rectangle(frame, (area[0]+tl[0], area[2]+tl[1]), (br[0]+area[0], br[1]+area[2]), (0, 0, 255), 2) # 在完整图片上框选cv2.imshow('result', result) # 随着检测的数据,更新area的参数area[0] = (tl[0] + br[0]) // 2 - lam * (br[0] - tl[0]) + area[0]area[1] = (tl[0] + br[0]) // 2 + lam * (br[0] - tl[0]) + area[0]area[2] = (tl[1] + br[1]) // 2 - lam * (br[1] - tl[1]) + area[2]area[3] = (tl[1] + br[1]) // 2 + lam * (br[1] - tl[1]) + area[2]# area不能超出完整图片的范围area[0] = 0 if area[0] < 0 else area[0]area[1] = frame.shape[1] if area[1] > frame.shape[1] else area[1]area[2] = 0 if area[2] < 0 else area[2]area[3] = frame.shape[0] if area[3] > frame.shape[0] else area[3]out.write(result) # 检测结果存储成视频cv2.waitKey(18)else: # 视频终止就退出breakif cv2.waitKey(1) & 0xFF == ord('q'):break# 结束后的处理cap.release()cv2.destroyAllWindows()# 因为opencv只能输出avi格式的视频 但是视频占用内存较大,所以通过ffmpeg改成mp4格式,可以通过sudo apt-get install ffmpeg安装command = "ffmpeg -i person_output.avi person_output.mp4"call(command.split())

效果展示


对于这种变化只有还是原来的形状的球来说,检测算法的效果很好,但是对于一些跑动的物体,特别是相似的物体而言,检测算法就可能会出问题。
但是值得注意的是,它只会在模板的周围进行检测,不会跳的特别远。

多目标检测

在此基础上就行了改进,参看另一博客:多目标检测

基于opencv模板匹配的单目标跟踪相关推荐

  1. 基于特征点匹配的自适应目标跟踪算法

    基于特征点匹配的自适应目标跟踪算法 2016-01-29 13:11 摘 要:由于实际场景复杂多变,目标在运动过程中往往会出现形变.遮挡等问题,增加了跟踪的难度.为了解决上述问题,提出一种基于特征点匹 ...

  2. python 粒子滤波目标追踪_Python实现基于相关滤波的单目标跟踪算法

    最近在阅读一些单目标跟踪的算法论文,主要看了一系列基于相关滤波的算法,尝试着用python实现了其中一些比较经典的算法,地址在https://github.com/wwdguu/pyCFTracker ...

  3. 基于嵌入式设备的 单目标跟踪算法

    基于嵌入式设备的单目标跟踪实现 最近基于嵌入式设备(Khadas Vim3)做了一套单目标跟踪算法,跟踪效率可以做到每秒25帧左右. 算法运行耗时记录 time is:37.6241 ms time ...

  4. 视觉单目标跟踪任务概述

      视觉目标跟踪的主要目的是:模仿生理视觉系统的运动感知功能,通过对摄像头捕获到的图像序列进行分析,计算出运动目标在每一帧图像中的位置:然后,根据运动目标相关的特征值,将图像序列中连续帧的同一运动目标 ...

  5. CVPR 2022 | PTTR: 基于Transformer的三维点云目标跟踪

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨罗志鹏 来源丨商汤学术 导读 在CVPR 2022上,商汤研究院团队提出了基于Transform ...

  6. SSD + SORT 实现单目标跟踪

    前言 这是我的本科毕设主题,导师对我论文工作的肯定让我鼓足勇气回首这一年来的手忙脚乱和努力收获,使得我的第一篇博客没有成为最后一篇. 在我看来,我的本科专业与计算机视觉领域没有任何关系,没有编程和数学 ...

  7. 图像匹配与OpenCV模板匹配

    介绍 (Introduction) As a data scientist at VATBox, I've mainly worked on projects which at their core ...

  8. 单目标跟踪——个人笔记

    单目标跟踪--个人笔记 以<Handcrafted and Deep Trackers: A Review of Recent ObjectTracking Approaches>为主线看 ...

  9. 单目标跟踪SiamMask:特定目标车辆追踪 part2

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) CNN:RCNN.SPPNet.Fast RCNN.Faste ...

最新文章

  1. 改善OpenStack上DHCP的性能 【已翻译100%】
  2. Gitflow工作流程
  3. socket阻塞和非阻塞的区别
  4. Loj#3077-「2019 集训队互测 Day 4」绝目编诗【结论,虚树,鸽笼原理】
  5. MaxCompute 存储设计
  6. 【IDEA】idea 运行测试类报错 Failed to resolve org.junit.platform:junit-platform-launcher:1.5.2
  7. mysql菜鸟教程面向对象_第一节--面向对象编程
  8. windows ce6.0系统 支持双网卡吗_MacBook双系统不求人,自己来
  9. 关于EasyUI中DataGrid控件的一些使用方法总结
  10. RubyOnRails 小小引导(上)
  11. matlab 此上下文中不允许出现函数定义
  12. Flink中水位线/Periodic周期水印/Punctuated每个事件水印实现原理/ PunctuatedWatermarks/PeriodicWatermarks
  13. 计算机大学生三好学生申请书,大学生三好学生申请书
  14. Google Analytics Service account 认证指南
  15. 字典破解密码实验(Python3)
  16. 寻求泰国居留权的美国投资者数量大增
  17. 一招教你用Kettle整合大数据和Hive,HBase的环境!
  18. python绘制对数函数_python绘制对数函数
  19. 手机号号段,正则,校验
  20. 尚硅谷JavaScript教程笔记

热门文章

  1. 单片机 OLED 镜像 翻转 显示
  2. 京东搭建“千万级消息推送架构”的演进之路
  3. java基于ssm开发的服装经销系统服装进销销售系统
  4. 基于Video4Linux的视频采集模块开发
  5. vue + echarts 多条折线图
  6. linux下 centos ngnix mono xsp 运行 asp、aspx
  7. 易康_最佳分割尺度的选择——ESP2工具的使用
  8. linux在filesystem应用层修改uboot环境变量(fw_setenv工具)
  9. Python数据采集
  10. python爬虫怎么登录_Python爬虫基础-模拟登陆