使用OpenCV(C++)通过鼠标点击操作获取图像的像素坐标和像素值
使用OpenCV(C++)通过鼠标点击操作获取图像的像素坐标和像素值
在这篇博客中,我们将介绍如何使用OpenCV库在C++中实现鼠标点击操作,以获取图像的像素坐标和像素值。代码分为两个部分:一个是鼠标事件处理的回调函数,另一个是主程序。以下是详细的代码和注释。
一、鼠标事件处理函数
我们首先需要定义一个鼠标事件处理函数,该函数会在用户点击图像的时候被调用。我们将根据图像的通道数(单通道或多通道)来获取不同的像素值。
1. onMouse.h
#pragma once
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
// 鼠标事件处理的回调函数
void onMouse(int event, int x, int y, int flags, void* param)
{
// 将参数转换为图像矩阵
Mat* im = reinterpret_cast<Mat*>(param);
// 处理鼠标事件
switch (event) {
case EVENT_LBUTTONDOWN: // 左键点击事件
// 检查图像是否为单通道
if (static_cast<int>(im->channels()) == 1)
{
// 处理单通道图像(灰度图)
switch (im->type())
{
case CV_8U:
cout << "at (" << x << ", " << y << " ) value is: " << static_cast<int>(im->at<uchar>(Point(x, y))) << endl;
break;
case CV_8S:
cout << "at (" << x << ", " << y << " ) value is: " << static_cast<int>(im->at<char>(Point(x, y))) << endl;
break;
case CV_16U:
cout << "at (" << x << ", " << y << " ) value is: " << static_cast<int>(im->at<ushort>(Point(x, y))) << endl;
break;
case CV_16S:
cout << "at (" << x << ", " << y << " ) value is: " << static_cast<int>(im->at<short>(Point(x, y))) << endl;
break;
case CV_32S:
cout << "at (" << x << ", " << y << " ) value is: " << static_cast<int>(im->at<int>(Point(x, y))) << endl;
break;
case CV_32F:
cout << "at (" << x << ", " << y << " ) value is: " << static_cast<int>(im->at<float>(Point(x, y))) << endl;
break;
case CV_64F:
cout << "at (" << x << ", " << y << " ) value is: " << static_cast<int>(im->at<double>(Point(x, y))) << endl;
break;
}
}
else
{
// 处理多通道图像(彩色图)
cout << "at (" << x << ", " << y << ")"
<< " B value is: " << static_cast<int>(im->at<Vec3b>(Point(x, y))[0])
<< " G value is: " << static_cast<int>(im->at<Vec3b>(Point(x, y))[1])
<< " R value is: " << static_cast<int>(im->at<Vec3b>(Point(x, y))[2])
<< endl;
}
break;
}
}
CopyInsert
二、主程序
主程序部分负责加载图像并设置鼠标回调函数。当用户点击图像时,回调函数会被触发,打印出当前像素的坐标和像素值。
2. main.cpp
#include "onMouse.h"
using namespace cv;
using namespace std;
int main()
{
// 读取图像
Mat img1 = imread("D:/123.jpg");
if (img1.empty())
{
cout << "无法打开图像" << endl;
return -1;
}
// 显示图像
imshow("image1", img1);
// 设置鼠标回调函数,监听图像窗口的鼠标事件
setMouseCallback("image1", onMouse, reinterpret_cast<void*>(&img1));
// 等待用户按键
waitKey(0);
return 0;
}
CopyInsert
三、代码说明
-
onMouse函数:该函数根据鼠标事件的类型处理用户的点击。在左键点击事件中,根据图像的通道类型和数量,获取并打印出像素值。
-
主程序
:
- 使用
imread
函数加载图像,检查是否成功加载。 - 使用
imshow
函数显示图像。 - 使用
setMouseCallback
函数将图像窗口与鼠标事件处理函数关联。 waitKey(0)
用于等待用户按键,程序在此处暂停直至用户按下任意键。
- 使用
结论
通过以上代码,你可以轻松实现图像的像素坐标和像素值的获取。这种功能在图像处理与分析中有着广泛的应用,如点击查看图像特定点的值。