自学内容网 自学内容网

使用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)用于等待用户按键,程序在此处暂停直至用户按下任意键。

结论

通过以上代码,你可以轻松实现图像的像素坐标和像素值的获取。这种功能在图像处理与分析中有着广泛的应用,如点击查看图像特定点的值。


原文地址:https://blog.csdn.net/m0_57538342/article/details/143776786

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!