#include "cv.h"
#include "highgui.h"
#include "stdio.h"
/*聲明全局變量point,爲鼠標當前座標*/
CvPoint point;
/*聲明存儲某點RGB值的全局數組*/
char RGB[3];
/*聲明鼠標左鍵狀態全局標誌位,若爲0則鼠標左鍵爲彈起,若爲1則鼠標左鍵按下*/
bool g_mouse_flag = 0;
/*聲明鼠標回調函數*/
void my_mouse_callback( int event, int x, int y, int flags, void* param );
/*聲明顯示文字函數*/
void my_PutText( IplImage* img, CvPoint* point );
/*主函數*/
int main( int argc, char** argv )
{
IplImage* image = cvLoadImage( "homework_4-2.jpg" );
if (!image) //如果輸入圖像失敗
{
printf( "Can't find the image.\n" );
return -1;
}
IplImage* temp= cvCloneImage( image ); //大循環,temp爲源圖像的克隆,不斷更新
cvNamedWindow( "homework_4-2" );
//爲鼠標回調函數my_mouse_callback註冊,並將temp指針轉爲空指針傳給鼠標回調函數my_mouse_callback
cvSetMouseCallback( "homework_4-2", my_mouse_callback, (void*)temp );
while (1)
{
IplImage* temp= cvCloneImage( image ); //大循環,temp爲源圖像的克隆,不斷更新
my_PutText( temp, &point ); //在圖像上顯示該點RGB值
cvShowImage( "homework_4-2", temp ); //把畫出高亮矩形了的圖像temp顯示
if (cvWaitKey(30) == 27) //按ESC鍵退出
{
break;
}
}
cvReleaseImage( &temp );
cvDestroyWindow( "homework_4-2" );
return 0;
}
//**********************************************************
//得到圖像RGB函數:得到圖像每點RGB值
//img :指向輸入圖像的指針
//point :指向以左上角爲原點的圖像座標值(像素)的指針
//**********************************************************
void my_getpointrgb( IplImage* img, CvPoint* point )
{
//ptr指針指向圖像img的CvPoint座標點
char* ptr = (char*)( img->imageData + (*point).y*img->widthStep + (*point).x*img->nChannels );
sprintf( RGB, "[%d %d %d]", *(ptr+0), *(ptr+1), *(ptr+2)); //將ptr指針指向的圖像矩陣元素的三個值以一定格式賦給全局變量數組RGB[3]
printf( "[%d %d %d]\n", ptr[0], ptr[1], ptr[2]); //將圖像矩陣的每個元素中的三個值(R,G,B)打印出來
}
//**********************************************************
//顯示文字函數:在指定圖像上顯示文字
//img :指向輸入圖像的指針
//point :指向以左上角爲原點的圖像座標值(像素)的指針
//**********************************************************
void my_PutText( IplImage* img, CvPoint* point )
{
CvFont font;
// IplImage* temp = cvCloneImage( img ); //避免在源圖像上顯示文字,故克隆一幅
cvInitFont( &font, CV_FONT_HERSHEY_PLAIN, 1, 1 ); //初始化字體
//在形參img圖像上,顯示數組RGB,在CvPoint處,字體爲font,顏色爲(255,0,0)
cvPutText( img, RGB, cvPoint((*point).x, (*point).y), &font, CV_RGB(255,0,0)); //在克隆的圖像temp上顯示RGB
cvShowImage( "homework_4-2", img ); //輸入字體後重新顯示圖像
}
//*****************************************************
//鼠標回調函數:根據不同鼠標動作相應不同事件
//event :鼠標事件類型
//x,y :事件發生時鼠標相對圖像像素位置的座標值
//flag :指定事件發生時鼠標左鍵、右鍵等的不同狀態
//param :空指針,一般用來指向鼠標作用的圖像
//*****************************************************
void my_mouse_callback( int event, int x, int y, int flags, void* param )
{
IplImage* img = (IplImage*)param; //將形參空指針param強制轉換爲IplImage指針再賦給img
switch (event)
{
case CV_EVENT_MOUSEMOVE: //如果鼠標移動
if (g_mouse_flag==1)
{
my_PutText( img, &point ); //在圖像上顯示該點RGB值
}
break;
case CV_EVENT_LBUTTONDOWN: //如果鼠標左鍵按下
g_mouse_flag = 1;
point.x = x; //將鼠標點擊的點的座標賦給point結構體
point.y = y;
break;
case CV_EVENT_LBUTTONUP: //如果鼠標左鍵按下後彈起
g_mouse_flag = 0;
printf( "(%d %d) ", point.x, point.y ); //輸出點擊該點的座標值
my_getpointrgb( img, &point ); //在同一行將RGB值打印出來
break;
}
}
/*暫時未能實現RGB數值隨鼠標移動而改變的功能*/
《學習OpenCV》練習4-2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.