现在的位置: 首页 > 综合 > 正文

camshift 实现自动化跟踪的小技巧

2014年01月09日 ⁄ 综合 ⁄ 共 1109字 ⁄ 字号 评论关闭

opencv 提供了使用基于颜色的跟踪算法camshift, 很好的算法,可是它是个半自动的算法,它需要用户在跟踪界面设定跟踪的目标。怎么预先设定目标再来跟踪呢?
本人偷了个懒,加入了用一张图片来设定跟踪的目标,在启动中加载图片,生成跟踪需要的histogram。这样实现了自动化的跟踪吧。

步骤如下:
1. 找到你需要跟踪的物体,拿到摄像头前,照一张相(print screen),这里需要注意的是,由于光线变化,临近摄像头会亮一些,离远会暗一些,那么最好跟踪的物体的拍摄颜色与实际跟踪中颜色相近。

 

2. 打开画笔功能,新建一张图片(320*240),大小与视频源图像一致,把物体截取放大,这样跟踪的颜色区域就都在图像中了。

例如这是一个跟踪绿色物体的图片

3。在代码中加入

void loadTemplateImage()
{
 IplImage *tempimage = cvLoadImage("F:/OM_tracking/Test cam shift/ShadowTrack/Debug/green.bmp",1);
 cvCvtColor( tempimage, hsv, CV_BGR2HSV );
 int _vmin = vmin, _vmax = vmax;

 cvInRangeS( hsv, cvScalar(0,smin,MIN(_vmin,_vmax),0),
  cvScalar(180,256,MAX(_vmin,_vmax),0), mask );
  
 cvSplit( hsv, hue, 0, 0, 0 );
 
 selection.x = 1;
 selection.y = 1;
 selection.width = 320-1;
 selection.height= 240-1;

 cvSetImageROI( hue, selection );
 cvSetImageROI( mask, selection );
 cvCalcHist( &hue, hist, 0, mask );

 float max_val = 0.f;  
    
 cvGetMinMaxHistValue( hist, 0, &max_val, 0, 0 );
 cvConvertScale( hist->bins, hist->bins, max_val ? 255. / max_val : 0., 0 );
 cvResetImageROI( hue );
 cvResetImageROI( mask );
 track_window = selection;
 track_object = 1;

 cvReleaseImage(&tempimage);

}

4,去掉原来的生成Hist的代码。在启动时候加入loadTemplateImage

5.运行代码,看结果吧. 代码这里下载

 

 

 

抱歉!评论已关闭.