问题描述: 当鼠标点击图像时,读取鼠标对应位置的像素值(BGR),并且以文本的形式在鼠标在屏幕中所在的位置显示出来。
问题分析: 将任务进行分解, 1、 知道鼠标在图像上的位置。 2、 返回图像对应位置的像素值。 3、 文本显示。
主要函数: 1、OpenCV的鼠标事件在回调函数中有一个参数值有关鼠标的当前位置。 回调函数的接口协议: Void your_mouse_callback( int event; //鼠标事件类型 int x, //鼠标事件的x坐标 int y, //鼠标事件的y坐标 int flag; void* param );
2、Mat类型的图像返回(x,y)处对应的BGR值可以用: B: img.at(x, y)[0] G: img.at(x, y)[1] R: img.at(x, y)[2]
3.文本显示的函数:cv::putText()(省略了函数的参数)
解答:
#include<opencv2/opencv.hpp>
using namespace cv;
void my_mouse_callback(
int event, int x, int y, int flags, void* param
);
void help()
{
std::cout<< "显示鼠标点击处的BGR值." << std::endl;
}
int B, G, R;
String s;
int main()
{
help();
Mat img, temp;
img = imread("C:/Users/limimi/Desktop/learning/OpenCV/Learning-OpenCV-3_examples-master/fruits.jpg");
img.copyTo(temp);
namedWindow("fruit", CV_WINDOW_AUTOSIZE);
while (1){
setMouseCallback("fruit", my_mouse_callback, (void*)&temp);
imshow("fruit", temp);
if ((waitKey(10) ==83)|| (waitKey(10) == 115))
{
img.copyTo(temp);
};
if (waitKey(15) == 27) break;
}
return 0;
}
void my_mouse_callback(int event, int x, int y, int flags, void* param)
{
Mat& img = *(Mat*)param;
switch (event)
{
case EVENT_LBUTTONDOWN:
{
B = img.at<Vec3b>(x, y)[0];
G = img.at<Vec3b>(x, y)[1];
R = img.at<Vec3b>(x, y)[2];
s = "B:"+std::to_string(B)+ "G:" + std::to_string(G)+"R:" + std::to_string(R);
}
break;
case CV_EVENT_LBUTTONUP:
{
putText(img, s, Point(x, y), FONT_HERSHEY_DUPLEX ,0.5, Scalar(0, 0, 0));
}
break;
}
}
效果展示:
|