OpenCV calibrateCamera () Assertion fehlgeschlagen

Ich habe eine ganze Weile versucht, meine Kamera mit der Opencv-Funktion calibrateCamera () zu kalibrieren. Ich habe das gleiche Verfahren wie im opencv-Beispielprogramm ausgeführt. Ich versuche zuerst 10 9 x 6 Schachbrettbilder zu laden. Dann finden Sie Schachbrettecken. Wenn Ecken gefunden werden, wird die Pixelposition der Ecken in vector <vector <Point2f >> ImagePoints gespeichert. Nachdem dies für alle Bilder durchgeführt wurde, wird der runCalibrationAndSave-Teil ausgeführt. In runCalibrationAndSave wird der erste runCalibration-Teil ausgeführt, bei dem ObjectPoints (vom Typ vector <vector <Point3f >>) mit den tatsächlichen Koordinatenwerten der Ecken gefüllt werden. Bis zu diesem Punkt funktioniert der Code gut und es tritt kein Problem auf. Schachbrettecken werden genau gefunden, und der ImagePoints-Vektor wird auch mit Vektoren gefüllt. Aber wenn es um calibrateCamera () geht, schlägt OpenCV :: assertion mit folgendem Fehler fehl:

OpenCV Fehler:

Assertion fehlgeschlagen (nimages> 0 && nimages == (int) imagePoints1.total () && (! ImgPtMat2 || nimages == (int) imagePoints2.total ())) in collectCalibrationData, file / ....... ..... / modules / calib3d / src / calibration.cpp, Zeile 3164

Ich habe einige Nachforschungen für dasselbe Problem angestellt und festgestellt, dass dieses Problem normalerweise auftritt, wenn der ObjectPoints-Vektor und der ImagePoints-Vektor nicht gleich lang sind oder wenn sie nicht richtig gefüllt sind. Aber in meinem Fall habe ich im Debugging-Modus überprüft, dass beide Vektoren richtig mit gleicher Länge gefüllt sind. Als Referenz habe ich den Codeteil angehängt, der vor dem calibrateCamera () - Teil ordnungsgemäß ausgeführt wird, und dann ist die Bestätigung fehlgeschlagen.

#include <iostream>
#include <sstream>
#include <time.h>
#include <stdio.h>

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <opencv2/highgui/highgui.hpp>


using namespace cv;
using namespace std;
class Settings
{public:
Size boardSize;            
float squareSize;          


};
bool runCalibrationAndSave(Settings& s, Size imageSize, Mat&  cameraMatrix, Mat& distCoeffs,
                       vector<vector<Point2f> > imagePoints );

int main()
{
Settings s;
s.boardSize.width =9;
s.boardSize.height=6;
s.squareSize=50;
  Mat cameraMatrix, distCoeffs;
Size imageSize;
char filename[512];
vector<vector<Point2f> > imagePoints;
for(int counter=0; counter<10; counter++)        
{sprintf( filename, "chessboard%d.jpg", counter );

IplImage* img = cvLoadImage(filename);


 cv::Mat& m = cv::cvarrToMat(img);

Mat pointBuf = Mat::zeros(54,2,CV_32FC1);
vector<Point2f> pointBuf_vec;

bool found=false;


found = findChessboardCorners( m,s.boardSize, pointBuf,CV_CALIB_CB_ADAPTIVE_THRESH |    CV_CALIB_CB_FAST_CHECK | CV_CALIB_CB_NORMALIZE_IMAGE);
if(found)
{
cout<<"check"<<endl;
Mat viewGray;
                cvtColor(m, viewGray, CV_BGR2GRAY);
                cornerSubPix( viewGray, pointBuf, Size(11    ,11),Size(-1,-1),         TermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 30, 0.1 ));
 drawChessboardCorners( m, s.boardSize, Mat(pointBuf), found );


pointBuf_vec.clear();

 for(int i=0;i<54;i++)
 {
 Point2f temp;
 temp.x=pointBuf.at<float>(i,0);
 temp.y=pointBuf.at<float>(i,1);
 pointBuf_vec.push_back(temp);

 }

 imagePoints.push_back(pointBuf_vec);




}


imshow("Example1",m);
cvWaitKey(); 

imageSize = m.size();
}
runCalibrationAndSave(s, imageSize,  cameraMatrix, distCoeffs, imagePoints);
return 0;


}



static void calcBoardCornerPositions(Size boardSize, float squareSize,     vector<Point3f>& corners)

{
corners.clear();

    for( int i = 0; i < boardSize.height; i++ )
        for( int j = 0; j < boardSize.width; j++ )
           { corners.push_back(Point3f(float( j*squareSize ), float( i*squareSize ), 0));

        }

}

 static bool runCalibration( Settings& s, Size& imageSize, Mat& cameraMatrix, Mat&   distCoeffs,
                        vector<vector<Point2f> > imagePoints, vector<Mat>& rvecs,   vector<Mat>& tvecs,
                        vector<float>& reprojErrs,  double& totalAvgErr)

 {

cameraMatrix = Mat::eye(3, 3, CV_64F);
 //   if( s.flag & CV_CALIB_FIX_ASPECT_RATIO )
 //      cameraMatrix.at<double>(0,0) = 1.0;

  distCoeffs = Mat::zeros(8, 1, CV_64F);

  vector<vector<Point3f> > objectPoints;
  Mat object_pointBuf = Mat::zeros(s.boardSize.width*s.boardSize.height,3,CV_32FC1);
    vector<Point3f> object_pointBuf_vec;

  calcBoardCornerPositions(s.boardSize, s.squareSize, object_pointBuf_vec);
  for(int k=0;k<imagePoints.size();k++)
  {
    objectPoints.push_back(object_pointBuf_vec);
  }





 // objectPoints.resize(imagePoints.size(),objectPoints[0]);

  //Find intrinsic and extrinsic camera parameters
  double rms = calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix,
                             distCoeffs, rvecs, tvecs, /*s.flag|*  /CV_CALIB_FIX_K4|CV_CALIB_FIX_K5);

  cout << "Re-projection error reported by calibrateCamera: "<< rms << endl;

  bool ok = checkRange(cameraMatrix) && checkRange(distCoeffs);

 //   totalAvgErr = computeReprojectionErrors(objectPoints, imagePoints,
                                  //       rvecs, tvecs, cameraMatrix, distCoeffs,   reprojErrs);

  return ok;
}



bool runCalibrationAndSave(Settings& s, Size imageSize, Mat&  cameraMatrix, Mat&     distCoeffs,vector<vector<Point2f> > imagePoints )

{
vector<Mat> rvecs, tvecs;
vector<float> reprojErrs;
double totalAvgErr = 0;

 bool ok = runCalibration(s,imageSize, cameraMatrix, distCoeffs, imagePoints, rvecs,   tvecs,
                         reprojErrs, totalAvgErr);
  cout << (ok ? "Calibration succeeded" : "Calibration failed")
    << ". avg re projection error = "  << totalAvgErr ;


 return ok;
} 

Ich verwende Visual C ++ und Opencv 2.4.9. Bitte helfen Sie mir, das Problem herauszufinden. Dies ist das erste Mal, dass ich eine Frage in SO stelle. Bitte lassen Sie mich wissen, wenn ich einen Fehler gemacht habe. Vielen Dank für die Hilfe im Voraus.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage