2014-12-07 22 views
7

Fotoğraf makinemi kalibre etmeye çalışıyorum. Bir örnek verdim ama hepsi satranç tahtasının köşelerini bulamıyor. Son olarak, this question'un kodunu kullanıyorum, ancak köşeleri bulamıyorum. Aşağıda bir görüntü var. Köşeleri bulmak için kullanırım. Bu problem.It board_sz iç köşe sayısı, kareler değilnumarasını tutmak zorundadır söylüyor içinOpenCV ile kamera kalibrasyonu - findChessboardCorners false döndürür

Web üzerinde bir komut bulabilirsiniz. board_sz 2 boyutlu bir nesnedir. Bunu, h * w hariç iç köşe sayısını tutmak için nasıl kullanabilirim anlamıyorum.

w vermek = 9, h = 7

düzenleme 1 ** ** Kodu:

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

Resim:

enter image description here

+0

Bize kodu göster, veya size yardımcı olamayız. Benim hislerim, satranç tahtasının büyüklüğünü yanlış vermenizdir. –

+0

Metnimi düzenliyorum. – zumma

cevap

9

deneyin boyutu (8,6). Kareleri doğru saymak biraz kafa karıştırıcı, ama 'iç' köşeleri deneyin ve sayın.

+0

çok teşekkür ederim! – zumma

İlgili konular