暮景桑榆127 2024-05-03 03:14 采纳率: 14.3%
浏览 8

计算相机内参矩阵和畸变系数矩阵

img


计算相机内参矩阵和畸变系数矩阵的函数没有错,但还是出现了这个问题,前面各个已经定义了,这是哪里出现问题了,求解决。

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-03 03:14
    关注

    引自免费微信小程序:皆我百晓生

    从您提供的代码片段来看,问题出在calibrateCamera()函数调用后的一段代码中,具体是这里:

    double total_err = 0.0;
    double err = 0.0;
    vector<Point2f> points_reproject;
    
    for (int i = 0; i < image_nums; i++) {
        err = 0.0;
        // 这里应该是调用reprojectImageTo3D()函数,但是缺少了这个函数的调用
        // ...
        for (size_t j = 0; j < points_all_images[i].size(); j++) {
            err += norm(points_all_images[i][j] - points_reproject[j]);
        }
        total_err += err / points_all_images[i].size();
        cout << "计算每幅图像的标定误差:" << err / points_all_images[i].size() << endl;
    }
    

    看起来您可能遗漏了一个关键步骤:将二维像素点重新投影到三维空间,并与原始三维点比较以计算误差。应该使用reprojectImageTo3D()函数来实现这一点。下面是修复后的代码:

    #include <opencv2/core.hpp>
    #include <opencv2/calib3d.hpp>
    #include <opencv2/highgui.hpp>
    #include <opencv2/imgproc.hpp>
    #include <iostream>
    
    using namespace cv;
    using namespace std;
    
    int main() {
        // ... 其他代码保持不变 ...
    
        Mat cameraMatrix(3, 3, CV_32FC1, Scalar::all(0));
        Mat distCoeffs(1, 5, CV_32FC1, Scalar::all(0));
    
        vector<Mat> rotationVectors;
        vector<Mat> translationVectors;
    
        calibrateCamera(points3D_all_images, points_all_images, image_size, cameraMatrix, distCoeffs, rotationVectors, translationVectors, 0);
    
        double total_err = 0.0;
        double err = 0.0;
        vector<Point2f> points_reproject;
    
        for (int i = 0; i < image_nums; i++) {
            err = 0.0;
            reprojectImageTo3D(points_all_images[i], points_reproject, cameraMatrix, distCoeffs, rotationVectors[i], translationVectors[i]);
    
            for (size_t j = 0; j < points_all_images[i].size(); j++) {
                err += norm(points_all_images[i][j] - points_reproject[j]);
            }
    
            total_err += err / points_all_images[i].size();
            cout << "计算每幅图像的标定误差:" << err / points_all_images[i].size() << endl;
        }
    
        cout << "所有图像的平均误差总和:" << total_err << endl;
    
        return 0;
    }
    

    这段代码首先包含了必要的头文件,然后修复了循环中的错误,添加了对reprojectImageTo3D()函数的调用。这样就可以正确地计算每幅图像的标定误差并输出结果。确保您的OpenCV库版本支持这些函数,因为某些旧版本可能不包含reprojectImageTo3D()。此外,请检查其他变量是否已正确初始化,例如points3D_all_imagespoints_all_imagesimage_size等。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月3日

悬赏问题

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