Day 2 - Opencv 鼠标事件回调并在图像上显示像素值
#include <highgui.hpp>
#include <opencv.hpp>
#include <imgproc.hpp>
#include <stdio.h>
#include <string.h>
std::string windowName = "原始图像";
void onMouse(int event, int x, int y, int flags, void* param);
int main()
{
//1.读入图像
cv::Mat image = cv::imread("messi5.jpg");
if (image.empty())
{
std::cout << "\n Durn, couldn't read image filename" << std::endl;
return 1;
}
//2.显示图像
cv::namedWindow(windowName);
cv::imshow(windowName, image);
//3.注册回调函数
//前两个参数使得窗体与函数onMouse建立联系
//第三个参数把所显示图像的地址作为附加参数传递给onMouse函数
cv::setMouseCallback(windowName, onMouse, reinterpret_cast<void*> (&image));
cv::waitKey(0);
return 0;
}
// event:回调函数的鼠标事件的类型
// x, y:事件发生时鼠标的位置,用像素值表示
// flags:表示事件发生时按下了鼠标的哪个键
// param:指向任意对象的指针,作为附加的参数发送给函数
void onMouse(int event, int x, int y, int flags, void* param)
{
cv::Mat* im = reinterpret_cast<cv::Mat*>(param);//转换成Mat型指针
cv::Mat dst(im->size(), CV_8UC3);
im->copyTo(dst); //要复制到dst中,否则会直接改变im内容
switch (event)
{
case cv::EVENT_LBUTTONDOWN: //鼠标左键按下事件
// 显示像素值(x,y)到控制台
std::cout << "at (" << x << "," << y << ") value is: "
<< static_cast<int>(
im->at<uchar>(cv::Point(x,y))) << std::endl;
//获取灰度值,并转换成string
int grayValue = static_cast<int>(
im->at<uchar>(cv::Point(x, y)));
char num[20] = { 0 };
_itoa_s(grayValue, num, 10);
//每次要刷新下,否则会显示很多数字
cv::imshow(windowName, *im);
//在图像窗口上打印出灰度值
cv::putText(dst, //目标图像
num, //文本
cv::Point(x, y), //文本位置
cv::FONT_HERSHEY_PLAIN, //字体类型
2.0, //字体大小
cv::Scalar(0, 0, 255), //字体颜色
2); //文本厚度
cv::imshow(windowName, dst);
break;
}
}
贴张原图:
效果截图: