cvCalibrateCamera2() を使用してカメラのキャリブレーションを行おうとしていますが、ストレージの問題に遭遇しました: 返されたintrinsic_matrixとdistortion_coeffsに無効な浮動小数点数(=NaN)が含まれています。
それが私がやっていることです(休憩はこれを完全に残す責任があります):
image_points =cvCreateMat(board_total,2,CV_32FC1); if (!image_points) break;
object_points =cvCreateMat(board_total,3,CV_32FC1); if (!object_points) break;
point_counts =cvCreateMat(1,1,CV_32SC1); if (!point_counts) break;
intrinsic_matrix =cvCreateMat(3,3,CV_32FC1); if (!intrinsic_matrix) break;
corners =new CvPoint2D32f[board_total]; if (!corners) break;
distortion_coeffs=cvCreateMat(4,1,CV_32FC1); if (!distortion_coeffs) break;
int found = cvFindChessboardCorners(gray_image, board_sz, corners,corner_count,CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS );
if (found==0) break;
「gray_image」は私の入力画像で、「corners」には正しいチェス盤のコーナー座標が含まれています。
cvFindCornerSubPix(gray_image, corners,*corner_count, cvSize(11,11),cvSize(-1,-1), cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 30, 0.1 ));
for (j=0; j<board_total; j++)
{
CV_MAT_ELEM(*image_points, float,0,0) = corners[j].x;
CV_MAT_ELEM(*image_points, float,0,1) = corners[j].y;
CV_MAT_ELEM(*object_points,float,0,0) = (float) j/board_w;
CV_MAT_ELEM(*object_points,float,0,1) = (float) (j%board_w);
CV_MAT_ELEM(*object_points,float,0,2) = 0.0f;
}
CV_MAT_ELEM(*point_counts, int,0,0) = board_total;
CV_MAT_ELEM( *intrinsic_matrix, float, 0, 0 ) = 1.0f;
CV_MAT_ELEM( *intrinsic_matrix, float, 1, 1 ) = 1.0f;
cvCalibrateCamera2(object_points,image_points,point_counts,cvGetSize( gray_image ),intrinsic_matrix,distortion_coeffs,NULL,NULL,0);
ここで cvCalibrateCamera2() は機能しているようで、例外は発生しませんが、結果を取得しようとすると、すべてのフロート「d」が無効になります:
float d;
for (i=0; i<3; i++)
for (j=0; j<3; j++)
{
d=CV_MAT_ELEM(*intrinsic_matrix,float,i,j);
calib_data->intrinsic[i][j]=(int)OAPC_ROUND(d*1000000,0);
}
for (i=0; i<4; i++)
{
d=CV_MAT_ELEM(*distortion_coeffs,float,i,0);
calib_data->distortion[i]=(int)OAPC_ROUND(d*100000000,0);
}
ここで何が問題なのですか?