C++ 使用opencv进行摄像机校准(断言失败故障)

C++ 使用opencv进行摄像机校准(断言失败故障),c++,opencv,camera-calibration,C++,Opencv,Camera Calibration,我正在尝试使用opencv相机校准功能获取相机校准参数。我有一个视频,试图找到校准参数,并找到视频中的点,其中包括不同条件下的棋盘。但是我还没有通过校准阶段。我可以找到棋盘的一角,并在openCV窗口中显示它们,但当涉及到线条时: calibrateCamera(objectPoints,imagePoints..............) 它抛出异常并停止 我得到以下错误:OpenCV错误:断言失败0&&nimages==int-imagePoints1.total()&& 这是我的密码:

我正在尝试使用opencv相机校准功能获取相机校准参数。我有一个视频,试图找到校准参数,并找到视频中的点,其中包括不同条件下的棋盘。但是我还没有通过校准阶段。我可以找到棋盘的一角,并在openCV窗口中显示它们,但当涉及到线条时:

calibrateCamera(objectPoints,imagePoints..............) 
它抛出异常并停止

我得到以下错误:OpenCV错误:断言失败0&&nimages==int-imagePoints1.total()&& 这是我的密码:

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "C:/opencv/include/opencv/cv.h"

#include <iostream>
#include <math.h>

using namespace cv;
using namespace std;

std::vector<cv::Point2f> imageCorners;
std::vector<cv::Point3f> objectCorners;
std::vector<std::vector<cv::Point3f>> objectPoints;
std::vector<std::vector<cv::Point2f>> imagePoints;

void addPoints(const std::vector<cv::Point2f>&imageCorners, const std::vector<cv::Point3f>& objectCorners)
{
// 2D image points from one view
imagePoints.push_back(imageCorners);
// corresponding 3D scene points
objectPoints.push_back(objectCorners);
}
int main()
{

int key;
cv::Mat   image;
cv::Mat   gray_image;

VideoCapture cap("here goes path of the file"); 
   if (!cap.isOpened())  // check if we succeeded
       cout<<"failed";
else
   cout<<"success";

    cvNamedWindow( "video",0);

cv::Size boardSize(8,6);
// output Matrices
cv::Mat cameraMatrix;
std::vector<cv::Mat> rvecs, tvecs;
cv::Mat distCoeffs;

for (int i=0; i<boardSize.height; i++) 
{
    for (int j=0; j<boardSize.width; j++) 
    {
        objectCorners.push_back(cv::Point3f(i, j, 0.0f));
    }
}
int frame=1;
int corner_count=0;
while(1) 
{
    if(cap.read(image))
    {
        frame++;
        if(frame%20==0)
        {
            if(waitKey(30) >= 0) break;

            bool found = cv::findChessboardCorners(image, boardSize, imageCorners);

            cvtColor( image, gray_image, CV_RGB2GRAY );


                addPoints(imageCorners, objectCorners);

            //bool found = cv::findChessboardCorners(image,boardSize, imageCorners);
            cv::drawChessboardCorners(gray_image,boardSize, imageCorners,found);
            imshow( "video",  gray_image );
        }
    }
    else
        break;

}
int flag=0;
std::string text="";

for (int i=1; i<imagePoints.size();i++)
{
    std::stringstream out;
    out << imagePoints[i];
    text=out.str();
    cout<<text<<endl;

}

calibrateCamera(objectPoints,imagePoints,gray_image.size(), cameraMatrix, distCoeffs, rvecs, tvecs, flag);

return 0;

}
#包括“opencv2/imgproc/imgproc.hpp”
#包括“opencv2/highgui/highgui.hpp”
#包括“C:/opencv/include/opencv/cv.h”
#包括
#包括
使用名称空间cv;
使用名称空间std;
std::矢量图像角点;
std::向量对象角点;
向量对象点;
std::向量图像点;
void addPoints(const std::vector&imageCorners、const std::vector&objectCorners)
{
//一个视图中的二维图像点
图像点。向后推(图像角);
//对应的三维场景点
objectPoints.push_back(objectCorners);
}
int main()
{
int键;
cv::Mat图像;
cv::Mat灰度图像;
VideoCapture(“文件路径在此显示”);
if(!cap.isopend())//检查我们是否成功

如果无法打印所有
std::vector
的大小,我怀疑您正在向该函数传递一个空向量

编辑:

我在中分享了一些关于如何进行摄像机校准的说明。这些参考资料包括可用的源代码。您可能需要对这些程序进行一些小的调整,以便它们可以与视频一起工作。

您应该看看以下内容:

它说您的源棋盘视图必须是8位灰度或彩色图像。 所以你必须使用这个:
bool found=cv::findChessboardCorners(灰度图像、boardSize、imageCorners);

我检查了所有向量(objectpoints和imagepoints)。它们不是空的。其他向量应该已经是空的。