我正在尝试校准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;
谢谢
答案 0 :(得分:0)
cornerSubPix()
可能会产生比普通findChessboardCorners()
更糟糕的结果。尽量不要使用它。你应该在图像窗口中看到找到的角落,以及它们与图片的匹配程度。
除此之外,您的代码看起来还不错。