暮景桑榆127 2024-05-23 16:52 采纳率: 14.3%
浏览 7

数学方法像素坐标到实际坐标的转换

img


已知旋转和平移矩阵以及内参矩阵之后,通过数学方法计算像素坐标到实际坐标的转换,可是显示这个错误,这是为什么?

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2024-05-23 16:55
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    您想要解决的问题:

    您正在尝试使用OpenCV库在C++中实现从像素坐标到实际坐标的转换,但是遇到了一个运行时异常,您希望找到问题的原因并解决它。

    图片内容:

    图片中包含了一段C++代码,这段代码旨在使用OpenCV库将图像中的2D像素坐标转换为3D世界坐标。代码中包含了旋转矩阵ryecM1,平移向量tvec1,相机内参矩阵cameraMatrix1,以及一些用于计算的变量和步骤。

    问题出现原因:

    根据您提供的错误信息,问题出现在尝试执行逆矩阵运算时。错误信息提示为:

    Microsoft C++ 异常: cv:Exception,位于内存位置
    0x0000009D331BD550 处。
    

    这通常意味着OpenCV在执行某个操作时遇到了问题。具体来说,可能是以下几个原因:

    1. ryecM1cameraMatrix1矩阵的逆矩阵不存在或未正确计算。
    2. imagePoint的初始化不正确,导致矩阵运算出错。
    3. 数据类型不匹配或变量使用不当。

    问题解决方案:

    为了解决这个问题,我们可以按照以下步骤进行:

    1. 确保所有矩阵都是正确的,并且它们的逆矩阵存在。
    2. 检查imagePoint的初始化是否正确。
    3. 确保所有的数据类型都是一致的,并且变量使用得当。

    提供代码:

    以下是修改后的代码示例,我将对一些可能的问题点进行修正:

    #include <opencv2/opencv.hpp>
    #include <iostream>
    
    using namespace cv;
    using namespace std;
    
    int main() {
        // 旋转矩阵
        Mat rvecM1 = (Mat_<double>(3, 1) << 0.998966474197403, -0.00225137888261581, 0.04539729862818135);
        // 平移向量
        Mat tvec1 = (Mat_<double>(3, 1) << -285.51471526386, 320.0731760602154, 4122.768800951808);
        // 相机内参矩阵
        Mat cameraMatrix1 = (Mat_<double>(3, 3) << 1428.8347678263, 0, 600.0565442324603, 
                                                      0, 1429.376402820009, 818.4268675020412, 
                                                      0, 0, 1);
        // 缩放因子
        double s = 800;
        // 图像点
        Mat imagePoint = Mat::ones(3, 1, cv::DataType<double>::type); // u, v, 1
        imagePoint.at<double>(0, 0) = 530;
        imagePoint.at<double>(1, 0) = 578;
    
        // 计算世界坐标点
        Mat wcPoint = (cameraMatrix1.inv() * s * imagePoint.t()) - tvec1;
        Point3f worldPoint(wcPoint.at<double>(0, 0), wcPoint.at<double>(1, 0), wcPoint.at<double>(2, 0));
    
        cout << "2D to 3D :" << worldPoint << endl;
        waitKey(0);
        return 0;
    }
    

    代码运行方式:

    • 确保您的开发环境已经安装了OpenCV库。
    • 将上述代码保存为.cpp文件。
    • 使用支持C++的编译器编译代码,例如使用g++或Visual Studio。
    • 运行编译后的程序。

    代码预期运行结果:

    如果代码正确无误,它将输出转换后的3D世界坐标点。

    推荐相关链接:

    请注意,这些链接仅供参考,具体内容可能需要根据您使用的OpenCV版本进行调整。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月23日

悬赏问题

  • ¥15 依据报错在原代吗格式的基础上解决问题
  • ¥15 在虚拟机中安装flash code
  • ¥15 单片机stm32f10x编写光敏电阻调节3.3伏大功率灯亮度(光强越大灯越暗,白天正常光强灯不亮,使用ADC,PWM等模块)望各位找一下错误或者提供一个可实现功能的代码
  • ¥20 verilog状态机方法流水灯
  • ¥15 pandas代码实现不了意图
  • ¥15 GD32H7 从存储器到外设SPI传输数据无法重复启用DMA
  • ¥25 LT码在高斯信道下的误码率仿真
  • ¥45 渲染完成之后将物体的材质贴图改变,自动化进行这个操作
  • ¥15 yolov5目标检测并显示目标出现的时间或视频帧
  • ¥15 电视版的优酷可以设置电影连续播放吗?