#include IplImage *image = 0, *hsv = 0, *hue = 0, *mask = 0, *backproject = 0, *histimg = 0,*back = 0, *back2 = 0,*image2 = 0,*image3 = 0,*bg = 0; CvHistogram *hist = 0; IplImage * ContrastBrightness(IplImage *, int , int ); int backproject_mode = 0; int select_object = 0; int track_object = 0; int show_hist = 1; CvPoint origin; CvPoint RECT1; CvPoint RECT2; CvPoint p1; CvPoint p2; CvRect selection; CvRect track_window; CvRect roiS; //Rect for size of ROI 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; int area=0; int contrast=100, bright=50,smooth=7; double x,y,h,w; 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); } ////// For changing Brightness and contrast ////////////////////////////// IplImage * ContrastBrightness(IplImage *src, int Contrast, int Brightness) { if(Contrast > 100) Contrast = 100; if(Contrast < -100) Contrast = -100; if(Brightness > 100) Brightness = 100; if(Brightness < -100) Brightness = -100; uchar lut[256]; CvMat* lut_mat; int hist_size = 256; float range_0[]={0,256}; float* ranges[] = { range_0 }; int i; IplImage * dest = cvCloneImage(src); IplImage * GRAY = cvCreateImage(cvGetSize(src),src->depth,1); if (src->nChannels ==3) { cvCvtColor(src,GRAY,CV_RGB2GRAY); } else { cvCopyImage(src,GRAY); } lut_mat = cvCreateMatHeader( 1, 256, CV_8UC1 ); cvSetData( lut_mat, lut, 0 ); /* * The algorithm is by Werner D. Streidt * (http://visca.com/ffactory/archives/5-99/msg00021.html) */ if( Contrast > 0 ) { double delta = 127.* Contrast/100; double a = 255./(255. - delta*2); double b = a*(Brightness - delta); for( i = 0; i < 256; i++ ) { int v = cvRound(a*i + b); if( v < 0 ) v = 0; if( v > 255 ) v = 255; lut[i] = v; } } else { double delta = -128.* Contrast/100; double a = (256.-delta*2)/255.; double b = a* Brightness + delta; for( i = 0; i < 256; i++ ) { int v = cvRound(a*i + b); if( v < 0 ) v = 0; if( v > 255 ) v = 255; lut[i] = v; } } if (src->nChannels ==3) { IplImage * R = cvCreateImage(cvGetSize(src),src->depth,1); IplImage * G = cvCreateImage(cvGetSize(src),src->depth,1); IplImage * B = cvCreateImage(cvGetSize(src),src->depth,1); cvCvtPixToPlane(src,R,G,B,NULL); // PERFORM IT ON EVERY CHANNEL cvLUT( R, R, lut_mat ); cvLUT( G, G, lut_mat ); cvLUT( B, B, lut_mat ); cvCvtPlaneToPix(R,G,B,NULL,dest); cvReleaseImage(&R); cvReleaseImage(&G); cvReleaseImage(&B); } else { //PERFORM IT ON THE CHANNEL cvLUT( GRAY, dest, lut_mat ); } cvReleaseImage(&GRAY); cvReleaseMat( &lut_mat); return dest; } int main( int argc, char** argv ) { CvCapture* capture = 0; //capture = cvCaptureFromCAM(0); capture = cvCaptureFromCAM(1); cvNamedWindow( \"CamShiftDemo\", 1 ); cvResizeWindow(\"CamShiftDemo\",300,600); cvMoveWindow( \"CamShiftDemo\", 335, 100 ); cvNamedWindow( \"ROI\", 1 ); cvMoveWindow( \"ROI\", 10, 100 ); cvNamedWindow( \"grey\", 1 ); cvMoveWindow( \"grey\", 670, 100 ); bg=cvLoadImage (\"bg.jpg\",1); cvSetMouseCallback( \"CamShiftDemo\", on_mouse, 0 ); cvCreateTrackbar( \"Vmin\", \"CamShiftDemo\", &vmin, 256, 0 ); cvCreateTrackbar( \"Vmax\", \"CamShiftDemo\", &vmax, 256, 0 ); cvCreateTrackbar( \"Smin\", \"CamShiftDemo\", &smin, 256, 0 ); cvCreateTrackbar( \"Contrast\", \"CamShiftDemo\", &contrast, 300, 0 ); cvCreateTrackbar( \"Bright\", \"CamShiftDemo\", &bright, 300, 0 ); 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 ); image2 = cvCreateImage( cvGetSize(frame), 8, 3 ); image3 = 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 ); back = cvCreateImage( cvGetSize(frame), 8, 1 ); back2 = cvCreateImage( cvGetSize(frame), 8, 3 ); hist = cvCreateHist( 1, &hdims, CV_HIST_ARRAY, &hranges, 1 ); histimg = cvCreateImage( cvSize(320,200), 8, 3 ); cvZero( histimg ); } cvCopy( frame, image, 0 ); p1.x=0;p1.y=0; p2.x=110;p1.y=100; //image=ContrastBrightness(image, contrast ,bright ); cvSmooth(image,image,CV_GAUSSIAN,5,5); 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 ); if( track_object < 0 ) { float max_val = 0.f; cvSetImageROI( hue, selection ); cvSetImageROI( mask, selection ); cvCalcHist( &hue, hist, 0, mask ); 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 ); bin_w = histimg->width / hdims; for( 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 ); } } cvCalcBackProject( &hue, backproject, hist ); backproject=ContrastBrightness(backproject, contrast , bright ); cvThreshold(backproject,backproject,30,255,CV_THRESH_BINARY); backproject=ContrastBrightness(backproject, contrast , bright ); cvSmooth(backproject,backproject,CV_GAUSSIAN,smooth,smooth); cvAnd( backproject, mask, backproject, 0 ); cvSmooth(backproject,backproject,CV_GAUSSIAN,15,15); cout < 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务