图2:程序流程图
利用该函数,在VC6.0开发环境下,就很容易实现CAMSHIFT算法跟踪运动物体,图3是程序控制界面:
图3:程序控制界面
4 实验结果与分析
本实验中,用笔记本自带的USB摄像头来跟踪一运动物体,下图4-图7一系列图像是采用CAMSHIFT算法跟踪运动物体部分图像。
图4:摄像头拍到的场景 图5:手动选择目标物体
图6:物体快速移动时跟踪目标 图7:物体发生旋转、变形时跟踪目标
由此可见,基于颜色直方图的CAMSHIFT算法可以有效地解决目标变形和旋转问题,而且运算效率很高,可以实时跟踪运动目标。
5 结论
本文在详细分析CAMSHIFT算法原理的基础上,采用Intel公司开发的OpenCV视觉库,在VC6.0开发环境下,实现了运动目标实时跟踪,解决了目标旋转、变形、部分遮挡问题。同时,可以看到,在开源库OpenCV的基础上,根据自己所开发应用程序所要实现的功能选择所需的库函数,能够大大减少在计算机视觉领域中的开发时间和精力,缩短程序开发的周期。
6 附录(程序代码部分)
#include \
#include \#include
IplImage *image = 0, *hsv = 0, *hue = 0, *mask = 0, *backproject = 0, *histimg = 0; CvHistogram *hist = 0;
int backproject_mode = 0; int select_object = 0; int track_object = 0; int show_hist = 1; CvPoint origin; CvRect selection;
CvRect track_window; CvBox2D track_box;
CvConnectedComp track_comp; int hdims = 16;
float hranges_arr[] = {0,180}; float* hranges = hranges_arr;
int vmin = 10, vmax = 256, smin = 30;
void on_mouse( int event, int x, int y, int flags, void* param ) {
if( !image ) return;
if( image->origin )
y = image->height - y;
if( select_object ) {
selection.x = MIN(x,origin.x); selection.y = MIN(y,origin.y);
selection.width = selection.x + CV_IABS(x - origin.x); selection.height = selection.y + CV_IABS(y - origin.y);
selection.x = MAX( selection.x, 0 ); selection.y = MAX( selection.y, 0 );
selection.width = MIN( selection.width, image->width ); selection.height = MIN( selection.height, image->height ); selection.width -= selection.x; selection.height -= selection.y; }
switch( event ) {
case CV_EVENT_LBUTTONDOWN: origin = cvPoint(x,y);
selection = cvRect(x,y,0,0); select_object = 1;
break;
case CV_EVENT_LBUTTONUP: select_object = 0;
if( selection.width > 0 && selection.height > 0 ) track_object = -1; break; } }
CvScalar hsv2rgb( float hue ) {
int rgb[3], p, sector;
static const int sector_data[][3]=
{{0,2,1}, {1,2,0}, {1,0,2}, {2,0,1}, {2,1,0}, {0,1,2}}; hue *= 0.033333333333333333333333333333333f; sector = cvFloor(hue);
p = cvRound(255*(hue - sector)); p ^= sector & 1 ? 255 : 0;
rgb[sector_data[sector][0]] = 255; rgb[sector_data[sector][1]] = 0; rgb[sector_data[sector][2]] = p;
return cvScalar(rgb[2], rgb[1], rgb[0],0); }
int main( int argc, char** argv ) {
CvCapture* capture = 0;
if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0]))) capture = cvCaptureFromCAM( argc == 2 ? argv[1][0] - '0' : 0 ); else if( argc == 2 )
capture = cvCaptureFromAVI( argv[1] );
if( !capture ) {
fprintf(stderr,\ return -1; }
printf( \
\
\
\ \
\
cvNamedWindow( \
cvNamedWindow( \
cvSetMouseCallback( \
cvCreateTrackbar( \ cvCreateTrackbar( \ cvCreateTrackbar( \
for(;;) {
IplImage* frame = 0; int i, bin_w, c;
frame = cvQueryFrame( capture ); if( !frame ) break;
if( !image ) {
/* allocate all the buffers */
image = cvCreateImage( cvGetSize(frame), 8, 3 ); image->origin = frame->origin;
hsv = cvCreateImage( cvGetSize(frame), 8, 3 ); hue = cvCreateImage( cvGetSize(frame), 8, 1 ); mask = cvCreateImage( cvGetSize(frame), 8, 1 );
backproject = cvCreateImage( cvGetSize(frame), 8, 1 );
hist = cvCreateHist( 1, &hdims, CV_HIST_ARRAY, &hranges, 1 ); histimg = cvCreateImage( cvSize(320,200), 8, 3 ); cvZero( histimg ); }
cvCopy( frame, image, 0 );
cvCvtColor( image, hsv, CV_BGR2HSV );
if( track_object ) {
int _vmin = vmin, _vmax = vmax;
cvInRangeS( hsv, cvScalar(0,smin,MIN(_vmin,_vmax),0),
cvScalar(180,256,MAX(_vmin,_vmax),0), mask );
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库基于OpenCv目标跟踪系统的实现 - 图文(2)在线全文阅读。
相关推荐: