您的位置:首页 > 编程语言 > C语言/C++

camshift目标识别VC++6.0实现

2011-05-28 18:07 176 查看
转载自:http://hi.baidu.com/hfuthxr/blog/item/612fd5da19bd775894ee37a6.html

作者:观澜阁

目标识别(CamShift)

2010年06月03日 星期四 上午 11:10
#include "stdafx.h"

#include "cv.h"

#include "highgui.h"

#include <stdio.h>

#include <ctype.h>
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 = 20, vmax = 256, smin = 90;
CvScalar hsv2rgb( float hue );

void CaptureObject(CvCapture* capture);
void loadTemplateImage()

{

IplImage *tempimage = cvLoadImage("F://test//test.jpg",1);// target sample picture

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;

cvZero( histimg );

int bin_w = histimg->width / hdims;

for(int i = 0; i < hdims; i++ )

{

int val = cvRound( cvGetReal1D(hist->bins,i)*histimg->height/255 );

CvScalar color = hsv2rgb(i*180.f/hdims);

cvRectangle( histimg, cvPoint(i*bin_w,histimg->height),cvPoint((i+1)*bin_w,histimg->height - val),color, -1, 8, 0 );

}

cvReleaseImage(&tempimage);

}
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 )

{

char d[10];

itoa(select_object,d,10);

printf("select object %s ",d);

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;

char a[10];

char b[10];

char c[10];

char e[10];

itoa(selection.x,a,10);

itoa(selection.y,b,10);

itoa(selection.width,c,10);

itoa(selection.height,e,10);

printf("selection x: %s,y:%s,width:%s,height:%s ",a,b,c,e);

}

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;

capture = cvCaptureFromCAM(0);

cvNamedWindow( "TrackEngine", 0 );

CaptureObject(capture);

cvReleaseCapture( &capture );

cvDestroyWindow("TrackEngine");

return 0;

}
void CaptureObject(CvCapture* capture)

{

for(;;)

{

IplImage* frame = 0;

int c;

frame = cvQueryFrame( capture );

if( !frame )

break;

if( !image )

{

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 );

loadTemplateImage();

}

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 );

cvSplit( hsv, hue, 0, 0, 0 );

cvCalcBackProject( &hue, backproject, hist );

cvAnd( backproject, mask, backproject, 0 );

cvCamShift( backproject, track_window,cvTermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ),&track_comp, &track_box );

track_window = track_comp.rect;

if( backproject_mode )

cvCvtColor( backproject, image, CV_GRAY2BGR );

if( image->origin )

track_box.angle = -track_box.angle;

cvEllipseBox(image, track_box, CV_RGB(255,0,0), 3, CV_AA, 0 );

}

if( select_object && selection.width> 0 && selection.height > 0 )

{

cvSetImageROI( image, selection );

cvXorS( image, cvScalarAll(255), image, 0 );

cvResetImageROI( image );

}

cvShowImage( "TrackEngine", image );

c = cvWaitKey(10);

}

}

#ifdef _EiC

main(1,"TrackEngine.c");

#endif

//此代码在vc++6.0 下编译通过

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: