C++ opencv错误:校准相机时convert.cpp(opencv)中的断言失败

C++ opencv错误:校准相机时convert.cpp(opencv)中的断言失败,c++,visual-studio-2010,opencv,windows-7,camera-calibration,C++,Visual Studio 2010,Opencv,Windows 7,Camera Calibration,我尝试校准相机(opencv 2.3.1,VS 2010和windows 7),但当我编译程序时,出现了一个opencv错误,错误是“断言失败:dst.channels>在未知函数中,文件…modules\core\src\convert.cpp,第1277行” 这里是代码的一部分 CvMat* image_points = cvCreateMat(n_boards*board_total,2,CV_32FC1); CvMat* object_points = cvCreate

我尝试校准相机(opencv 2.3.1,VS 2010和windows 7),但当我编译程序时,出现了一个opencv错误,错误是“断言失败:dst.channels>在未知函数中,文件…modules\core\src\convert.cpp,第1277行”

这里是代码的一部分

CvMat* image_points      = cvCreateMat(n_boards*board_total,2,CV_32FC1);
CvMat* object_points     = cvCreateMat(n_boards*board_total,3,CV_32FC1);
CvMat* point_counts      = cvCreateMat(n_boards,1,CV_32SC1);
CvMat* intrinsic_matrix  = cvCreateMat(3,3,CV_32FC1);
CvMat* distortion_coeffs = cvCreateMat(4,1,CV_32FC1);

for ( int ig = 0; ig< n_boards; ig++ ) 
{ 

image= cvLoadImage(names[ig],CV_LOAD_IMAGE_COLOR);  // load image

cvNamedWindow("imageessai", 1);
cvShowImage("imageessai", image);
cvWaitKey(0);
cvDestroyWindow("imageessai");

for (int ik=0; ik<n_boards; ik++)

{       
int found = cvFindChessboardCorners(image, board_sz, corners,        &corner_count,CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS );
cvFindCornerSubPix(gray_image, corners, corner_count, cvSize(11,11),cvSize(-1,-1), cvTermCriteria( CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 30, 0.1 ));
cvDrawChessboardCorners(image, board_sz, corners, corner_count, found); 

        if( corner_count == board_total ) 
        {

            step= ig*board_total;
            for( int i=step,j=0  ; j<board_total; j++, i++)
                        {

        CV_MAT_ELEM(*image_points, float,i,0) = corners[j].x;
        CV_MAT_ELEM(*image_points, float,i,1) = corners[j].y;
        CV_MAT_ELEM(*object_points,float,i,0) = (float) j/board_w;
        CV_MAT_ELEM(*object_points,float,i,1) = (float) (j%board_w);
        CV_MAT_ELEM(*object_points,float,i,2)=0.0f;
                            }

        CV_MAT_ELEM (*point_counts, int,ig,0) = board_total;  

    printf("\n %d successful Snapshots out of %d collected.\n",ig+1,n_boards);

            }   
    } 

CvMat* object_points2  = cvCreateMat(n_boards*board_total,3,CV_32FC1);
CvMat* image_points2   = cvCreateMat(n_boards*board_total,2,CV_32FC1);
CvMat* point_counts2   = cvCreateMat(n_boards,1,CV_32SC1);

for(int i = 0; i<n_boards*board_total; ++i)
{
  CV_MAT_ELEM( *image_points2, float, i, 0) =CV_MAT_ELEM( *image_points, float, i, 0);
  CV_MAT_ELEM( *image_points2, float,i,1)  =CV_MAT_ELEM( *image_points, float, i, 1);
  CV_MAT_ELEM(*object_points2, float, i, 0) = CV_MAT_ELEM(*object_points, float, i,0) ;
  CV_MAT_ELEM( *object_points2, float, i, 1)= CV_MAT_ELEM(*object_points, float, i,1) ;
  CV_MAT_ELEM( *object_points2, float, i, 2)= CV_MAT_ELEM(*object_points, float, i,2) ;
} 

for(int i=0; i<n_boards; ++i)
{ 
    CV_MAT_ELEM( *point_counts2, int, i, 0)=CV_MAT_ELEM(*point_counts,int,i,0);         

}
cvReleaseMat(&object_points);
cvReleaseMat(&image_points);
cvReleaseMat(&point_counts);


CV_MAT_ELEM( *intrinsic_matrix, float, 0, 0 ) = 1.0f;
CV_MAT_ELEM( *intrinsic_matrix, float, 1, 1 ) = 1.0f;
CvMat* rvec = cvCreateMat(n_boards,3,CV_32F);//matrice de rotation
CvMat* tvec = cvCreateMat(n_boards,3,CV_32F);//matrice de translation
CvMat* H = cvCreateMat(1,3,CV_32FC1);


cvCalibrateCamera2(object_points2, image_points2, point_counts2,  sizeim, intrinsic_matrix, distortion_coeffs, rvec, tvec,0 );

cvFindHomography(object_points2,image_points2,H,0,3,NULL);
CvMat*image\u points=cvCreateMat(n个电路板*电路板总数,2个,CV\u 32FC1);
CvMat*object\u points=cvCreateMat(n个电路板*电路板总数,3个,CV\u 32FC1);
CvMat*点计数=cvCreateMat(n块电路板,1,CV_32SC1);
CvMat*固有矩阵=cvCreateMat(3,3,CV_32FC1);
CvMat*畸变系数=cvCreateMat(4,1,CV_32FC1);
对于(int ig=0;ig
似乎您将错误类型(错误通道数)的图像传递给了一个cv函数。从您的描述很难说,但我猜它发生在cvCalibrateCamera2或CVFindHomography中

断言听起来也像是运行时错误,而不是复杂时间错误

如果是运行时错误,则必须检查传递给这些函数的映像是否具有正确的设置(通道、相同大小等)。这是编译器无法为您检查的,因为这些参数是动态的

您可以有条理地对某些函数进行注释(以调试代码),并查看程序是否仍能正常工作,以防在使用调试器查找代码的确切中断位置时遇到困难。隔离调用后,请查看文档,了解它期望作为映像参数的内容,您应该找到正确的解决方法


校准是一个多步骤的过程(抓取图像、提取特征、计算单应性、计算内、外摄像机参数)。它也很难理解(数学方面)所以不要放弃。OpenCV校准函数通常工作得很好。

调试按钮未激活,解决方案项目的重新扫描按钮未激活,因此我无法编译或调试程序samples\cpp\calibration.cpp

如果您可以提供抛出断言的行/方法,那将非常有用。看起来您将错误类型(通道数错误)的图像传递到其中一个cv函数。根据您的描述,很难说,但我猜它发生在cvCalibrateCamera2或CVFindHomography中。感谢您的回答,我添加了一条注释,然后错误直接出现在cvCalibrateCamera2()之前,即JPEG图像(640*452)保存在计算机磁盘上的是在代码中声明的:const char*names[15];names[0]=“calib1.jpg”…names[11]=“calib12.jpg”;然后我声明image=cvLoadImage(names[ig],CV\u LOAD\u image\u COLOR);这将是一个非常复杂的问题,你的回答仍然不知道这是编译错误还是运行时错误,以及是哪个方法引发的。请你说得更具体一些。这是一个运行时错误,棋盘的角被画出来了,但校准没有成功;我的结果是:角。[1]x=364498,角[1].y=167.84图像点[1.0]=0.0000,图像点[1.1]=0.00000对象点[1.0]=0.0000,对象点[1.1]=0.00000,但代码为CV点材质元素(*图像点,浮点,i,0)=角[i]。x;CV点材质元素(*图像点,浮点,i,1)=角[i]。y CV点材质元素(*对象点,浮点,i,0)=(浮点)j/board_w;CV_MAT_ELEM(*对象点,浮点,i,1)=(浮点)(j board_w%);我如何更正这些结果?校准示例在您的系统上工作吗(samples/cpp/calibration.cpp)?我建议您投入大量精力使该示例工作,因为一旦编译并工作,它将演示如何在一组示例图像上进行校准。您将能够参考示例代码和图像。