2013-07-16 58 views
9

OpenCV 2.4.5で私のウェブカメラのチェッカーボードパターンを認識しようとしています。私はその作業を得ることができませんでしたので、私はそれだけで「完璧な」イメージを使用して作業を取得しようとすることを決めた:findChessboardCornersが較正に失敗する

checkerboard with white border

が、それはまだ動作しません - PATTERNFOUNDは毎回falseを返します。誰かが私が間違っていることを知っていますか?

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

int main(){ 
    Size patternsize(8,8); //number of centers 
    Mat frame = imread("perfect.png"); //source image 
    vector<Point2f> centers; //this will be filled by the detected centers 

    bool patternfound = findChessboardCorners(frame,patternsize,centers); 

    cout<<patternfound<<endl; 
    drawChessboardCorners(frame, patternsize, Mat(centers), patternfound); 

    cvNamedWindow("window"); 
    while(1){ 
     imshow("window",frame); 
     cvWaitKey(33); 
    } 
} 

答えて

14

試行錯誤を経て、内部コーナーをカウントしているのでパターンサイズは7x7でなければならないことに気付きました。このパラメータは正確でなければなりません.8x8は動作しませんが、7x7未満のものはありません。

+3

を使用。私は繰り返し、チェス盤は非対称である必要があります。他の方法で校正する方法を教えてください。 – CTZStef

+0

@laurenelizabethあなたの答えは私を一歩近づけましたが、私は同じ問題をまだ持っているようです。 8x8の代わりに約7x7のヒントが私にとって非常に重要でした。しかし、私はまだ完全に近くの写真でも、撮影されたチェス盤の角を検出することはできません。 –

+0

私たちは非対称9x7チェス盤を試しており、8x6(インテリアスクエア)を求めています。それはちょうど本当に速く働いた。検出に問題はありません。そして、我々は、両方のカメラが同時に物を検出するときにのみ考慮するダブルカメラを使用しています。 感謝!!! – helios

2

チェス盤の幅と高さは同じ長さにすることはできません。つまり、それは非対称である必要があります。これはあなたの問題の原因かもしれません。 Hereは、OpenCVを使用したカメラキャリブレーションに関する非常に優れたチュートリアルです。

ちょうど私の校正に使用するコードです(テスト済みで完全に機能していますが、自分の処理スレッドで呼び出していますが、処理ループやフレームをキャッチするために使用してください) :あなたはここで、クラスメンバーについて疑問に思って念のために

void MyCalibration::execute(IplImage* in, bool debug) 
{ 
    const int CHESSBOARD_WIDTH = 8; 
    const int CHESSBOARD_HEIGHT = 5; 
    const int CHESSBOARD_INTERSECTION_COUNT = CHESSBOARD_WIDTH * CHESSBOARD_HEIGHT; 

    //const bool DO_CALIBRATION = ((BoolProperty*)getProperty("DoCalibration"))->getValue(); 
    if(in->nChannels == 1) 
     cvCopy(in,gray_image); 
    else 
     cvCvtColor(in,gray_image,CV_BGR2GRAY); 

    int corner_count; 
    CvPoint2D32f* corners = new CvPoint2D32f[CHESSBOARD_INTERSECTION_COUNT]; 
    int wasChessboardFound = cvFindChessboardCorners(gray_image, cvSize(CHESSBOARD_WIDTH, CHESSBOARD_HEIGHT), corners, &corner_count); 

    if(wasChessboardFound) { 
     // Refine the found corners 
     cvFindCornerSubPix(gray_image, corners, corner_count, cvSize(5, 5), cvSize(-1, -1), cvTermCriteria(CV_TERMCRIT_ITER, 100, 0.1)); 

     // Add the corners to the array of calibration points 
     calibrationPoints.push_back(corners); 

     cvDrawChessboardCorners(in, cvSize(CHESSBOARD_WIDTH, CHESSBOARD_HEIGHT), corners, corner_count, wasChessboardFound); 
    } 
} 

は(IplImageでは、私はそれを書いた時に周りにまだあった)私のクラスである:

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv/cv.h> 

class MyCalibration 
{ 
private: 
    std::vector<CvPoint2D32f*> calibrationPoints; 

    IplImage *gray_image; 

public: 
    MyCalibration(IplImage* in); 
    void execute(IplImage* in, bool debug=false); 
    ~MyCalibration(void); 
}; 

そして最後に、コンストラクタ:

MyCalibration::MyCalibration(IplImage* in) 
{ 
    gray_image = cvCreateImage(cvSize(in->width,in->height),8,1); 
} 
+4

7x7を使用したときにうまくいきましたので、非対称である必要があるかどうかはわかりません。しかし、チュートリアルのリンクをありがとう! – laurenelizabeth

+1

対称パターンでカメラのキャリブレーションと再マップができましたか?私はそうは思わない。したがって、それは動作しませんでした。たぶんfindChessboardCorners()がうまくいくかもしれませんが、それは校正ではありません。 – CTZStef

+0

私はちょうどコーナーを必要としました。完全な較正ルーチンではありません。 – laurenelizabeth

8

代わりのチェス盤が非対称であることが必要

Size patternsize(8,8); 

使用

Size patternsize(7,7); 
関連する問題