模板匹配是一种在图像中定位目标的方法,通过把输入图像在实际图像上逐像素点滑动,计算特征相似性,以此来判断当前滑块图像所在位置是目标图像的概率

在Opencv中,模板匹配定义了6种相似性对比方式:

CV_TM_SQDIFF 平方差匹配法:计算图像像素间的距离之和,最好的匹配是0,值越大,是目标的概率就越低。

    CV_TM_CCORR 相关匹配法:一种乘法操作;数值从小到大,匹配概率越来越高。

    CV_TM_CCOEFF 相关系数匹配法:从-1到1,匹配概率越来越高。

    CV_TM_SQDIFF_NORMED 归一化平方差匹配

    CV_TM_CCORR_NORMED 归一化相关匹配

    CV_TM_CCOEFF_NORMED 归一化相关系数匹配

视频文件中移动物体的跟踪,本质上还是图像上目标跟踪,可以使用模板匹配方法,实现简单的匹配跟踪效果,只不过模板匹配要逐像素移动去匹配目标图像,计算量大,实时性差。

以下代码实现基于模板匹配的目标跟踪。通过鼠标单击在视频上画出矩形,定义需要跟踪的目标,在匹配到目标的时候,用目标图像刷新输入图像:

#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"
#include<iostream> using namespace cv;
using namespace std; Mat image; //视频流
Mat imageCopy; //绘制矩形框时用来拷贝原图的图像
Mat rectImage; //子图像
bool leftButtonDownFlag=false; //左键单击后视频暂停播放的标志位
Point originalPoint; //矩形框起点
Point processPoint; //矩形框终点 int resultRows; //模板匹配result的行
int resultcols; //模板匹配result的列
Mat ImageResult; //模板匹配result
double minValue; //模板匹配result最小值
double maxValude; //模板匹配result最大值
Point minPoint; //模板匹配result最小值位置
Point maxPoint; //模板匹配result最大值位置
int frameCount=0; //帧数统计 void onMouse(int event,int x,int y,int flags ,void* ustc); //鼠标回调函数 int main(int argc,char*argv[])
{
VideoCapture video(argv[1]);
double fps=video.get(CV_CAP_PROP_FPS); //获取视频帧率
double pauseTime=1000/fps; //两幅画面中间间隔
namedWindow("Man",0);
setMouseCallback("Man",onMouse);
while(true)
{
if(!leftButtonDownFlag) //鼠标左键按下绘制矩形时,视频暂停播放
{
video>>image;
frameCount++; //帧数
}
if(!image.data||waitKey(pauseTime+30)==27) //图像为空或Esc键按下退出播放
{
break;
}
if(rectImage.data)
{
ImageResult=Mat::zeros(resultRows,resultcols,CV_32FC1);
matchTemplate(image,rectImage,ImageResult,CV_TM_SQDIFF); //模板匹配
minMaxLoc(ImageResult,&minValue,&maxValude,&minPoint,&maxPoint,Mat()); //最小值最大值获取
rectangle(image,minPoint,Point(minPoint.x+rectImage.cols,minPoint.y+rectImage.rows),Scalar(0,0,255),2);
//更新当前模板匹配的模板
Mat resultImage=image(Rect(minPoint,Point(minPoint.x+rectImage.cols,minPoint.y+rectImage.rows)));
rectImage=resultImage.clone();
//当前帧数输出到视频流
stringstream ss;
ss<<frameCount;
string h="Current frame is: ";
string fff=h+ss.str();
putText(image,fff,Point(50,60),CV_FONT_HERSHEY_COMPLEX_SMALL,2,Scalar(0,0,255),2);
}
imshow("Man",image);
}
return 0;
} //*******************************************************************//
//鼠标回调函数
void onMouse(int event,int x,int y,int flags,void *ustc)
{
if(event==CV_EVENT_LBUTTONDOWN)
{
leftButtonDownFlag=true; //标志位
originalPoint=Point(x,y); //设置左键按下点的矩形起点
processPoint=originalPoint;
}
if(event==CV_EVENT_MOUSEMOVE&&leftButtonDownFlag)
{
imageCopy=image.clone();
processPoint=Point(x,y);
if(originalPoint!=processPoint)
{
//在复制的图像上绘制矩形
rectangle(imageCopy,originalPoint,processPoint,Scalar(0,0,255),2);
}
imshow("Man",imageCopy);
}
if(event==CV_EVENT_LBUTTONUP)
{
leftButtonDownFlag=false;
Mat subImage=image(Rect(originalPoint,processPoint)); //子图像
rectImage=subImage.clone();
resultRows=image.rows-rectImage.rows+1;
resultcols=image.cols-rectImage.rows+1;
imshow("Sub Image",rectImage);
}
}

框选出的跟踪目标:

跟踪效果:

在目标特征变化不是特别快的情况下,跟踪效果还可以,同时也存在两个问题:

1. 模板匹配的速度很慢:原始视频图像大小是1920*1080的彩色RGB图像,直接拿来目标匹配,在我的机器上消耗时间大约为1s,根本谈不上实时性。优化方向可以考虑原始图像和输入图像都做金字塔缩放,速度提升应该很明显。

2. 存在跟踪漂移:随时更新跟踪目标这种在线跟踪方法,很容易导致跟踪漂移问题,特别是在目标本身的特征变化较大的情况下,严重的还有可能完全跟丢目标,并且永久丢失对目标的跟踪。优化方向可以考虑对历史上检测出的目标图像采用累积权重法生成下一个输入图像。另一个针对完全跟丢的情况,可以对目标匹配的概率设置一个阈值,小于阈值的,可能检测到的是一个跟目标差异很大的物体,不对输入图像做更新。

使用Opencv中matchTemplate模板匹配方法跟踪移动目标的更多相关文章

  1. OpenCV中的模板匹配/Filter2d

    1.模板匹配 模板匹配是在图像中寻找目标的方法之一.Come On, Boy.我们一起来看看模板匹配到底是怎么回事. 参考链接:http://www.opencv.org.cn/opencvdoc/2 ...

  2. 基于HALCON的模板匹配方法总结

    注:很抱歉,忘记从转载链接了,作者莫怪.... 基于HALCON的模板匹配方法总结 很早就想总结一下前段时间学习HALCON的心得,但由于其他的事情总是抽不出时间.去年有过一段时间的集中学习,做了许多 ...

  3. halcon三种模板匹配方法

    halcon有三种模板匹配方法:即Component-Based.Gray-Value-Based.Shaped_based,分别是基于组件(或成分.元素)的匹配,基于灰度值的匹配和基于形状的匹配,此 ...

  4. Opencv中直线的表示方法

                               [blog算法原理]Opencv中直线的表示方法  一.问题的提出:​          在实际项目编写过程中,需要对直线(Line)进行特定的处 ...

  5. 【计算机视觉】OpenCV篇(10) - 模式识别中的模板匹配

    什么是模式识别? 它指的是,对表征事物或现象的各种形式的信息进行处理和分析,从而达到对事物或现象进行描述.辨认.分类和解释的目的. 我们之所以可以很快辨别猫是猫.O不是0,就是因为在我们大脑中已经给猫 ...

  6. Halcon中模板匹配方法的总结归纳

    基于组件的模板匹配: 应用场合:组件匹配是形状匹配的扩展,但不支持大小缩放匹配,一般用于多个对象(工件)定位的场合. 算法步骤: 1.获取组件模型里的初始控件 gen_initial_componen ...

  7. 使用OpenCV&&C++进行模板匹配.

    一:课程介绍 1.1:学习目标 学会用imread载入图像,和imshow输出图像. 用nameWindow创建窗口,用createTrackbar加入滚动条和其回调函数的写法. 熟悉OpenCV函数 ...

  8. 使用Python+OpenCV进行图像模板匹配(Match Template)

    2017年9月22日 BY 蓝鲸 LEAVE A COMMENT 本篇文章介绍使用Python和OpenCV对图像进行模板匹配和识别.模板匹配是在图像中寻找和识别模板的一种简单的方法.以下是具体的步骤 ...

  9. 转载:基于HALCON的模板匹配方法总结

    转载链接:     http://blog.csdn.net/b108074013/article/details/37657801 很早就想总结一下前段时间学习HALCON的心得,但由于其他的事情总 ...

随机推荐

  1. js--27门面模式

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  2. MYSQL存储过程中 使用变量 做表名--转

    原文地址:http://blog.csdn.net/business122/article/details/7528859 今天写一个对数据库做快照的存储过程,用到了动态表名,突然发现MYSQL不支持 ...

  3. android hander

    http://www.cnblogs.com/plokmju/p/android_Handler.html 前言 Android的消息传递机制是另外一种形式的“事件处理”,这种机制主要是为了解决And ...

  4. golang pipe

    ===============golang pipe============== package main import ( "fmt" "io" ) func ...

  5. 使用Vue脚手架(vue-cli)从零搭建一个vue项目(包含vue项目结构展示)

    注:在搭建项目之前,请先安装一些全局的工具(如:node,vue-cli等) node安装:去node官网(https://nodejs.org/en/)下载并安装node即可,安装node以后就可以 ...

  6. [React] Call setState with null to Avoid Triggering an Update in React 16

    Sometimes it’s desired to decide within an updater function if an update to re-render should be trig ...

  7. ORACLE10g R2【RAC+ASM→单实例FS】

    ORACLE10g R2[RAC+ASM→单实例FS] 10g R2 RAC+ASMà单实例FS的DG,建议禁用OMF. 本演示案例所用环境:   primary standby OS Hostnam ...

  8. ajax的get请求与编码

    window.onload = function(){ document.getElementById('username').onblur = function(){ var name = docu ...

  9. cocos2d-x中六种持续性动作

    持续性动作: (一) 位置变化动作 Move by to Jump by to (二) 属性变化动作 Scale by to Rotate by to Fade in out to Tint to b ...

  10. 微软重生:4年市值U型大逆转,超越谷歌重返巅峰!

    划重点: 智东西(公众号:zhidxcom)文 | 寓扬 在最近的两个星期里,微软和谷歌正在进行一场市值大比拼,双方在7700亿美元上下厮杀正紧,抢夺着全球市值第三大公司的宝座(前两位为市值超过900 ...