2012-08-31 194 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