我正在尝试校准转换为两个 640x360 像素 mp4 测试文件的松下 z10000 3D 相机的输出。
-我更像是一个设计师而不是程序员(我在大学里从来没有上过任何数学科目)所以请原谅我一些错误
我认为我的代码看起来不错,但在校准过程中没有得到好的结果立体校准的投影误差约为6-20,但应该<0.3(我在这里阅读)
我想我在图像点和对象点上做错了什么 - 但我无法弄清楚。
找到棋盘角后,我释放视频捕获以在校准后重新加载它
整个程序(重新映射,视差图)有效,但结果很糟糕。
//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 gespeichertn";
//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 Kalibrierungn";
//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;
谢谢
cornerSubPix()
会产生比普通findChessboardCorners()
更糟糕的结果。 尽量不要使用它。 您应该在图像窗口中看到找到的角,以及它们与图片的匹配程度。
除此之外,您的代码看起来还可以。