2016-06-02 8 views
1

Ich versuche eine Kamerakalibrierung mit einem Gitter aus Kreisen durchzuführen. Ich bin nicht erfolgreich gewesen, weil findCirclesGrid immer false auch mit einer Datei zurückgibt, die nichts als ein Gitter der Kreise ist. Ich habe es eingekocht zu diesem einfachen Programm:OpenCVs findCirclesGrid findet kein Gitter aus Kreisen

#include <iostream> 

#include "opencv2/core.hpp" 
#include "opencv2/imgproc.hpp" 
#include "opencv2/highgui.hpp" 
#include "opencv2/calib3d.hpp" 

using namespace std; 
using namespace cv; 

int main(int argc, char *argv[]) { 
    Mat image; 
    // read an image 
    if (argc < 2) 
     image = imread("circleGridSmall.jpg"); 
    else 
     image = imread(argv[1]); 

    if (!image.data) { 
     cout << "Image file not found\n"; 
     return 1; 
    } 

    imshow("image", image); 
    waitKey(0); 

    bool found; 
    vector<Point2f> pointbuf; 

    found = findCirclesGrid(image, Size(8, 12), pointbuf); 
    printf("found: %d\n", found); 
    return 0; 
} 

Und dieses einfache Bild:

grid of circles

Auch mit diesem, findCirclesGrid false zurück. Was vermisse ich?

Antwort

1

Sie haben die points_per_row und points_per_colum in Größe() Funktion invertiert.
Nach der Dokumentation der Funktion findCirclesGrid(), 2 nd Parameter patternSize ist

Size(points_per_row, points_per_colum) 

Theferore:

// not 
found = findCirclesGrid(image, Size(8, 12), pointbuf); 
// but 
found = findCirclesGrid(image, Size(12, 8), pointbuf); 
+0

Das ist die Ursache für dieses Bild, aber leider ist das nicht das einzige Problem. Mein Originalbild ist 3264 x 2448. Ich habe es für diesen Beitrag geschrumpft. 'findCirclesGrid' findet die Kreise im Bild in voller Größe nicht. Als Test nannte ich 'findCirclesGrid' auf meinen Fotos, nachdem ich sie um 75% reduziert hatte und die Kreise gefunden hatte. Es gibt also scheinbar undokumentierte maximale Bildgröße, mit denen es arbeiten wird oder es ist nur ein Fehler. – SSteve

+0

Ich habe einige Tests gemacht und sobald das Bild auf 2448 x 1836 kam, konnte 'findCirclesGrid' keine Kreise finden. – SSteve

1

Wenn in einer Größe und nicht an einem anderen funktioniert, dann Ihre Größe Filterung auf die Blobs stolpert dich hoch. Sie müssen einen benutzerdefinierten Blob-Detektor erstellen, den Sie mit Min-Size, Max-Size, Circularity usw. optimieren. (Obwohl die Größe wahrscheinlich diejenige ist, die Sie beeinflusst), übergeben Sie den benutzerdefinierten Blob-Detektor als optionalen Parameter an Ihre findCirclesGrid() - Funktion .

Anthere Sache, die ich nützlich gefunden habe, ist mit opencv und seine Python-Bindungen zu experimentieren. Die Bearbeitungszeit ist viel schneller als jedes Mal neu zu kompilieren, während Sie mit solchen Dingen experimentieren, dann, wenn Sie es ausgemacht haben, festigen Sie das Design in C++ - Code.

Verwandte Themen