《學習OpenCV》練習4-2

#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數值隨鼠標移動而改變的功能*/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章