2013-02-14 48 views
1

我是OpenCV的初學者,並希望在控制檯中打印通過點擊它定義的像素(RGB格式)的特定值。opencv設置鼠標回調

經過一番搜索,我設法引導了我在圖片上點擊的座標。

如果有人知道如何做到這一點,請修改這個代碼,我使用:

void mouseEvent (int evt, int x, int y, int flags, void* param) 
{      
    if (evt == CV_EVENT_LBUTTONDOWN) 
    { 
      printf("%d %d\n",x ,y); 
    }   
} 

,這是我用來調用該函數:

cvSetMouseCallback("blah blah", mouseEvent, 0); 

回答

7

將您的圖像墊稱爲幀,則:

namedWindow("test"); 
cvSetMouseCallback("test", mouseEvent, &frame); 

char key = 0; 
while ((int)key != 27) { 
    imshow("test", frame); 
    key = waitKey(1); 
} 

其中的MouseEvent定義爲:

void mouseEvent(int evt, int x, int y, int flags, void* param) {      
    Mat* rgb = (Mat*) param; 
    if (evt == CV_EVENT_LBUTTONDOWN) { 
     printf("%d %d: %d, %d, %d\n", 
     x, y, 
     (int)(*rgb).at<Vec3b>(y, x)[0], 
     (int)(*rgb).at<Vec3b>(y, x)[1], 
     (int)(*rgb).at<Vec3b>(y, x)[2]); 
    }   
} 
+2

只是爲了澄清你對Cristian的回答:'cvSetMouseCallback()'的最後一個參數是一個指針,它用於將用戶數據發送到回調函數。因此,我們感興趣的數據發送它的圖像本身,所以當點擊時,你可以訪問該指定位置的像素。這就是這個答案所顯示的。 – karlphillip 2013-02-14 16:17:18

+0

thx爲答案隊友,但仍然有一些困難:我在Dev C++上使用OpenCV 2.1。我嘗試將Mat * rgb切換到CvScalar,但仍然必須更改(* rgb).at (y,x)[0]。如果你知道如何改變這個2.1我會很感激它! – 2013-02-18 08:58:17

+0

IT! ((uchar *)(rgb-> imageData + rgb-> widthStep * y))[x * 3]替換(int)(* rgb).at (y,x)[0]與 和Mat * rgb =(Mat *)param; 與 IplImage * rgb =(IplImage *)param; Thx求救! – 2013-02-18 09:34:16