1. 程式人生 > >Opencv下影象對滑鼠事件的響應

Opencv下影象對滑鼠事件的響應

直接上程式碼:

////////////////////////////////////////////////////////////////////////
//
// 該程式從檔案中讀入一幅影象,響應在圖片上的左鍵右鍵訊息
// 並顯示點選影象的座標,然後顯示出來. 
//
////////////////////////////////////////////////////////////////////////
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <cv.h>
#include <highgui.h> 
#include <windows.h>

//定義滑鼠響應訊息函式mouseHandler函式名可以自己設定,event為滑鼠響應事件
/*event:   CV_EVENT_LBUTTONDOWN,   CV_EVENT_RBUTTONDOWN,   CV_EVENT_MBUTTONDOWN,
		   CV_EVENT_LBUTTONUP,     CV_EVENT_RBUTTONUP,     CV_EVENT_MBUTTONUP,
		   CV_EVENT_LBUTTONDBLCLK, CV_EVENT_RBUTTONDBLCLK, CV_EVENT_MBUTTONDBLCLK,
           CV_EVENT_MOUSEMOVE */

//x,y為相對於圖片左上角的畫素座標
/*flags:   CV_EVENT_FLAG_CTRLKEY, CV_EVENT_FLAG_SHIFTKEY, CV_EVENT_FLAG_ALTKEY,
           CV_EVENT_FLAG_LBUTTON, CV_EVENT_FLAG_RBUTTON,  CV_EVENT_FLAG_MBUTTON */ 
//void* param為使用者的值傳給滑鼠響應函式mouseHandler
void mouseHandler(int event, int x, int y, int flags, void* param)
{
    switch(event){
	case CV_EVENT_LBUTTONDOWN:
		printf("Left button down.PixPoint(%d,%d)\n",x,y);
        break; 
		
	case CV_EVENT_RBUTTONDOWN:
        printf("Right button down.PixPoint(%d,%d)\n",x,y);
        break;
	case CV_EVENT_MBUTTONDOWN:
		if(flags&CV_EVENT_FLAG_CTRLKEY)
		printf("Middle button down and ctrl is press at the same time.PixPoint(%d,%d)\n",x,y);
		break;
    }
  }


int main(int argc, char *argv[])
{
	IplImage* img = 0;    //定義影象檔案指標,指向載入的原始影象
	int height,width,channels;  //定點陣圖像的長度(畫素),寬頻(畫素),通道數(指每個畫素用多少個位元組表示)
	uchar *data;      //儲存影象具體的畫素資料

	char Image_Filename[20];  //輸入影象檔案的檔名

	printf("Please input the filename of image:\n");
	scanf("%s",Image_Filename);
 

	img=cvLoadImage(Image_Filename,0);    //載入影象函式,第一個引數為影象名稱.第二個引數為輔助引數,
					     //有正,零,負三種值.正數表示以三通道影象載入(三通道即一個畫素用3個位元組表示),0表示
					//以單通道載入影象,負數代表載入影象的通道數由影象本身決定.
	if(!img)
	{
		printf("Could not load image file: %s\n",argv[1]);
		exit(0);
	} 
	
	

	cvNamedWindow("mainWin", 0);   //建立一個名稱為mainWin的視窗,用於顯示影象.CV_WINDOW_AUTOSIZE值為1	
					//表示固定視窗大小,若第二個引數為0表示視窗大小可變,影象也會隨著視窗的大小而改變

	cvMoveWindow("mainWin", 0, 0);  //設定視窗的位置,第一個引數為視窗的名字,後面兩個引數為視窗顯示的位置,(0,0)表示顯示在桌面的左上角.

	cvSetMouseCallback("mainWin",mouseHandler,NULL); //註冊滑鼠事件處理函式,一個引數為要響應改函式的視窗名,第二個引數自定義的滑鼠事件
						      //處理函式,最後一個為使用者需要傳給滑鼠事件處理函式的值,不需要傳遞則設為NULL

	
	cvShowImage("mainWin", img ); //在之前建立的mainWin視窗中顯示影象
	
	cvWaitKey(0);     //等待敲擊鍵盤,結束程式    
	
	cvReleaseImage(&img );  //釋放影象檔案指標
	return 0;
}
執行結果如下:

轉載請註明:小劉