こばや小林 2024-02-12 14:34 采纳率: 85.2%
浏览 0
已结题

image.at无法获取图像部分区域rgb值

运用鼠标事件实时获取像素坐标x,y
其中代码Vec3b pixel =image.at<Vec
3b>(x,y)
当鼠标移至图像右侧时,程序报错0x00007FF9FDEF567C 处(位于 鼠标事件.exe 中)有未经处理的异常: Microsoft C++ 异常: cv::Exception,位于内存位置 0x000000BB3D0FD980 处。

  • 写回答

4条回答 默认 最新

  • GISer Liu 2024-02-12 14:36
    关注

    该回答引用自GPT-3.5,由博主GIS_Liu编写:

    问题分析:

    根据你提供的问题描述,你的程序在使用OpenCV库处理图像时出现了异常。具体来说,你使用了image.at<Vec3b>(x, y)来获取图像指定位置的像素值,但是当鼠标移至图像右侧时,程序报错了。

    解决方案:

    1. 检查坐标合法性:首先,需要确保获取的坐标(x, y)在图像范围内,即坐标不超出图像的宽度和高度。可以添加一些判断条件,确保坐标在有效范围内。

    2. 考虑图像边界问题:当鼠标移至图像右侧时,可能会超出图像边界,导致访问不存在的像素位置而出现异常。在处理边界像素时,需要进行特殊处理,例如使用cv::borderInterpolate函数来处理边界情况。

    3. 调试程序:可以通过添加一些调试信息或者使用调试工具来定位问题所在。输出一些关键信息,比如坐标值、图像尺寸等,有助于找出问题出现的原因。

    4. 异常处理:在访问像素值时,需要考虑到可能出现的异常情况,使用try-catch语句捕获异常,并进行相应的处理,例如输出错误信息或者进行恢复操作。

    下面是修改后的代码示例:

    #include <opencv2/opencv.hpp>
    #include <iostream>
    
    using namespace cv;
    using namespace std;
    
    Mat image;
    
    void onMouse(int event, int x, int y, int flags, void* param)
    {
        if (event == EVENT_LBUTTONDOWN)
        {
            // 检查坐标是否在图像范围内
            if (x >= 0 && x < image.cols && y >= 0 && y < image.rows)
            {
                try
                {
                    // 获取像素值
                    Vec3b pixel = image.at<Vec3b>(y, x);
                    cout << "RGB值为:" << (int)pixel[2] << ", " << (int)pixel[1] << ", " << (int)pixel[0] << endl;
                }
                catch (const cv::Exception& e)
                {
                    cerr << "异常捕获:" << e.what() << endl;
                    // 可以进行相应的处理,比如输出错误信息或者进行恢复操作
                }
            }
            else
            {
                cerr << "坐标超出图像范围" << endl;
            }
        }
    }
    
    int main()
    {
        // 读取图像
        image = imread("image.jpg");
    
        if (image.empty())
        {
            cerr << "无法读取图像" << endl;
            return -1;
        }
    
        // 创建窗口并注册鼠标回调函数
        namedWindow("Image");
        setMouseCallback("Image", onMouse);
    
        // 显示图像
        imshow("Image", image);
        waitKey(0);
    
        return 0;
    }
    

    在这个示例中,我添加了对坐标合法性的检查,并使用try-catch语句捕获异常,确保程序的稳定性。同时输出错误信息帮助调试程序。

    img

    如果该回答解决了您的问题,请采纳!如果没有,请详述问题所在!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 2月20日
  • 已采纳回答 2月12日
  • 创建了问题 2月12日

悬赏问题

  • ¥15 CPLEX用OPL编写的混合整数线性优化问题。
  • ¥15 可以用EasyConnect连接实验室内网,但无法连接内网才能访问的服务器,为什么?
  • ¥15 前端预览docx文件,文件从后端传送过来。
  • ¥15 层次聚类和蛋白质相似度
  • ¥25 主成分分析中的第一第二主成分分别代表哪些参数
  • ¥15 oracle数据库查询语句问题
  • ¥15 有没有c++绘制算法的佬们吗救孩一下
  • ¥15 android 蓝牙闪退
  • ¥15 绝缘子污秽comsol仿真参数
  • ¥15 labelme生成的json有乱码?