簡體   English   中英

opencv錯誤:校准攝像機時,convert.cpp(opencv)中的斷言失敗

[英]opencv error: assertion failed in convert.cpp (opencv) when i calibrate a camera

我嘗試校准攝像機(opencv 2.3.1,VS 2010和Windows 7),但是當我編譯程序時,在未知函數,文件..中存在一個“斷言失敗:dst.channels <>>”的opencv錯誤。 ..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);

我試圖解決此問題很多次,請我需要幫助。

(由於Nabiha可能無法回答1個代表的評論,所以我將我的評論作為答案。)

看來您正在將錯誤類型的圖像(錯誤的通道數)傳遞給一個cv函數。 從您的描述很難說,但是我猜它發生在cvCalibrateCamera2或cvFindHomograpy中。

斷言聽起來也像是運行時錯誤,而不是compli time錯誤。

如果是運行時錯誤,則必須檢查要傳遞給這些功能的圖像是否具有正確的設置(通道,相同大小等)。 由於這些參數是動態的,因此編譯器無法為您檢查這些內容。

您可以有條不紊地注釋一些功能(以調試代碼),並查看程序是否仍然可以運行,以防萬一您無法找到調試器確切的代碼中斷位置。 隔離呼叫后,請查看文檔以了解其作為圖像參數的期望,並且您應處於正確的軌道上以解決此問題。

校准是一個多步驟的過程(獲取圖像,提取特征,計算單應性,計算本征和外在相機參數)。 理解(在數學上)也是棘手的,所以不要放棄。 OpenCV校准功能通常可以很好地工作。

調試按鈕未激活,解決方案項目的重新掃描按鈕未激活,因此無法編譯或調試程序樣本\\ cpp \\ Calibration.cpp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM