文档章节

最简单的目标跟踪(模版匹配)

moki_oschina
 moki_oschina
发布于 2016/11/25 11:17
字数 991
阅读 40
收藏 2

一、概述

       目标跟踪是计算机视觉领域的一个重要分支。研究的人很多,近几年也出现了很多很多的算法。大家看看淋漓满目的paper就知道了。但在这里,我们也聚焦下比较简单的算法,看看它的优势在哪里。毕竟有时候简单就是一种美。

       在这里我们一起来欣赏下“模板匹配”这个简单点的跟踪算法。它的思想很简单,我们把要跟踪的目标保存好,然后在每一帧来临的时候,我们在整个图像中寻找与这个目标最相似的,我们就相信这个就是目标了。那如何判断相似呢?就用到了一些相关性的东西了,这个在我之前的一篇博文里面介绍过,大家可以参考下:

       模板匹配中差值的平方和(SSD)与互相关准则的关系

http://blog.csdn.net/zouxy09/article/details/8549743

       然后为了适应目标的变化,我们就需要随时更新我们要跟踪的目标。换句话来说,在跟踪t帧的时候,也就是在第t帧寻找目标的时候,是与t-1帧中我们找到的目标来进行比较的。这样目标的外观变化就会及时的更新。这个就叫做在线跟踪方法。当然了,这个策略会导致跟踪漂移的问题,这就是近几年很多跟踪算法关注的重要问题之一了。

 

二、代码实现

       我的代码是基于VS2010+ OpenCV2.4.2的。代码可以读入视频,也可以读摄像头,两者的选择只需要在代码中稍微修改即可。对于视频来说,运行会先显示第一帧,然后我们用鼠标框选要跟踪的目标,然后跟踪器开始跟踪每一帧。对摄像头来说,就会一直采集图像,然后我们用鼠标框选要跟踪的目标,接着跟踪器开始跟踪后面的每一帧。具体代码如下:

simpleTracker.cpp

// Object tracking algorithm using matchTemplate
// Author : zouxy
// Date   : 2013-10-28
// HomePage : http://blog.csdn.net/zouxy09
// Email  : zouxy09@qq.com

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

// Global variables
Rect box;
bool drawing_box = false;
bool gotBB = false;

// bounding box mouse callback
void mouseHandler(int event, int x, int y, int flags, void *param){
  switch( event ){
  case CV_EVENT_MOUSEMOVE:
    if (drawing_box){
        box.width = x-box.x;
        box.height = y-box.y;
    }
    break;
  case CV_EVENT_LBUTTONDOWN:
    drawing_box = true;
    box = Rect( x, y, 0, 0 );
    break;
  case CV_EVENT_LBUTTONUP:
    drawing_box = false;
    if( box.width < 0 ){
        box.x += box.width;
        box.width *= -1;
    }
    if( box.height < 0 ){
        box.y += box.height;
        box.height *= -1;
    }
    gotBB = true;
    break;
  }
}


// tracker: get search patches around the last tracking box,
// and find the most similar one
void tracking(Mat frame, Mat &model, Rect &trackBox)
{
	Mat gray;
	cvtColor(frame, gray, CV_RGB2GRAY);

	Rect searchWindow;
	searchWindow.width = trackBox.width * 3;
	searchWindow.height = trackBox.height * 3;
	searchWindow.x = trackBox.x + trackBox.width * 0.5 - searchWindow.width * 0.5;
	searchWindow.y = trackBox.y + trackBox.height * 0.5 - searchWindow.height * 0.5;
	searchWindow &= Rect(0, 0, frame.cols, frame.rows);

	Mat similarity;
	matchTemplate(gray(searchWindow), model, similarity, CV_TM_CCOEFF_NORMED); 

	double mag_r;
	Point point;
	minMaxLoc(similarity, 0, &mag_r, 0, &point);
	trackBox.x = point.x + searchWindow.x;
	trackBox.y = point.y + searchWindow.y;
	model = gray(trackBox);
}

int main(int argc, char * argv[])
{
	VideoCapture capture;
	capture.open("david.mpg");
	bool fromfile = true;
	//Init camera
	if (!capture.isOpened())
	{
		cout << "capture device failed to open!" << endl;
		return -1;
	}
	//Register mouse callback to draw the bounding box
	cvNamedWindow("Tracker", CV_WINDOW_AUTOSIZE);
	cvSetMouseCallback("Tracker", mouseHandler, NULL ); 

	Mat frame, model;
	capture >> frame;
	while(!gotBB)
	{
		if (!fromfile)
			capture >> frame;

		imshow("Tracker", frame);
		if (cvWaitKey(20) == 'q')
			return 1;
	}
	//Remove callback
	cvSetMouseCallback("Tracker", NULL, NULL ); 
	
	Mat gray;
	cvtColor(frame, gray, CV_RGB2GRAY); 
	model = gray(box);

	int frameCount = 0;

	while (1)
	{
		capture >> frame;
		if (frame.empty())
			return -1;
		double t = (double)cvGetTickCount();
		frameCount++;

		// tracking
		tracking(frame, model, box);	

		// show
		stringstream buf;
		buf << frameCount;
		string num = buf.str();
		putText(frame, num, Point(20, 20), FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 0, 255), 3);
		rectangle(frame, box, Scalar(0, 0, 255), 3);
		imshow("Tracker", frame);


		t = (double)cvGetTickCount() - t;
		cout << "cost time: " << t / ((double)cvGetTickFrequency()*1000.) << endl;

		if ( cvWaitKey(1) == 27 )
			break;
	}

	return 0;
}

三、结果

       我们对在目标跟踪领域一个benchmark的视频-david来测试下代码的效果。如下图所以,每帧的帧号在右上角所示。这个视频的光照变化是挺大的,但是简单的模板匹配方法还是可以挺有效的进行跟踪的,而且速度很快,在这个视频中,只花费了1ms左右(耗时的长度与目标框的大小和机器的性能有关)。

 

 

 

 

 

 

 

 

 

 

 

本文转载自:http://www.cnblogs.com/ywsoftware/p/4434306.html

共有 人打赏支持
moki_oschina
粉丝 25
博文 191
码字总数 39962
作品 0
成都
程序员
私信 提问
Visual Tracking via Adaptive Structural Local Sparse Appearance Model

Visual Tracking via Adaptive Structural Local Sparse Appearance Model 使用自适应的结构化局部外观模型的视觉跟踪 Abstract——摘要 Sparse representation has been applied to visual......

Quincuntial
2016/02/03
0
0
Robust Object Tracking via Sparsity-based Collaborative Model

Robust Object Tracking via Sparsity-based Collaborative Model 基于稀疏性协同模型的鲁棒目标跟踪 Abstract——摘要 In this paper we propose a robust object tracking algorithm usin......

Quincuntial
2016/02/03
0
0
高斯反向投影实现检测图像中的特定物

regionproposalcat.png 高斯反向投影 在图像处理中,我们通常需要设置感兴趣的区域(ROI,region of interest),来简化我们的工作。也就是从图像中选择的一个图像区域,这个区域是我们图像分析...

Tony沈哲
2017/08/14
0
0
近几年目标跟踪算法发展综述(下)

2016年 VOT2016【Index】今年算法比赛结果没什么特别大的意外,CNN和结合深度特征的算法都排名靠前,没毛病。今年你知道主办方干了一件大好事,就是把所能搜集到的算法代码都给公布了,良心啊...

crazyice521
2017/04/19
0
0
机器视觉&amp;语音识别

一、机器视觉: 摄像头视频采集,真彩色转256色,二值化,BP神经网络,训练或模版匹配。 动物体跟踪、立体物体定位,距离测试 二、语音: 识别(RAS),朗读(TTS)。 我想知道语音采集后怎么...

berryz2007
2010/12/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mybatis学习(1)

JDBC连接方式: 1.底层没有使用连接池,操作数据库需要频繁的创建和关闭连接,消耗资源。 2.写原生的JDBC代码在JAVA中,一旦需要修改SQL的话(比如表增加字段),JAVA需要整体重新编译,不利...

杨健-YJ
29分钟前
1
0
怎么组织文档

可以从以下几个方面考虑组织文档: ☐ 各种分支的界面截图和对应的类及文件 ☐ 框架或类图 ☐ 流程图 ☐ 时序图 ☐ 注意事项

-___-
41分钟前
2
0
分布式之数据库和缓存双写一致性方案解析

引言 为什么写这篇文章? 首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用。在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作。 但是在更新缓存方面,对于更...

别打我会飞
43分钟前
9
0
我的oracle11G,12c OCM之路

ocm认证感悟 ---------------------- 距离拿到ocm证书已经过了1年的时间,当初拿到证书的心情到现在还记得。其实在每个DBA心里都有一个成为强者的梦想,需要被认可,我也一样。我干过开发,做...

hnairdb
44分钟前
2
1
手动部署kubernetes集群(1.13.1最新版)

一、机器规划 使用五台机子部署k8s集群,规划如下: master节点3台(同时也是etcd节点) node节点2台 ip分配如下: ip:192.168.10.101,主机名:k8s-etcd01 ip:192.168.10.102,主机名:k8s...

人在艹木中
49分钟前
30
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部