Download the source here:
Blob pointer [Source code] 4.61 Mb
Source:
//______________________________________________________________________________________ // OpenCV cursor movent using Blobs // Author: Bharath Prabhuswamy //______________________________________________________________________________________ //______________________________________________________________________________________ #include <stdio.h> #include "cv.h" #include "highgui.h" #include "BlobResult.h" int main() { CvCapture *capture = 0; IplImage *img = 0; IplImage *gray_img = 0; IplImage *thres_img = 0; IplImage *blobs_img = 0; int key = 0; /* Initialize the webcam */ capture = cvCaptureFromCAM( 0 ); /* Always check if the program can find a device */ if ( !capture ) return -1; CBlobResult blobs; CBlob *currentBlob; CvRect rect; int frame_count = 0; int i = 0; int screen_x = GetSystemMetrics(SM_CXSCREEN); int screen_y = GetSystemMetrics(SM_CYSCREEN); int mouse_x,mouse_y; double x=0; double y=0; /* create a window for the video */ cvNamedWindow( "Blobs",CV_WINDOW_AUTOSIZE); //cvNamedWindow( "Thres",CV_WINDOW_AUTOSIZE); /* Create required images once */ if( frame_count == 0 ) { /* Obtain a frame from the device */ img = cvQueryFrame( capture ); /* Always check if the device returns a frame */ if( !img ) return -1; gray_img = cvCreateImage( cvGetSize(img), img->depth, 1); thres_img = cvCreateImage( cvGetSize(img), img->depth, 1); blobs_img = cvCreateImage( cvGetSize(img), img->depth, 3); } while((char) key != 27 ) { /* Obtain a frame from the device */ img = cvQueryFrame( capture ); /* Always check if the device returns a frame */ if( !img ) return -1; frame_count = frame_count + 1; /* Flip image once, after blob processing it is flipped back */ cvFlip(img,img,NULL); /* Convert image from Color to grayscale and then to binary (thresholded at 180) */ cvCvtColor(img,gray_img,CV_RGB2GRAY); cvThreshold(gray_img,thres_img,200,255,CV_THRESH_BINARY); /* Find Blobs that are White, Hence 'uchar backgroundColor = 0' (Black) */ blobs = CBlobResult(thres_img, NULL,0); /* Remove blobs if it does not cover minimum area specified below */ blobs.Filter( blobs, B_EXCLUDE, CBlobGetArea(),B_LESS,5,50); /* Number of blobs */ int j = blobs.GetNumBlobs(); printf("%d\n",j); /* 'i' points to blob 0, i.e., first blob */ /* If some blobs are detected then find the first blob */ if(i==0 && blobs.GetNumBlobs()>i) { currentBlob = blobs.GetBlob(i); rect = currentBlob->GetBoundingBox(); x = currentBlob->MinX(); y = currentBlob->MinY(); //printf("%d %d\n",x,y); /* Scale the capture size to the Screen resolution and set the cursor location */ mouse_x = (int) x*screen_x/img->width; mouse_y = (int) y*screen_y/img->height; SetCursorPos(mouse_x,mouse_y); /* Color the blob*/ currentBlob->FillBlob( blobs_img, CV_RGB(255,0,0)); } cvShowImage( "Blobs",blobs_img); //cvShowImage( "Thres",thres_img); /* Clear image for next iteration */ cvZero(blobs_img); /* Quit execution if 'ESC' key is pressed */ key = cvWaitKey(1); } /* Clean up memory */ cvDestroyWindow( "Blobs" ); cvReleaseCapture( &capture ); return 0; }Video:
Image:
No comments:
Post a Comment