2014-12-07 2 views
7

카메라를 보정하려고합니다. 나는 몇 가지 예를 들고 있지만 모두 체스 판의 모서리를 찾지 못한다. 마지막으로 this question 코드를 사용하지만 모서리를 찾을 수 없습니다. 아래 이미지가 있습니다. 나는 그것을 사용하여 모서리를 찾습니다. 이 problem.It가 board_sz는 내부 모서리의 수, 사각형 아닌수를 유지하는 것을 말한다위한OpenCV로 카메라 보정 - findChessboardCorners가 false를 반환합니다.

나는 웹에서 명령을 찾을 수 있습니다. board_sz는 2 차원 객체입니다. 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

코드를 표시하거나 도움을받을 수 없습니다. 내 직감은 당신이 체스 판의 크기를 잘못주고 있다는 것입니다. –

+0

본문을 편집합니다. – zumma

답변

9

시도 크기 (8,6). 사각형을 올바르게 계산하는 것은 다소 혼란 스럽지만 '안쪽'모서리를 계산하십시오.

+0

대단히 감사합니다! – zumma

관련 문제