1

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

-我更像是一个设计师而不是一个程序员(我在大学里从来没有任何数学科目)所以请原谅我的一些愚蠢的错误

我认为我的代码看起来不错,但我在校准过程中没有得到好的结果,stereoCalibrate 的投影误差约为 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;

谢谢

4

1 回答 1

0

cornerSubPix()可以产生比 plain 更差的结果findChessboardCorners()。尝试不使用它。您应该在图像窗口中看到找到的角,以及它们与图片的匹配程度。

除此之外,您的代码看起来还可以。

于 2014-02-25T00:17:14.330 回答