#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
最新推荐文章于 2020-12-16 19:47:00 发布