微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

图像限制的OpenCV calibrateCamera错误

如何解决图像限制的OpenCV calibrateCamera错误

我使用来自OpenCV的教程代码站点,并且效果很好,但是由于某些原因,calibratecamera和calibratecameraRO存在相同的奇怪问题:如果图像点的向量包含14个以上(例如15个元素),则会导致以下问题:

terminated by signal SIGSEGV (Address boundary error)

,如果有16个元素:

** On entry to  DGESV parameter number  4 had an illegal value

我所做的:几乎每个具有相同结果的标志都尝试过,尝试了不同的条件-相同的结果,进行了搜索-互联网上没有类似的问题。我检查了foundChessboardCorners的角落,它们都是正确的。

我发现calibrateCamera使用了lapack库,但我并不真正认为问题出在该区域。

我也尝试过calibrateCameraChAruco,它的限制要小得多,仅适用于2张图像。

这是我的代码,它适用于14张图像(给出正确结果的地方),而不适用于15张或更多图像:

void calibrate(string path,Size checkerboard)
{
    auto images = getimages(path) ;

    vector<vector<Point3f> > objpoints;
    vector<vector<Point2f> > imgpoints;
    auto objp = obj_maker( checkerboard) ;

    cv::Mat frame,gray;
    std::vector<cv::Point2f> corner_pts;

    for( int i{0} ; i < (int)images.size() && i < 17 ; i++ )
    {
        frame = imread(images[i]);
        cvtColor(frame,gray,COLOR_BGR2GRAY);
        if(! findChessboardCorners(gray,checkerboard,corner_pts) ) continue ;

        TermCriteria criteria( TermCriteria::MAX_ITER + TermCriteria::EPS,30,0.001);
        cornerSubPix(gray,corner_pts,Size(11,11),Size(-1,-1),criteria);
        objpoints.push_back(objp);
        imgpoints.push_back(corner_pts);
    }

    if(objpoints.size() < 1) {
        cout << "no chessboards found" ;
        return ; }
    if(objpoints.size() != imgpoints.size() ) {
        cout << "imgpoints != objpoints" ;
        return ; }
    cv::Mat cameraMatrix,distCoeffs,R,T;
    auto CALIB = CALIB_USE_LU ; // CALIB_USE_INTRINSIC_GUESS
    TermCriteria criteria( TermCriteria::MAX_ITER + TermCriteria::EPS,1,1);

    vector<vector<Point3f>> objpointsNew ;
    copy( objpoints.begin(),objpoints.end(),back_inserter( objpointsNew)) ;
    calibrateCameraRO(objpoints,imgpoints,Size(gray.cols,gray.rows),-1,cameraMatrix,T,objpointsNew,CALIB,criteria ) ;
    cout << "cameraMatrix : " << cameraMatrix << endl ;
    cout << "distCoeffs : " << distCoeffs << endl ;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。