三、通过鼠标点击操作获取图像的像素坐标和像素值
该操作首先需要创建一个头文件
在该头文件内进行编写:
#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); //evnet:鼠标事件类型 x,y:鼠标坐标 flags:鼠标哪个键
void onMouse(int event, int x, int y, int flags, void* param) //evnet:鼠标事件类型 x,y:鼠标坐标 flags:鼠标哪个键
{
Mat* im = reinterpret_cast<Mat*>(param);
switch (event) {
case EVENT_LBUTTONDOWN: //EVENT_LBUTTONDOWN的意思是按下鼠标左键会触发下列程序,若改成EVENT_RBUTTONDOWN,那就是按下右键时触发程序。
//显示图像像素值
if (static_cast<int>(im->channels()) == 1)
{
//若图像为单通道图像,则显示鼠标点击的坐标以及灰度值
switch (im->type())
{
case 0:
cout << "at (" << x << ", " << y << " ) value is: " << static_cast<int>(im->at<uchar>(Point(x, y))) << endl; break;
case 1:
cout << "at (" << x << ", " << y << " ) value is: " << static_cast<int>(im->at<char>(Point(x, y))) << endl; break;
case 2:
cout << "at (" << x << ", " << y << " ) value is: " << static_cast<int>(im->at<ushort>(Point(x, y))) << endl; break;
case 3:
cout << "at (" << x << ", " << y << " ) value is: " << static_cast<int>(im->at<short>(Point(x, y))) << endl; break;
case 4:
cout << "at (" << x << ", " << y << " ) value is: " << static_cast<int>(im->at<int>(Point(x, y))) << endl; break;
case 5:
cout << "at (" << x << ", " << y << " ) value is: " << static_cast<int>(im->at<float>(Point(x, y))) << endl; break;
case 6:
cout << "at (" << x << ", " << y << " ) value is: " << static_cast<int>(im->at<double>(Point(x, y))) << endl; break;
}
}
else
{
//若图像为彩色图像,则显示鼠标点击坐标以及对应的B, G, R值
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;
}
}
//setMouseCallback("image1", onMouse, reinterpret_cast<void*>(&image1)); //关联图像显示窗口和onMouse函数
//Mat每个格子内的数据格式---------- - Mat定义
//Mat_<uchar>-------- - CV_8U(0-255)
//Mat<char>---------- - CV_8S(-128-127)
//Nat_<short>-------- - CV_16S(-32768-32767)
//Mat_<ushort>--------CV_16U(0-65535)
//Mat_<int>---------- - CV_32S(-2147483648-2147483647)
//Mat_<float>----------CV_32F(-FLT_MAX…FLT_MAX,INF,NAN)
//Mat_<double>--------CV_64F(-DBL_MAX…DBL_MAX,INF,NAN)
//Mat数据类型和通道对应的type()
// C1 C2 C3 C4
//CV_8U 0 8 16 24
//CV_8S 1 9 17 25
//CV_16U 2 10 18 26
//CV_16S 3 11 19 27
//CV_32S 4 12 20 28
//CV_32F 5 13 21 29
//CV_64F 6 14 22 30
而后双击打开源文件:
在源文件内编写:
#include<iostream>
#include<opencv2/opencv.hpp>
#include "onMouse.h"
using namespace cv;
using namespace std;
int main()
{
Mat image1 = imread("D://lena.png"); //读取图像;
if (image1.empty())
{
cout << "读取错误" << endl;
return -1;
}
imshow("image1",image1); //显示图像;
setMouseCallback("image1", onMouse, reinterpret_cast<void*>(&image1)); //关联图像显示窗口和onMouse函数
waitKey(0); //暂停,保持图像显示,等待按键结束
return 0;
}
执行该程序:
显示内容为上图,而后在右侧image窗口内任意点击一个位置:
就会显示该位置的坐标信息和像素值。
由于该图像为RBG彩色图像,不是单通道的灰度影像,不能显示出代码中这一部分的作用:
所以说下一步我们要导入一张单通道的灰度图像。
四、生成一个棋盘的灰度图像
如果没有灰度影像,可以用下面这个程序生成一个棋盘的灰度图像:
#include <opencv2/opencv.hpp>
int main() {
// 创建一个200x200像素的单通道灰度图像
cv::Mat complexGrayImage(200, 200, CV_8UC1, cv::Scalar(0));
// 绘制棋盘格图案
int squareSize = 25;
for (int i = 0; i < complexGrayImage.rows; i += squareSize) {
for (int j = 0; j < complexGrayImage.cols; j += squareSize) {
if ((i / squareSize + j / squareSize) % 2 == 0) {
cv::Rect roi(j, i, squareSize, squareSize);
complexGrayImage(roi) = cv::Scalar(255);
}
}
}
// 保存图像为PNG文件
cv::imwrite("complex_gray_image.png", complexGrayImage);
std::cout << "Complex grayscale image created and saved as complex_gray_image.png" << std::endl;
// 创建窗口并显示图像
cv::namedWindow("Complex Gray Image", cv::WINDOW_AUTOSIZE);
cv::imshow("Complex Gray Image", complexGrayImage);
// 等待键盘事件,按任意键退出
cv::waitKey(0);
// 关闭窗口
cv::destroyWindow("Complex Gray Image");
return 0;
}
生成的灰度图像,保存在文件根目录
将该图片的地址复制到.cpp的程序里,将原来的图片进行替换。
文章来源:https://www.toymoban.com/news/detail-861121.html
其结果如上。文章来源地址https://www.toymoban.com/news/detail-861121.html
到了这里,关于Opencv C++ 三、通过鼠标点击操作获取图像的像素坐标和像素值 四、生成一个简单的灰度图像。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!