Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ findChessboardCorners无法用于校准图像_C++_Opencv_Computer Vision_Camera Calibration - Fatal编程技术网

C++ findChessboardCorners无法用于校准图像

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

我正试图让OpenCV 2.4.5从我的网络摄像头中识别棋盘格图案。我无法让它工作,所以我决定尝试使用“完美”的图像使其工作:

但它仍然不起作用——PatternFind每次都返回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);
    }
}
#包括
#包括
#包括
#包括
#包括
使用名称空间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);