Opencv C++ 三、通过鼠标点击操作获取图像的像素坐标和像素值 四、生成一个简单的灰度图像。

三、通过鼠标点击操作获取图像的像素坐标和像素值

该操作首先需要创建一个头文件

在该头文件内进行编写:

#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的程序里,将原来的图片进行替换。

其结果如上。

猜你喜欢

转载自blog.csdn.net/w2492602718/article/details/133977984