利用Opencv3.4.15 vs2017实现鼠标获取图像像素值坐标、RGB值、HSV值

//功能:实现鼠标左键点击可以返回图像像素值坐标、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值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值