#ifdef _CH_ #pragma package #endif #include "cv.h" #include "highgui.h" #include #include IplImage *image=0, *hsv=0, *gray=0; int colorflag=1; // マウスクリック時に呼び出されるコールバック関数 // eventごとに処理をわける void on_mouse( int event, int x, int y, int flags, void* param ) { if( !image ) return; if( image->origin ) y = image->height - y; printf( "(%d %d)\n", x, y ); switch( event ) { case CV_EVENT_LBUTTONDOWN: printf( "LButton Down\n" ); break; case CV_EVENT_LBUTTONUP: printf( "LButton Up\n" ); break; case CV_EVENT_RBUTTONDOWN: printf( "RButton Down\n" ); break; case CV_EVENT_RBUTTONUP: printf( "RButton Up\n" ); break; } } int main( int argc, char** argv ) { CvCapture* capture = 0; const char* winname = argv[0]; // window caption if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0]))) // cameraからとりこみ(デフォルト) capture = cvCaptureFromCAM( argc == 2 ? argv[1][0] - '0' : 0 ); else if( argc == 2 ) // AVIファイルからとりこみ(引数でファイルを指定したとき) capture = cvCaptureFromAVI( argv[1] ); if( !capture ) { fprintf(stderr,"Could not initialize capturing...\n"); return -1; } printf( "color/mono is switched when 'c' key pushed.\n" ); // 表示ウィンドウの生成 cvNamedWindow( winname, CV_WINDOW_AUTOSIZE ); // マウスイベントコールバックをウィンドウに割り付け cvSetMouseCallback( winname, on_mouse, 0 ); for(;;) { IplImage* frame = 0; int i, bin_w, c; // 1フレーム取り込み frame = cvQueryFrame( capture ); if( !frame ) break; if( !image ) { /* allocate all the buffers */ image = cvCreateImage( cvGetSize(frame), 8, 3 ); // color(8bit x 3plane) image->origin = frame->origin; hsv = cvCreateImage( cvGetSize(frame), 8, 3 ); // color(8bit x 3plane) hsv->origin = frame->origin; gray = cvCreateImage( cvGetSize(frame), 8, 1 ); // gray(8bit x 1plane) gray->origin = frame->origin; } if( colorflag ) { cvShowImage( winname, frame ); } else { // RGB -> HSVに色空間を変換 cvCvtColor( frame, hsv, CV_BGR2HSV ); // HSVのVをgray画像としてコピー cvSplit( hsv, 0, 0, gray, 0 ); cvShowImage( winname, gray ); } c = cvWaitKey(1); if( (char) c == 27 ) // ESC break; switch( (char) c ) { case 'c': if( colorflag==0 ) colorflag = 1; else colorflag = 0; break; default: ; } } cvReleaseCapture( &capture ); cvDestroyWindow( winname ); return 0; }