1. 程式人生 > >使用Opencv中matchTemplate模板匹配方法跟蹤移動目標

使用Opencv中matchTemplate模板匹配方法跟蹤移動目標

模板匹配是一種在影象中定位目標的方法,通過把輸入影象在實際影象上逐畫素點滑動,計算特徵相似性,以此來判斷當前滑塊影象所在位置是目標影象的概率

在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. 存在跟蹤漂移:隨時更新跟蹤目標這種線上跟蹤方法,很容易導致跟蹤漂移問題,特別是在目標本身的特徵變化較大的情況下,嚴重的還有可能完全跟丟目標,並且永久丟失對目標的跟蹤。優化方向可以考慮對歷史上檢測出的目標影象採用累積權重法生成下一個輸入影象。另一個針對完全跟丟的情況,可以對目標匹配的概率設定一個閾值,小於閾值的,可能檢測到的是一個跟目標差異很大的物體,不對輸入影象做更新。

相關推薦

使用OpencvmatchTemplate模板匹配方法跟蹤移動目標

模板匹配是一種在影象中定位目標的方法,通過把輸入影象在實際影象上逐畫素點滑動,計算特徵相似性,以此來判斷當前滑塊影象所在位置是目標影象的概率。 在Opencv中,模板匹配定義了6種相似性對比方式:     CV_TM_SQDIFF 平方差匹配法:計算影象畫素間的距離之和,最

SSM-Spring-12:SpringNameMatchMethodPointcutAdvisor名稱匹配方法切入點顧問

cep con ram -c intercept cts str framework 所有 ------------吾亦無他,唯手熟爾,謙卑若愚,好學若饑------------- advice 是通知advisor 是顧問 顧問(Advisor)     

影象處理模板匹配c++實現

一、理論基礎 基於相關的模板匹配技術可直接用於在一幅影象中,尋找某種子影象模式。對於大小為MxN的影象f(x,y)和大小為JxK的子影象模式w(x,y),f與w的相關可表示為: 其種,x=0,1,2,…N-K,y=0,1,2,…M-J。此處 的目的是尋找

《OpenCV3程式設計入門》——4.1.5 OpenCV的格式化輸出方法

目錄 1、OpenCV預設風格輸出 2、Python風格輸出 3、逗號分隔風格(Comma separated values,CSV) 4、Numpy風格  5、C語言風格 OpenCV提供了風格迥異的格式化輸出方法,下邊詳細介紹不同的輸出方法。 首先定義一

opencv學習:模板匹配原始碼解讀

<span style="color: rgb(0, 0, 255); font-family: Arial; font-size: 14px; line-height: 26px;">上文說到使用OpenCV進行模板匹配的函式matchTemplate,下面就

OpenCV光流法跟蹤器的使用方法學習

一、基於特徵點的目標跟蹤的一般步驟 (1)探測當前幀的特徵點 (2)通過當前幀和下一幀的灰度比較,估計當前幀特徵點在下一幀的位置 (3)過濾位置不變的特徵點,餘下的點就是目標了 基於特徵點的目標跟蹤演算法和1,2兩個步驟有關,特徵點可以是Harris角點,也可以是邊緣點等等,第二步估

OpenCV 模板匹配 cv::matchTemplate

轉:http://blog.sina.com.cn/s/blog_b0935ba90102wy93.html 今天使用到opencv的matchTemplate運算元,查詢資料,學習了一下。 對官方資料進行翻譯註釋,加深理解,詳情可見:matchTemplate英文資料。 模板匹配

opencv筆記(3)——模板匹配實現目標識別與跟蹤

1 知識補充 1.1 回撥函式 在影象處理時,如果我們需要實現實時的改變值,並重新開始程式,就需要我們自己實現回撥函式,其中,對於滑鼠事件的回撥,需要我們重寫滑鼠回撥函式void onMouse(int event, int x, int y, int flags, void* us

opencv 模板匹配的 minMaxLoc

在opencv模板匹配中用到了這個函式 matchTemplate(src, tmp_img, dst_img, TM_CCOEFF_NORMED); normalize(dst_img, dst_

opencv學習之三十】簡單模板匹配matchTemplate

opencv實現了一部分通過模板與目標影象進行尋找最佳匹配的方面matchTemplat();這個方法網上有很多講解,基本思想是將模板影象在目標影象上滑動逐一對比,通過統計的基本方法進行匹配,比如方差檢驗,相關性檢驗等方法來尋找最佳匹配;話不多多說吧,從網上找到的一些實驗程式

OpenCV特徵檢測,提取與匹配使用方法學習

最近在學習OpenCV,一般看官方一邊看書,發現自己原來用的很多介面早已被更新,分享一下學習心得體會,也希望大家可以不吝賜教!        首先看到在Mastering OpenCV with Practical Computer Vision Projects書中,特

[opencv]模板匹配演算法(單影象模板匹配和基於模板匹配目標跟蹤

1.模板匹配opencv函式 matchTemplate(InputArray image, InputArray temp, OutputArray result, int method) Parameters: image – Image where the search is runn

opencv 模板匹配matchTemplate研究之一

 #include"opencv2\core\core.hpp" #include"opencv2\highgui\highgui.hpp" #include"opencv2\imgproc\imgproc.hpp" #include<iostream> using namespace std;

tp5模板、控制器、js的url跳轉方法

false header type 控制 lang dex RM ext TP $this->redirect(‘/Supperman/outerMan‘);$this->display(‘Supperman:outerMan‘);這兩者都只是在當前頁面打開新的

使用Python+OpenCV進行圖像模板匹配(Match Template)

more 查看 AR 簡單 highlight 以及 face ims import 2017年9月22日 BY 藍鯨 LEAVE A COMMENT 本篇文章介紹使用Python和OpenCV對圖像進行模板匹配和識別。模板匹配是在圖像中尋找和識別模板的一種簡單的方法。

OpenCV——模板匹配

.com 分享圖片 pen alt open mage png inf enc OpenCV——模板匹配

OpenCV判斷點在矩形方法

目錄 1.問題 2.思路 3.實現 4.資料 1.問題 如圖1.1所示,有紅色和藍色兩個點,如何判斷點相對於矩形的位置呢? 2.思路 首先,我們知道OpenCV中有一個函式:pointPolygonTest()。它的作用是判斷一個點是否在輪廓中,基本用法如下

[python-opencv]模板匹配

模板匹配最適用於工業場合(在一張圖片中識別特定的工件圖) 模板匹配是一種最原始、最基本的模式識別方法,研究某一特定物件物的圖案位於影象(target)的什麼地方,進而識別物件物,這就是一個匹配問題。 它是影象處理中最基本、最常用的匹配方法。模板匹配具有自身的侷限性,主要表現在它只能進行平行移動,若原影象中

OpencvcopyTo()函式的使用方法

https://www.cnblogs.com/phoenixdsg/p/8420716.html 在Mat矩陣類的成員函式中copyTo(roi , mask)函式是非常有用的一個函式,尤其是後面的mask可以實現蒙版的功能,我們用幾個例項來說明它的作用。我們要注意mask的資料型別,必須是C

Struts xmlAction的method與路徑的三種匹配方法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!