2 개의 640x360px mp4 테스트 파일로 변환 된 panasonic z10000 3D 카메라의 출력을 보정하려고합니다.OpenCV의 stereoCalibrate 기능으로 인한 오류
- 난 더 많은 프로그래머보다 디자이너 그래서 일부 supid 오류
내 코드가 좋아 보인다 생각실례하시기 바랍니다 (내가 대학에있는 수학 과목이 없었어요),하지만 난하지 않습니다 교정 프로세스에서 좋은 결과 stereoCalibrate의 투영 오류는 약 6-20이지만, < 0.3이어야합니다 (여기에서 읽음)
나는 imagePoints 및 objectPoints에 문제가있는 것으로 보입니다. 나는 그것을 이해할 수 없다.
는 chessBoardCorners을 찾은 후 나는 교정
전체 프로그램 (매핑, disparitymap) 작동 후를 다시로드 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;
는