c++ - 校准相机时 opencv 错误 : assertion failed in convert. cpp (opencv)

标签 c++ visual-studio-2010 opencv windows-7 camera-calibration

我尝试校准相机(opencv 2.3.1、VS 2010 和 Windows 7),但是当我编译我的程序时,出现 opencv 错误

"Assertion Failed:<src.size==dst.size && src.channels<>dst.channels<>> in unknown function , file ....modules \core\src\convert.cpp, line 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);

我多次尝试解决这个问题,我需要帮助。

最佳答案

(我打开我的评论作为答案,因为 Nabiha 可能无法用 1 个代表回答评论。)

您似乎将错误类型(错误的 channel 数)的图像传递给其中一个 cv 函数。从你的描述中很难说,但我猜它发生在 cvCalibrateCamera2 或 cvFindHomograpy 中。

断言听起来也像是运行时错误而不是编译时错误。

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

您可以有条不紊地注释某些函数(以调试您的代码)并查看您的程序是否仍然有效,以防您无法使用调试器找出代码中断的确切位置。隔离调用后,检查文档以了解它期望作为图像参数的内容,您应该在正确的轨道上解决这个问题。

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

关于c++ - 校准相机时 opencv 错误 : assertion failed in convert. cpp (opencv),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12217666/

相关文章:

c++ - 如何更改我的应用程序使用的 .dll 搜索路径?

python - 如何为 OpenCV 级联训练选择纵横比?

c++ - boost 属性 ptree : boost write_xml adding unicode 0x0 character in child element in xml file

c++ - 如何在 std::unique_ptr 的 std::vector 上使用remove_if?

c++ - 如何在现代 C++ 中表达引用关系而不表达所有权?

visual-studio-2010 - 调试使用 Microsoft Azure 服务的 Windows CE 应用程序

visual-studio-2010 - 我可以让 Visual Studio 将花括号与 if 语句(在 HTML 中)放在同一行吗?

c++ - SAL 注释,使用哪一个?

c++ - 函数返回和使用 copyTo 中的 OpenCV Mat

c++ - OpenCV tracking.hpp 在哪里