CV_IMPL void cvUndistort2( const CvArr* _src, CvArr* _dst, const CvMat* A, const CvMat* dist_coeffs ) { static int inittab = 0; uchar* buffer = 0; CV_FUNCNAME( "cvUndistort2" ); __BEGIN__; float a[9], k[4]; int coi1 = 0, coi2 = 0; CvMat srcstub, *src = (CvMat*)_src; CvMat dststub, *dst = (CvMat*)_dst; CvMat _a = cvMat( 3, 3, CV_32F, a ), _k; int cn, src_step, dst_step; CvSize size; if( !inittab ) { icvInitLinearCoeffTab(); icvInitCubicCoeffTab(); inittab = 1; } CV_CALL( src = cvGetMat( src, &srcstub, &coi1 )); CV_CALL( dst = cvGetMat( dst, &dststub, &coi2 )); if( coi1 != 0 || coi2 != 0 ) CV_ERROR( CV_BadCOI, "The function does not support COI" ); if( CV_MAT_DEPTH(src->type) != CV_8U ) CV_ERROR( CV_StsUnsupportedFormat, "Only 8-bit images are supported" ); if( src->data.ptr == dst->data.ptr ) CV_ERROR( CV_StsNotImplemented, "In-place undistortion is not implemented" ); if( !CV_ARE_TYPES_EQ( src, dst )) CV_ERROR( CV_StsUnmatchedFormats, "" ); if( !CV_ARE_SIZES_EQ( src, dst )) CV_ERROR( CV_StsUnmatchedSizes, "" ); if( !CV_IS_MAT(A) || A->rows != 3 || A->cols != 3 || CV_MAT_TYPE(A->type) != CV_32FC1 && CV_MAT_TYPE(A->type) != CV_64FC1 ) CV_ERROR( CV_StsBadArg, "Intrinsic matrix must be a valid 3x3 floating-point matrix" ); if( !CV_IS_MAT(dist_coeffs) || dist_coeffs->rows != 1 && dist_coeffs->cols != 1 || dist_coeffs->rows*dist_coeffs->cols*CV_MAT_CN(dist_coeffs->type) != 4 || CV_MAT_DEPTH(dist_coeffs->type) != CV_64F && CV_MAT_DEPTH(dist_coeffs->type) != CV_32F ) CV_ERROR( CV_StsBadArg, "Distortion coefficients must be 1x4 or 4x1 floating-point vector" ); cvConvert( A, &_a ); _k = cvMat( dist_coeffs->rows, dist_coeffs->cols, CV_MAKETYPE(CV_32F, CV_MAT_CN(dist_coeffs->type)), k ); cvConvert( dist_coeffs, &_k ); cn = CV_MAT_CN(src->type); size = cvGetMatSize(src); src_step = src->step ? src->step : CV_STUB_STEP; dst_step = dst->step ? dst->step : CV_STUB_STEP; if( fabs((double)k[2]) < 1e-5 && fabs((double)k[3]) < 1e-5 && icvUndistortGetSize_p ) { int buf_size = 0; CvUndistortRadialIPPFunc func = cn == 1 ? (CvUndistortRadialIPPFunc)icvUndistortRadial_8u_C1R_p : (CvUndistortRadialIPPFunc)icvUndistortRadial_8u_C3R_p; if( func && icvUndistortGetSize_p( size, &buf_size ) >= 0 && buf_size > 0 ) { CV_CALL( buffer = (uchar*)cvAlloc( buf_size )); if( func( src->data.ptr, src_step, dst->data.ptr, dst_step, size, a[0], a[4], a[2], a[5], k[0], k[1], buffer ) >= 0 ) EXIT; } } icvUnDistort_8u_CnR( src->data.ptr, src_step, dst->data.ptr, dst_step, size, a, k, cn ); __END__; cvFree( &buffer ); }
CV_IMPL void cvUndistort2( const CvArr* _src, CvArr* _dst, const CvMat* A, const CvMat* dist_coeffs ) { static int inittab = 0; CV_FUNCNAME( "cvUndistort2" ); __BEGIN__; float a[9], k[5]={0,0,0,0,0}; int coi1 = 0, coi2 = 0; CvMat srcstub, *src = (CvMat*)_src; CvMat dststub, *dst = (CvMat*)_dst; CvMat _a = cvMat( 3, 3, CV_32F, a ), _k; int cn, src_step, dst_step; CvSize size; if( !inittab ) { icvInitLinearCoeffTab(); icvInitCubicCoeffTab(); inittab = 1; } CV_CALL( src = cvGetMat( src, &srcstub, &coi1 )); CV_CALL( dst = cvGetMat( dst, &dststub, &coi2 )); if( coi1 != 0 || coi2 != 0 ) CV_ERROR( CV_BadCOI, "The function does not support COI" ); if( CV_MAT_DEPTH(src->type) != CV_8U ) CV_ERROR( CV_StsUnsupportedFormat, "Only 8-bit images are supported" ); if( src->data.ptr == dst->data.ptr ) CV_ERROR( CV_StsNotImplemented, "In-place undistortion is not implemented" ); if( !CV_ARE_TYPES_EQ( src, dst )) CV_ERROR( CV_StsUnmatchedFormats, "" ); if( !CV_ARE_SIZES_EQ( src, dst )) CV_ERROR( CV_StsUnmatchedSizes, "" ); if( !CV_IS_MAT(A) || A->rows != 3 || A->cols != 3 || (CV_MAT_TYPE(A->type) != CV_32FC1 && CV_MAT_TYPE(A->type) != CV_64FC1) ) CV_ERROR( CV_StsBadArg, "Intrinsic matrix must be a valid 3x3 floating-point matrix" ); if( !CV_IS_MAT(dist_coeffs) || (dist_coeffs->rows != 1 && dist_coeffs->cols != 1) || (dist_coeffs->rows*dist_coeffs->cols*CV_MAT_CN(dist_coeffs->type) != 4 && dist_coeffs->rows*dist_coeffs->cols*CV_MAT_CN(dist_coeffs->type) != 5) || (CV_MAT_DEPTH(dist_coeffs->type) != CV_64F && CV_MAT_DEPTH(dist_coeffs->type) != CV_32F) ) CV_ERROR( CV_StsBadArg, "Distortion coefficients must be 1x4, 4x1, 1x5 or 5x1 floating-point vector" ); cvConvert( A, &_a ); _k = cvMat( dist_coeffs->rows, dist_coeffs->cols, CV_MAKETYPE(CV_32F, CV_MAT_CN(dist_coeffs->type)), k ); cvConvert( dist_coeffs, &_k ); cn = CV_MAT_CN(src->type); size = cvGetMatSize(src); src_step = src->step ? src->step : CV_STUB_STEP; dst_step = dst->step ? dst->step : CV_STUB_STEP; icvUnDistort_8u_CnR( src->data.ptr, src_step, dst->data.ptr, dst_step, size, a, k, cn ); __END__; }