//功能:实现鼠标左键点击可以返回图像像素值坐标、HSV值、RGB值
#include<opencv2/opencv.hpp>
#include<iostream>
#include<stdio.h>
using namespace cv;
using namespace std;
//设置回调函数1返回坐标值
void get_coordinate(int event,int x,int y,int flags,void*param)
{
Mat process_src=*(Mat*)(param);//利用解引用获取图像(问题1:为什么这里右值不采用*param解引用)【解答:(Mat*)(param)表示将param指针转化为Mat指针类型,最左边的*表示解引用】
CvFont font;
cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX,0.5,0.5,0,1,CV_AA);//字体结构初始化
imshow("output1", process_src);
if (event == CV_EVENT_LBUTTONDOWN)//设置鼠标左键被按下时,进行的操作
{
Point p1 = cvPoint(x, y);
char temp[16];//创建一个字符串类型用于下面输出sprintf输出保存位置
sprintf_s(temp, "(%d,%d)", p1.x, p1.y);//注意不能写成sprintf(c库函数),否则会报错,
putText(process_src, temp, p1, FONT_HERSHEY_PLAIN, 1.0,Scalar(0, 0, 0));
circle(process_src, p1, 2, Scalar(0, 0, 255));//鼠标点击位置画圆
imshow("output1", process_src);
}
else if (event == CV_EVENT_RBUTTONDOWN)//设置如果鼠标右键按下,则释放窗口
{
destroyAllWindows();
}
}
//设置回调函数2返回像素点HSV值,返回形式就是(H,S,V)
void get_HSV(int event, int x, int y, int flags, void*param)
{
Mat process_src = *(Mat*)(param);//利用解引用获取图像
Mat hsv_src;//新建一个图像用于存放HSV图像
cvtColor(process_src, hsv_src, COLOR_BGR2HSV);//将原本BGR储存图像转换为HSV形式储存图像
CvFont font;
cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 1, CV_AA);//字体结构初始化
imshow("output2", process_src);
if (event == CV_EVENT_LBUTTONDOWN)//设置鼠标左键被按下时,进行的操作
{
Point p2 = cvPoint(x, y);//获取鼠标坐标点
//CvScalar p3_RGB = cvGet2D(&process_src,y,x);//获取图像像素值的颜色值(BGR顺序储存)【这里出错,原因未详】
char temp[50];//创建一个字符串类型用于下面输出sprintf输出保存位置
sprintf_s(temp, "(%d,%d,%d)", hsv_src.at<Vec3b>(p2)[0], hsv_src.at<Vec3b>(p2)[1], hsv_src.at<Vec3b>(p2)[2]);//注意不能写成sprintf(c库函数),否则会报错,(process_src.at<Vec3b>(p3)[2] 表示我要访问Process_src图像中的p3像素点的B值)(Vec3b可以看作是vector<uchar, 3>)
putText(process_src, temp, p2, FONT_HERSHEY_PLAIN, 1.0, Scalar(0, 0, 0));
circle(process_src, p2, 2, Scalar(0, 0, 255));//鼠标点击位置画圆
imshow("output2", process_src);
}
else if (event == CV_EVENT_RBUTTONDOWN)//设置如果鼠标右键按下,则释放窗口
{
destroyAllWindows();
}
}
//设置回调函数3返回像素点RGB值,返回形式就是(R,G,B)
void get_RGB(int event, int x, int y, int flags, void*param)
{
Mat process_src = *(Mat*)(param);//利用解引用获取图像
CvFont font;
cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 1, CV_AA);//字体结构初始化
imshow("output3", process_src);
if (event == CV_EVENT_LBUTTONDOWN)//设置鼠标左键键被按下时,进行的操作
{
Point p3 = cvPoint(x, y);//获取鼠标坐标点
//CvScalar p3_RGB = cvGet2D(&process_src,y,x);//获取图像像素值的颜色值(BGR顺序储存)【这里出错,原因未详】
char temp[50];//创建一个字符串类型用于下面输出sprintf输出保存位置
sprintf_s(temp, "(%d,%d,%d)", process_src.at<Vec3b>(p3)[2], process_src.at<Vec3b>(p3)[1], process_src.at<Vec3b>(p3)[0]);//注意不能写成sprintf(c库函数),否则会报错,(process_src.at<Vec3b>(p3)[2] 表示我要访问Process_src图像中的p3像素点的B值)
putText(process_src, temp, p3, FONT_HERSHEY_PLAIN, 1.0, Scalar(0, 0, 0));
circle(process_src, p3, 2, Scalar(0, 0, 255));//鼠标点击位置画圆
imshow("output3", process_src);
}
else if (event == CV_EVENT_RBUTTONDOWN)//设置如果鼠标右键按下,则释放窗口
{
destroyAllWindows();
}
}
void showMenu()
{
cout << "请用户输入选择功能:(1获取像素值坐标 2获取HSV值 3获取RGB值)" << endl;
}
int main()
{
//载入图像
//IplImage*src = cvLoadImage("c");//创建指针src用来接受传入图像的地址
Mat src = imread("2.png");
int input_func;
showMenu();
cin >> input_func;
switch (input_func)
{
case 1://实现获取像素值坐标值
//创建窗口用于显示图像和操作区域
cvNamedWindow("output1", CV_WINDOW_AUTOSIZE);
//设置鼠标触发事件
cvSetMouseCallback("output1", get_coordinate, (void*)&src);
break;
case 2://实现获取像素值HSV值
//创建窗口用于显示图像和操作区域
cvNamedWindow("output2", CV_WINDOW_AUTOSIZE);
//设置鼠标触发事件
cvSetMouseCallback("output2", get_HSV, (void*)&src);
break;
case 3://实现获取像素值RGB值
//创建窗口用于显示图像和操作区域
cvNamedWindow("output3", CV_WINDOW_AUTOSIZE);
//设置鼠标触发事件
cvSetMouseCallback("output3", get_RGB, (void*)&src);
break;
}
waitKey(0);
return 0;
}
功能1:实现鼠标左键获取图像像素值坐标点
实现功能2:鼠标左键获取图像HSV值
功能3:实现鼠标左键获取图像RGB值