我正在尝试用圆网格进行相机校准。我一直没有成功,因为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;
}
这个简单的形象:
即使这样,findCirclesGrid
也会返回false。我错过了什么?
答案 0 :(得分:2)
您已将尺寸()功能中的points_per_row
和points_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 ++代码。