2014-12-07 145 views
7

我尝试校准相机。我举了一些例子,但他们都没有找到棋盘的角落。最后,我使用this question的代码,但它无法找到角点。下面有一张图片。我用它来找到角落。使用OpenCV进行相机校准 - findChessboardCorners返回false

我在网上找到一个命令为这个problem.It说board_sz必须持有内角的数量,而不是格数的。 board_sz是一个二维对象。我不明白我怎样才能使用它来保存除了h * w之外的内角的数量。

我给W = 9,H = 7

编辑1 ** ** 代码:

#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; 
} 

图片:

enter image description here

+0

向我们显示代码,或者我们无法帮到你。我的直觉是你的棋盘大小错了。 – 2014-12-07 22:16:18

+0

我编辑我的文本。 – zumma 2014-12-07 22:29:41

回答

9

尝试尺寸( 8,6)。计算正确的方格有点令人困惑,但尝试并计算“内侧”角点。

+0

非常感谢! – zumma 2014-12-07 23:27:45