使用OpenCV(C++)通过鼠标点击操作获取图像的像素坐标和像素值
![]()
在这篇博客中,我们将介绍如何使用OpenCV库在C++中实现鼠标点击操作,以获取图像的像素坐标和像素值。代码分为两个部分:一个是鼠标事件处理的回调函数,另一个是主程序。以下是详细的代码和注释。
一、鼠标事件处理函数
我们首先需要定义一个鼠标事件处理函数,该函数会在用户点击图像的时候被调用。我们将根据图像的通道数(单通道或多通道)来获取不同的像素值。
1. onMouse.h
void onMouse(int event, int x, int y, int flags, void* param);
这是一个处理鼠标事件的回调函数,参数说明:
event:鼠标事件的类型(如左键点击、右键点击等)。
x、y:鼠标在图像窗口中的坐标。
flags:与事件相关的标志,例如鼠标按键状态等。
param:用户自定义的参数,这里用来传入图像数据(指向 Mat 对象的指针)。
#pragma once
#include
#include
using namespace cv;
using namespace std;
// 鼠标事件处理的回调函数
void onMouse(int event, int x, int y, int flags, void* param)
{
// 将参数转换为图像矩阵
Mat* im = reinterpret_cast(param);
// 处理鼠标事件
switch (event) {
case EVENT_LBUTTONDOWN: // 左键点击事件
// 检查图像是否为单通道
if (static_cast(im->channels()) == 1)
{
// 处理单通道图像(灰度图)
switch (im->type())
{
//Mat每个格子内的数据格式---------- - Mat定义
//Mat_-------- - CV_8U(0-255)
//Mat---------- - CV_8S(-128-127)
//Nat_-------- - CV_16S(-32768-32767)
//Mat_--------CV_16U(0-65535)
//Mat_---------- - CV_32S(-2147483648-2147483647)
//Mat_----------CV_32F(-FLT_MAX…FLT_MAX,INF,NAN)
//Mat_--------CV_64F(-DBL_MAX…DBL_MAX,INF,NAN)
case CV_8U:
cout << "at (" << x << ", " << y << " ) value is: " << static_cast(im->at(Point(x, y))) << endl;
break;
case CV_8S:
cout << "at (" << x << ", " << y << " ) value is: " << static_cast(im->at(Point(x, y))) << endl;
break;
case CV_16U:
cout << "at (" << x << ", " << y << " ) value is: " << static_cast(im->at(Point(x, y))) << endl;
break;
case CV_16S:
cout << "at (" << x << ", " << y << " ) value is: " << static_cast(im->at(Point(x, y))) << endl;
break;
case CV_32S:
cout << "at (" << x << ", " << y << " ) value is: " << static_cast(im->at(Point(x, y))) << endl;
break;
case CV_32F:
cout << "at (" << x << ", " << y << " ) value is: " << static_cast(im->at(Point(x, y))) << endl;
break;
case CV_64F:
cout << "at (" << x << ", " << y << " ) value is: " << static_cast(im->at(Point(x, y))) << endl;
break;
}
}
else
{
// 处理多通道图像(彩色图)
cout << "at (" << x << ", " << y << ")"
<< " B value is: " << static_cast(im->at(Point(x, y))[0])
<< " G value is: " << static_cast(im->at(Point(x, y))[1])
<< " R value is: " << static_cast(im->at(Point(x, y))[2])
<< endl;
}
break;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
二、主程序
主程序部分负责加载图像并设置鼠标回调函数。当用户点击图像时,回调函数会被触发,打印出当前像素的坐标和像素值。
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(&img1));
// 等待用户按键
waitKey(0);
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
三、代码说明
-
onMouse函数:该函数根据鼠标事件的类型处理用户的点击。在左键点击事件中,根据图像的通道类型和数量,获取并打印出像素值。
-
主程序
:
- 使用
imread函数加载图像,检查是否成功加载。 - 使用
imshow函数显示图像。 - 使用
setMouseCallback函数将图像窗口与鼠标事件处理函数关联。 waitKey(0)用于等待用户按键,程序在此处暂停直至用户按下任意键。
- 使用
结论
通过以上代码,你可以轻松实现图像的像素坐标和像素值的获取。这种功能在图像处理与分析中有着广泛的应用,如点击查看图像特定点的值。
评论记录:
回复评论: