【问题标题】:OpenCv Troubleshooting (-4:Insufficient memory) Failed to allocateOpenCv故障排除(-4:内存不足)分配失败
【发布时间】:2022-01-22 23:37:13
【问题描述】:
QCoreApplication a(argc, argv);

cv::Mat src=imread("/home/cdukunlu/Downloads/EuFFJ.jpg");

float data[9]= {161.837869,0.059269,319.778713,0.000000,165.648492,230.424626,0.000000,0.000000,1.000000};
float rectification[9]={1.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,1.000000};
cv::Vec<float,4> k(0.148201,-0.031856,0.012784,-0.003392);

cv::Mat F = cv::Mat(3, 3, CV_32FC1, data);
cv::Mat R = cv::Mat(3, 3, CV_32FC1, rectification);

std::cout<<"Calibrationg..."<<std::endl;


    cv::Size size = {src.cols, src.rows};

    cv::Mat K(3, 3, cv::DataType<double>::type);
    K.at<double>(0, 0) = 1307.2807020496643;
    K.at<double>(0, 1) = 0.0;
    K.at<double>(0, 2) = 530.3754311563506;

    K.at<double>(1, 0) = 0.0;
    K.at<double>(1, 1) = 1318.342691460933;
    K.at<double>(1, 2) = 354.98352268131123;

    K.at<double>(2, 0) = 0.0;
    K.at<double>(2, 1) = 0.0;
    K.at<double>(2, 2) = 1.0;

    cv::Mat D(4, 1, cv::DataType<double>::type);
    D.at<double>(0, 0) = -0.2994762856767568;
    D.at<double>(1, 0) = 0.5036082961388784;
    D.at<double>(2, 0) = -4.231072729639434;
    D.at<double>(3, 0) = 3.8646397788794578;
    cv::Mat E = cv::Mat::eye(3, 3, cv::DataType<double>::type);

    cv::Mat map1;
    cv::Mat map2;

    std::cout << K << std::endl;
    std::cout << D << std::endl;
    std::cout << E << std::endl;
    std::cout << size << std::endl;

    cv::initUndistortRectifyMap(K, D, E, K, size, CV_16SC2, map1, map2);
terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(4.5.5-pre) /home/cdukunlu/opencv_build/opencv/modules/core/src/alloc.cpp:73: error: (-4:Insufficient memory) Failed to allocate 61343654331232 bytes in function 'OutOfMemoryError'

什么可能导致这种情况?

【问题讨论】:

  • 使用调试器并查看堆栈跟踪,以便查看代码中的哪些调用触发了崩溃。分配缓冲区时,您似乎有一个非常高的数字。
  • 你有异常,加try/catch就知道在哪一行引发了异常,然后关注这一行。
  • 我想您的图像未加载,因此 size 包含未初始化的值。然后,在 initUndistortRectifyMap 中,由于未初始化的 size 变量内容,它尝试分配大小非常大的矩阵。
  • 我使用过调试器和 cv::initUndistortRectifyMap(K, D, E, K, size, CV_16SC2, map1, map2);函数导致崩溃。
  • 我也检查了图像的值,它似乎已经初始化但仍然没有工作

标签: c++ opencv camera-calibration calibration


【解决方案1】:

我已经解决了检查 opencv 库的问题。

因为我在我的 ubuntu 上安装了两个不同的库; OpenCV 版本的预编译版本是 3.x,但我的代码在不同版本的 opencv 上进行了测试,即 OpenCV 4.5.2

只要我将版本从 3.x 更改为 4.5.2,问题就消失了。

毕竟最好只使用一个版本的库来避免错误。

【讨论】:

    猜你喜欢
    • 2011-02-28
    • 2018-07-15
    • 2023-03-08
    • 2018-10-23
    • 2020-06-25
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    相关资源
    最近更新 更多