OpenCV中使用stereoCalibrate函数的错误

时间:2013-10-16 14:26:41

标签: opencv camera-calibration stereo-3d stereoscopy

我正在尝试校准panasonic z10000 3D相机的输出转换为两个640x360px mp4测试文件。

- 我更像是设计师而不是程序员(我从未在大学里学过任何数学科目) 所以请原谅我的一些supid错误

我认为我的代码看起来不错,但我在校准过程中没有得到很好的结果 stereCalibrate的投影误差约为6-20,但它应该是< 0.3(我在这里阅读)

我想我对imagePoints和objectPoints做错了 - 但是我无法理解它。

找到chessBoardCorners后,我发布了Videocapture,在校准后重新加载它

整个程序(重映射,视差图)有效,但结果不好。

//Länge des Vektors zuweisen anhand der Bildpunkte
vector<Point3f> obj;
for(int j=0;j < (Chess_X*Chess_Y);j++)
    obj.push_back(Point3f(j/Chess_X, j%Chess_Y, 0.0f));

//Schleife für Frame Wiedergabe
for(int counterLP= 0; Chess_Found< Chess_Count; counterLP++)
{
    //Übertrage Frame auf Matrix
    capRight>>rMat;
    capLeft>>lMat;

    //Prüfe auf Side by Side Video
    if(vid_input==2 || vid_input==3)
    {
        //Übertrage ROI auf Matrix
        lMat= roi( roiLeft);
        rMat= roi( roiRight);
    }

    //Ausgabe
    //cout<<rMat.cols<<"r"<<rMat.rows<<"\n";
    //cout<<lMat.cols<<"l"<<lMat.rows<<"\n";


    //Farben Konvertieren
    cvtColor( lMat, lMat_grey, CV_RGB2GRAY);
    cvtColor( rMat, rMat_grey, CV_RGB2GRAY);

    //Überprüfe jeden fünften Frame
    if(counterLP%5==0)
    {
        //Suche Schachbrettmuster auf Matrix
        successLeft= findChessboardCorners( lMat_grey, Chess_size, cornersLeft, CALIB_CB_ADAPTIVE_THRESH);
        successRight= findChessboardCorners( rMat_grey, Chess_size, cornersRight, CALIB_CB_ADAPTIVE_THRESH);

        //Wenn Schachbrettmuster gefunden wurde
        if( successLeft && successRight)
        {

            //Muster genauer bestimmen
            cornerSubPix( lMat_grey, cornersLeft, Size( 5, 5),Size( -1, -1),TermCriteria( CV_TERMCRIT_ITER + CV_TERMCRIT_EPS, 50, 0.01 ));
            cornerSubPix( rMat_grey, cornersRight, Size( 5, 5),Size( -1, -1),TermCriteria( CV_TERMCRIT_ITER + CV_TERMCRIT_EPS, 50, 0.01 ));

            //Zeichne Schachbrettmuster
            drawChessboardCorners( lMat, Chess_size, Mat(cornersLeft), successLeft);
            drawChessboardCorners( rMat, Chess_size, Mat(cornersRight), successRight);

            //
            imagePointsLeft.push_back(cornersLeft);
            imagePointsRight.push_back(cornersRight);

            objectPoints.push_back(obj);
            cout << "Punkte gespeichert\n";

            //Zeige Farbbild
            imshow( "Left", lMat);
            imshow( "Right", rMat);

            //Erfolgreich
            Chess_Found++;
            //cout<< Chess_Found << " Muster gefunden!\n";

            //Sicherheitsprüfung
            successLeft= false;
            successRight= false;
        }
    }
    else
    {
        //Zeige graues Bild
        imshow( "Left", lMat_grey);
        imshow( "Right", rMat_grey);
    }

    //33ms verzögerung
    if (waitKey(30) >= 0)
        break;
}

//Schließe Streams
capLeft.release();
capRight.release();

//Schließe Fenster
destroyAllWindows();

//Erzeuge identifizierte Kamera Matrix
Mat camMatLeft = Mat::eye(3, 3, CV_64FC1);
Mat camMatRight = Mat::eye(3, 3, CV_64FC1);

//Erzeuge Distranzkoeffizienten
Mat distCoLeft;
Mat distCoRight;

//Erzeuge Rotationsvektor
Mat rvecs;

//Erzeuge Verschiebungsvektor
Mat tvecs;

//Erzeuge Output essential Matrix
Mat essMat;

//Erzeuge Output fundamental Matrix
Mat funMat;

//Starte Kalibrierung
cout << "Starte Kalibrierung\n";



//Kalibrierung
double s = stereoCalibrate(objectPoints, imagePointsLeft, imagePointsRight, camMatLeft, distCoLeft, camMatRight, distCoRight, Size(640,360), rvecs,  tvecs, essMat, funMat, cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, 1e-5),CV_CALIB_FIX_ASPECT_RATIO+CV_CALIB_ZERO_TANGENT_DIST + CV_CALIB_SAME_FOCAL_LENGTH);
cout <<"Fehler: " <<s<<endl;

谢谢

1 个答案:

答案 0 :(得分:0)

cornerSubPix()可能会产生比普通findChessboardCorners()更糟糕的结果。尽量不要使用它。你应该在图像窗口中看到找到的角落,以及它们与图片的匹配程度。

除此之外,您的代码看起来还不错。