2014-12-07 25 views
7

Ich versuche, meine Kamera zu kalibrieren. Ich führe ein Beispiel, aber alle finden keine Ecken des Schachbretts. Schließlich verwende ich this question ‚s-Code, aber es kann nicht finden corners.There ist ein Bild unten. Ich benutze es, um Ecken zu finden.Kamerakalibrierung mit OpenCV - findChessboardCorners false zurück

finde ich einen Befehl auf Web für diese problem.It sagt, dass board_sz die Anzahl der inneren Ecken zu halten hat, nicht dieAnzahl der Quadrate. board_sz ist ein 2-dimensionaler object.I nicht verstehen, dass, wie kann ich es verwenden, um die Anzahl der inneren Ecke außer h * w zu halten.

Ich gebe w = 9, h = 7

Edit 1 ** ** Code:

#include <cv.h> 
#include <highgui.h> 
#include <vector> 
#include <stdlib.h> 
#include <stdio.h> 

using namespace cv; 
using namespace std; 

int main() 
{ 
int numBoards = 0; 
int numCornersHor; 
int numCornersVer; 

printf("Enter number of corners along width: "); 
scanf("%d", &numCornersHor); 

printf("Enter number of corners along height: "); 
scanf("%d", &numCornersVer); 

printf("Enter number of boards: "); 
scanf("%d", &numBoards); 

int numSquares = numCornersHor * numCornersVer; 
Size board_sz = Size(numCornersHor, numCornersVer); 
VideoCapture capture = VideoCapture(0); 

vector<vector<Point3d>> object_points; 
vector<vector<Point2d>> image_points; 

vector<Point2d> corners; 
int successes=0; 

Mat image; 
Mat gray_image; 
capture >> image; 

vector<Point3d> obj; 
for(int j=0;j<numSquares;j++) 
    obj.push_back(Point3d(j/numCornersHor, j%numCornersHor, 0.0f)); 

while(successes<numBoards) 
{ 
    cvtColor(image, gray_image, CV_BGR2GRAY); 

    bool found = findChessboardCorners(image, board_sz, corners, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS); 

    if(found) 
    { 
     cornerSubPix(gray_image, corners, Size(11, 11), Size(-1, -1), TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1)); 
     drawChessboardCorners(gray_image, board_sz, corners, found); 
    } 

    imshow("win1", image); 
    imshow("win2", gray_image); 

    capture >> image; 

    int key = waitKey(1); 

    if(key==27) 
     return 0; 

    if(key==' ' && found!=0) 
    { 
     image_points.push_back(corners); 
     object_points.push_back(obj); 
     printf("Snap stored!\n"); 

     successes++; 

     if(successes>=numBoards) 
      break; 
    } 
} 

Mat intrinsic = Mat(3, 3, CV_32FC1); 
Mat distCoeffs; 
vector<Mat> rvecs; 
vector<Mat> tvecs; 

intrinsic.ptr<float>(0)[0] = 1; 
intrinsic.ptr<float>(1)[1] = 1; 

calibrateCamera(object_points, image_points, image.size(), intrinsic, distCoeffs, rvecs, tvecs); 

Mat imageUndistorted; 
while(1) 
{ 
    capture >> image; 
    undistort(image, imageUndistorted, intrinsic, distCoeffs); 

    imshow("win1", image); 
    imshow("win2", imageUndistorted); 

    waitKey(1); 
} 

capture.release(); 

return 0; 
} 

Image:

enter image description here

+0

Zeigen Sie uns den Code, oder wir können Ihnen nicht helfen. Mein Bauchgefühl ist, dass Sie die Größe des Schachbretts falsch angeben. –

+0

Ich bearbeite meinen Text. – zumma

Antwort

9

Try Größe (8,6). Es ist ein wenig verwirrend, die Quadrate korrekt zu zählen, aber versuche die inneren Ecken zu zählen.

+0

vielen dank! – zumma