我正在尝试校准转换为两个 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;
谢谢