OpenCV的findCirclesGrid没有找到圆圈网格

时间:2016-06-02 22:58:01

标签: c++ opencv

我正在尝试用圆网格进行相机校准。我一直没有成功,因为findCirclesGrid总是返回false,即使文件只是一个圆网格。我把它归结为这个简单的程序:

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

这个简单的形象:

grid of circles

即使这样,findCirclesGrid也会返回false。我错过了什么?

2 个答案:

答案 0 :(得分:2)

您已将尺寸()功能中的points_per_rowpoints_per_colum倒置。
根据函数findCirclesGrid()的文档,2 nd 参数patternSize

Size(points_per_row, points_per_colum)

Theferore:

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

答案 1 :(得分:2)

如果它在一个尺寸而不是另一个尺寸上工作,那么你对blob的大小过滤会使你绊倒。您需要创建一个自定义blob检测器,您可以使用最小尺寸,最大尺寸,圆度等进行调整。(尽管尺寸可能是影响您的尺寸),然后将自定义blob检测器作为可选参数传递到findCirclesGrid()函数中

我发现有用的东西是试验opencv及其python绑定。在你试验这些东西的时候,周转时间比每次重新编译要快得多,然后当你把它搞定时,你将设计固化成c ++代码。