当前位置: 首页 > article >正文

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

结论

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


http://www.kler.cn/a/399049.html

相关文章:

  • 《Python 网络爬虫》
  • 【HarmonyOS】鸿蒙系统在租房项目中的项目实战(二)
  • uniapp 实现tabbar分类导航及滚动联动效果
  • 调用门提权
  • Gin 框架中间件详细介绍
  • 项目配置文件选择(Json,xml,Yaml, INI)
  • 利用TinyML和IoT技术预测沙漠地区光伏电站清洁方法
  • Java LinkedList 详解
  • Git 搭建远程仓库、在 IDEA 工具中的配置和使用
  • wx小程序turf.js判断点是否位于该多边形内部
  • 跨平台WPF框架Avalonia教程 十一
  • idea 弹窗 delete remote branch origin/develop-deploy
  • MATLAB和Python及R瑞利散射
  • Halcon HImage 与 Qt QImage 的相互转换(修订版)
  • 7z 解压器手机版与解压专家:安卓解压工具对决
  • MIT6.5840 Lab 1: MapReduce(6.824)
  • RHCE-DNS域名解析服务器
  • 第8章 利用CSS制作导航菜单
  • 数字图像处理(c++ opencv):图像分割-基本边缘检测
  • PHP服务器如何开启WSS服务端Websocket
  • uni-app快速入门(七)--组件路由跳转和API路由跳转及参数传递
  • 【Qt 蓝牙服务器实现】
  • Cuda和Pytorch的兼容性
  • 大数据时代的隐私保护:数据治理的新视角
  • OMV7 树莓派 tf卡安装
  • 2024 RISC-V 中国峰会 演讲幻灯片和视频回放 均已公开