2013-10-16 1 views
1

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; 

답변

0

cornerSubPix() 일반 findChessboardCorners()보다 더 나쁜 결과를 생성 할 수 있습니다 감사합니다. 그것을 사용하지 않으십시오. 발견 된 구석과 이미지 창과 이미지가 얼마나 일치하는지보아야합니다.

이외의 코드는 괜찮습니다.