您的位置:首页 > 运维架构

OpenCV的模板匹配简单包装

2009-04-12 17:36 375 查看
OpenCV的模板匹配在帧间跟踪目标效果还不错。

PS: CSDN的blog真烂,居然只能发一篇文章,nnd。

#if !defined(AFX_TRACKER_TM_H_INCLUDED)
#define AFX_TRACKER_TM_H_INCLUDED
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "cv.h"
class CTrackerTM
{
public:
void Process(IplImage *gray)
{
assert(gray != NULL);
if (!m_bInit)
{
return;
}
MatchTemplate(gray, m_ImgTemplate, &m_MaxCOE, &m_Pos);
};
void Init(IplImage *gray, CvRect roi)
{
if (m_bInit)
{
return;
}
m_ImgTemplate = cvCreateImage(cvSize(roi.width, roi.height), 8, 1);
cvSetImageROI(gray, roi);
cvCopy(gray, m_ImgTemplate, NULL);
cvResetImageROI(gray);
m_Pos = cvPoint(roi.x, roi.y);
m_Size= cvSize(roi.width, roi.height);
m_bInit = true;
};
void MatchTemplate(IplImage *gray, IplImage *tmpl, double *M, CvPoint *pt)
{
double m, scale = 2;
IplImage *tmpl2;
IplImage* result;
CvRect rect;
CvPoint point1;
int resultW;
int resultH;
int w = tmpl->width * (float)scale/ 2;
int h = tmpl->height* (float)scale/ 2;
int x = pt->x + tmpl->width/ 2;
int y = pt->y + tmpl->height/2;
int x0= max(x - w, 0);
int x1= min(x + w, gray->width - 1);
int y0= max(y - h, 0);
int y1= min(y + h, gray->height - 1);
rect.height = y1 - y0;
rect.width  = x1 - x0;
rect.x = x0;
rect.y = y0;
//copy model
cvSetImageROI(gray, rect);
tmpl2 = cvCreateImage(cvSize(rect.width, rect.height), 8, 1);
cvCopy(gray, tmpl2, NULL);
cvResetImageROI(gray);
resultW = tmpl2->width - tmpl->width + 1;
resultH = tmpl2->height - tmpl->height +1;
result = cvCreateImage(cvSize(resultW, resultH), IPL_DEPTH_32F, 1);
cvMatchTemplate(tmpl2, tmpl, result, CV_TM_CCOEFF_NORMED);
cvMinMaxLoc(result, &m, M, &point1, pt, NULL);
pt->x += rect.x;
pt->y += rect.y;
cvReleaseImage(&tmpl2);
cvReleaseImage(&result);
}
void UpdateTemplate(IplImage *gray, IplImage *tmpl, CvPoint *pt)
{
CvRect rect;
rect.x = pt->x;
rect.y = pt->y;
rect.height = tmpl->height;
rect.width  = tmpl->width;
cvSetImageROI(gray, rect);
cvCopy(gray, tmpl, NULL);
cvResetImageROI(gray);
};
CTrackerTM()
{
m_bInit = false;
m_ImgTemplate = NULL;
};
~CTrackerTM()
{
if (m_ImgTemplate != NULL)
{
cvReleaseImage(&m_ImgTemplate);
}
}
public:
CvPoint  m_Pos;   //左上角
CvSize   m_Size;  //size
double   m_MaxCOE;//最大相似系数
bool     m_bInit;
IplImage *m_ImgTemplate;
};
#endif //AFX_TRACKER_TM_H_INCLUDED
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: