2012-08-31 155 views
1

我试图校准摄像机(opencv 2.3.1,VS 2010和Windows 7),但是当我编译我的程序,有一个opencv错误是“Assertion Failed:dst.channels < >> in unkown function,file .... modules \ core \ src \ convert.cpp,line 1277”。opencv错误:声明失败convert.cpp(opencv)当我校准摄像机

这里的代码的一部分,

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); 

我试图解决这个问题很多次了,请我需要帮助。

+0

这将是有用的,如果你能提供线/方法抛出断言。看起来你传递了错误类型的图像(错误的通道数)到一个cv函数。从你的描述很难说,但我想它发生在cvCalibrateCamera2或cvFindHomograpy。 – count0

回答

0

(我打开我的评论作为一个答案,因为纳比可能不能够回答评论有1名代表。)

似乎要传递错误类型的图像(错误的通道数)到其中一个cv函数。从你的描述很难说,但我想它发生在cvCalibrateCamera2或cvFindHomograpy。

断言也听起来像一个运行时错误,而不是一个complie时间错误。

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

您可以有条不紊地评论某些功能(调试您的代码)并查看您的程序是否仍然有效,以防您无法确定代码是否与调试程序断开。一旦你隔离了这个电话,请检查它所期望的作为你的图像参数的文件,你应该在正确的轨道上解决这个问题。

校准是一个多步骤的过程(抓图像,提取特征,计算单应性,计算内外照相机参数)。理解(数学)也很难理解,所以不要放弃。 OpenCV校准功能通常很好。

+0

谢谢你的回答,我添加了一条评论,然后错误出现在cvCalibrateCamera2()之前,保存在计算机磁盘上的JPEG图像(640 * 452)在代码中声明:const char * names [15]; names [0] =“calib1.jpg”; ....名称[11] =“calib12.jpg”;然后我声明图像= cvLoadImage(名称[ig],CV_LOAD_IMAGE_COLOR);它会非常干预你的回答 –

+0

仍然不知道它是编译错误还是运行时错误,以及哪种方法抛出它。请你更具体一点。 – count0

+0

这是一个运行时错误,绘制了棋盘的角落,但校准不成功; –

0

调试按钮没有被激活解决方案国税发项目重新扫描按钮未激活,所以我不能编译或调试程序样本\ CPP \ calibration.cpp

+1

我建议你付出很多努力让这个例子工作,然后,一旦编译和工作,它将演示如何对一组示例图像进行校准。您将能够参考示例代码和图像。 – count0