C++ findChessboardCorners无法用于校准图像
我正试图让OpenCV 2.4.5从我的网络摄像头中识别棋盘格图案。我无法让它工作,所以我决定尝试使用“完美”的图像使其工作: 但它仍然不起作用——PatternFind每次都返回false。有人知道我做错了什么吗C++ findChessboardCorners无法用于校准图像,c++,opencv,computer-vision,camera-calibration,C++,Opencv,Computer Vision,Camera Calibration,我正试图让OpenCV 2.4.5从我的网络摄像头中识别棋盘格图案。我无法让它工作,所以我决定尝试使用“完美”的图像使其工作: 但它仍然不起作用——PatternFind每次都返回false。有人知道我做错了什么吗 #include <stdio.h> #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/calib3d/ca
#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);
}
}
#包括
#包括
#包括
#包括
#包括
使用名称空间cv;
使用名称空间std;
int main(){
大小图案大小(8,8);//中心数
Mat frame=imread(“perfect.png”);//源图像
向量中心;//这将由检测到的中心填充
bool patternfound=findChessboardCorners(框架、图案大小、中心);
通过反复试验,我意识到图案大小应该是7x7,因为它是计算内角的。这个参数必须精确——8x8不起作用,但小于7x7的任何东西也不起作用。棋盘的宽度和高度不能相同,也就是说,它需要不对称。这可能是问题的根源。
这是一个关于使用OpenCV进行相机校准的非常好的教程
下面是我用于校准的代码(经过测试且功能齐全,但是我在自己的一些处理线程中调用了它,您应该在处理循环中调用它,或者在捕获帧时使用的任何东西):
如果你想知道班级成员的情况,这里是我的班级(我写这篇文章的时候IplImage还在):
而不是使用
Size patternsize(8,8);
使用
嗯,当我使用7x7时它工作了,所以我不确定它是否需要不对称。不过,感谢教程链接!你能用对称模式校准并重新映射你的相机吗?我不这么认为。因此,它不工作。可能是findChessboardCorners()成功了,但那不是校准。我只需要角落,而不是完整的校准程序。@CTZStef谢谢你的回答。我试图用对称棋盘校准我的相机时遇到了错误。棋盘必须是不对称的。我重复一遍,棋盘必须是不对称的。告诉我你如何可能校准其他棋盘e、 @laurenelizabeth你的回答让我更接近了一步,但我似乎仍然有同样的问题。关于7x7而不是8x8的提示对我来说非常重要。但是我仍然无法检测到拍摄的棋盘的角,即使是在接近完美的照片上。我们正在尝试使用非对称9x7棋盘,我们要求8x6(室内广场)它只是工作得很快。没有问题。我们使用的是双摄像头,我们只考虑两个相机同时检测到的东西。谢谢!!!CTZSTF。如果你说你不能用正方形板来校准,我想OpenCV有可能有这个限制,但它绝对不是真的。ter vision一般来说,很有可能使用上面有(n x n)个正方形的棋盘进行校准。如果你是说你不能使用完全上下的棋盘(即,使用非最小对角线或倾斜的棋盘)精确校准,那么是的,我同意。我使用5x3图案,它很有效。选择图案的最佳方法是选择一个矩形板,并选择至少1个偶数的棋盘角。openCV的唯一限制是它应该大于2x2为什么?它是8x8grid@johnktejik它寻找两个白色正方形和两个黑色正方形所在的点是的,有8个正方形乘8个正方形,但是只有7x7个点与4个正方形相连。
#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);
}
Size patternsize(8,8);
Size patternsize(7,7);