《学习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数值随鼠标移动而改变的功能*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值