I use some combination such as mouse handler, img ROI, and template matching.
#include "cv.h" #include "cxcore.h" #include "highgui.h" int c; IplImage *frame,*img, *img1; IplImage *tpl; IplImage *res; double minval, maxval; int frame_width, frame_height; int tpl_width, tpl_height; int res_width, res_height; int drag = 0; CvPoint minloc, maxloc; CvPoint point; bool pause = FALSE; bool crop = FALSE; void mouseHandler(int event, int x, int y, int flags, void* param) { /* user press left button */ if (event == CV_EVENT_LBUTTONDOWN && !drag) { point = cvPoint(x, y); drag = 1; } /* user drag the mouse */ if (event == CV_EVENT_MOUSEMOVE && drag) { cvDestroyWindow("template"); img = cvCloneImage(frame); cvRectangle(img,point,cvPoint(x, y),CV_RGB(255, 0, 0),1, 8, 0); cvCopy(img,frame, NULL); cvShowImage("reference", img); pause = TRUE; crop = FALSE; } /* user move the mouse */ if (event == CV_EVENT_MOUSEMOVE && !drag) { point = cvPoint(x, y); printf("x = %d y = %d \n",point.x,point.y); } /* user release left button */ int a,b; if (event == CV_EVENT_LBUTTONUP && drag) { img = cvCloneImage(frame); if ((x == point.x) || (y == point.y)) goto jmp; if ((point.x > x) && (point.y < y)) goto jmp; if ((point.x < x) && (point.y > y)) goto jmp; if ((point.x > x) && (point.y > y)) { a = point.x; b = point.y; point.x = x; point.y = y; x = a; y = b; } cvSetImageROI(img,cvRect(point.x,point.y,x - point.x,y - point.y)); cvShowImage("template", img); /* load template image */ cvSaveImage("Temp.jpg",img); tpl = cvLoadImage("Temp.jpg"); /* get image's properties */ tpl_width = tpl->width; tpl_height = tpl->height; res_width = frame_width - tpl_width + 1; res_height = frame_height - tpl_height + 1; cvResetImageROI(img); jmp: drag = 0; pause = FALSE; crop = TRUE; } } int main(int argc, char* argv[]) { CvCapture* capture = cvCaptureFromCAM(0); cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, 320 ); cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, 240 ); cvNamedWindow( "reference", CV_WINDOW_AUTOSIZE ); cvSetMouseCallback("reference", mouseHandler, NULL); /* get image's properties */ frame=cvQueryFrame(capture); frame_width = frame->width; frame_height = frame->height; while(1) { frame=cvQueryFrame(capture); if (crop){ /* create new image for template matching computation */ res = cvCreateImage( cvSize( res_width, res_height ), IPL_DEPTH_32F, 1 ); /* choose template matching method to be used */ cvMatchTemplate( frame, tpl, res, CV_TM_SQDIFF ); cvMinMaxLoc( res, &minval, &maxval, &minloc, &maxloc, 0 ); /* draw red rectangle */ cvRectangle( frame,cvPoint( minloc.x, minloc.y ),cvPoint( minloc.x + tpl_width, minloc.y + tpl_height ),cvScalar( 0, 0, 255, 0 ), 2, 0, 0 ); } if (!pause) cvShowImage( "reference", frame ); /* wait until user press a key to exit */ c=cvWaitKey(10); // escape key terminates program if(c == 27) break; } /* free memory */ cvDestroyWindow( "reference" ); cvReleaseImage( &frame ); return 0; }
1 comments:
thank god I found your blog...
you are my time savior....good work you have done here.
I'm new in opencv, I try to compile your code and I found memory leakage in the code(using method you mention in one of your post). Trying to solve it....and it's done...no more memory leakage
change made:
//-------------------------------------
if (crop)
{
/*
some statement
*/
cvReleaseImage( &res );
/*put this to release the image before closing.*/
}
//-------------------------------------
and release all image that have been create(a good practice to avoid memory leakage)
Post a Comment