Ошибки с функцией stereoCalibrate в OpenCV

Я пытаюсь откалибровать вывод 3D-камеры panasonic z10000, преобразованной в два тестовых файла 640x360px mp4.

-Я больше дизайнер, чем программист (у меня в колледже никогда не было математических предметов), поэтому, пожалуйста, извините меня за некоторые сверхъестественные ошибки

Я думаю, что мой код выглядит хорошо, но я не получаю хороших результатов в процессе калибровки, ошибка проекции stereoCalibrate составляет около 6-20, но она должна быть <0,3 (я читал здесь)

Я предполагаю, что что-то не так с imagePoints и objectPoints, но я не могу этого понять.

После того, как я нашел ChessBoardCorners, я отпускаю видеозахват, чтобы перезагрузить его после калибровки.

Вся программа (переназначение, карта диспаратности) работает, но результаты плохие.

//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;

Спасибо


person Dabrunsch    schedule 16.10.2013    source источник


Ответы (1)


cornerSubPix() может дать худшие результаты, чем простой findChessboardCorners(). попробуй не использовать это. вы должны увидеть найденные углы и насколько хорошо они совпадают с изображением в окнах изображений.

в остальном ваш код выглядит нормально.

person Christoph Rackwitz    schedule 25.02.2014