/////////////////////////
-void cvTsRemap( const CvMat* src, CvMat* dst, CvMat* dst0,
+void cvTsRemap( const CvMat* src, CvMat* dst,
const CvMat* mapx, const CvMat* mapy,
- int interpolation=CV_INTER_LINEAR )
+ CvMat* mask, int interpolation=CV_INTER_LINEAR )
{
int x, y, k;
int drows = dst->rows, dcols = dst->cols;
srows = MAX(srows - 3, 0);
}
+ int scols1 = MAX(scols - 2, 0);
+ int srows1 = MAX(srows - 2, 0);
+
+ if( mask )
+ cvTsZero(mask);
+
for( y = 0; y < drows; y++ )
{
uchar* dptr = dst->data.ptr + dst->step*y;
const float* mx = (const float*)(mapx->data.ptr + mapx->step*y);
const float* my = (const float*)(mapy->data.ptr + mapy->step*y);
+ uchar* m = mask ? mask->data.ptr + mask->step*y : 0;
for( x = 0; x < dcols; x++, dptr += elem_size )
{
- double xs = mx[x];
- double ys = my[x];
+ float xs = mx[x];
+ float ys = my[x];
int ixs = cvFloor(xs);
int iys = cvFloor(ys);
- if( (unsigned)(ixs - delta) >= (unsigned)scols ||
- (unsigned)(iys - delta) >= (unsigned)srows )
+ if( (unsigned)(ixs - delta - 1) >= (unsigned)scols1 ||
+ (unsigned)(iys - delta - 1) >= (unsigned)srows1 )
{
- for( k = 0; k < elem_size; k++ )
- dptr[k] = 0;
- if( dst0 )
- {
- uchar* dptr0 = dst0->data.ptr + dst0->step*y + x*elem_size;
- for( k = 0; k < elem_size; k++ )
- dptr0[k] = 0;
- }
- continue;
+ if( m )
+ m[x] = 1;
+ if( (unsigned)(ixs - delta) >= (unsigned)scols ||
+ (unsigned)(iys - delta) >= (unsigned)srows )
+ continue;
}
xs -= ixs;
const uchar* sptr = sptr0 + iys*step + ixs*cn;
for( k = 0; k < cn; k++ )
{
- double v00 = sptr[k];
- double v01 = sptr[cn + k];
- double v10 = sptr[step + k];
- double v11 = sptr[step + cn + k];
+ float v00 = sptr[k];
+ float v01 = sptr[cn + k];
+ float v10 = sptr[step + k];
+ float v11 = sptr[step + cn + k];
v00 = v00 + xs*(v01 - v00);
v10 = v10 + xs*(v11 - v10);
const ushort* sptr = (const ushort*)sptr0 + iys*step + ixs*cn;
for( k = 0; k < cn; k++ )
{
- double v00 = sptr[k];
- double v01 = sptr[cn + k];
- double v10 = sptr[step + k];
- double v11 = sptr[step + cn + k];
+ float v00 = sptr[k];
+ float v01 = sptr[cn + k];
+ float v10 = sptr[step + k];
+ float v11 = sptr[step + cn + k];
v00 = v00 + xs*(v01 - v00);
v10 = v10 + xs*(v11 - v10);
const float* sptr = (const float*)sptr0 + iys*step + ixs*cn;
for( k = 0; k < cn; k++ )
{
- double v00 = sptr[k];
- double v01 = sptr[cn + k];
- double v10 = sptr[step + k];
- double v11 = sptr[step + cn + k];
+ float v00 = sptr[k];
+ float v01 = sptr[cn + k];
+ float v10 = sptr[step + k];
+ float v11 = sptr[step + cn + k];
v00 = v00 + xs*(v01 - v00);
v10 = v10 + xs*(v11 - v10);
}
}
- cvTsRemap( src, dst, dst0, mapx, mapy );
+ CvMat* mask = cvCreateMat( dst->rows, dst->cols, CV_8U );
+ cvTsRemap( src, dst, mapx, mapy, mask );
+ cvTsZero( dst, mask );
+ cvTsZero( dst0, mask );
+ cvReleaseMat( &mask );
}
}
}
- cvTsRemap( src, dst, dst0, mapx, mapy );
+ CvMat* mask = cvCreateMat( dst->rows, dst->cols, CV_8U );
+ cvTsRemap( src, dst, mapx, mapy, mask );
+ cvTsZero( dst, mask );
+ cvTsZero( dst0, mask );
+ cvReleaseMat( &mask );
}
void cvTsInitUndistortMap( const CvMat* _a0, const CvMat* _k0, CvMat* mapx, CvMat* mapy )
{
int u, v;
- double a[9], k[4];
+ double a[9], k[5]={0,0,0,0,0};
CvMat _a = cvMat(3, 3, CV_64F, a);
CvMat _k = cvMat(_k0->rows,_k0->cols,
CV_MAKETYPE(CV_64F,CV_MAT_CN(_k0->type)),k);
- double fx, fy, cx, cy, ifx, ify;
+ double fx, fy, cx, cy, ifx, ify, cxn, cyn;
cvTsConvert( _a0, &_a );
cvTsConvert( _k0, &_k );
fx = a[0]; fy = a[4]; cx = a[2]; cy = a[5];
ifx = 1./fx; ify = 1./fy;
+ cxn = cx;//(mapy->cols - 1)*0.5;
+ cyn = cy;//(mapy->rows - 1)*0.5;
for( v = 0; v < mapy->rows; v++ )
{
for( u = 0; u < mapy->cols; u++ )
{
- double x = (u - cx)*ifx;
- double y = (v - cy)*ify;
+ double x = (u - cxn)*ifx;
+ double y = (v - cyn)*ify;
double x2 = x*x, y2 = y*y;
double r2 = x2 + y2;
- double cdist = 1 + r2*(k[0] + k[1]*r2);
+ double cdist = 1 + (k[0] + (k[1] + k[4]*r2)*r2)*r2;
double x1 = x*cdist + k[2]*2*x*y + k[3]*(r2 + 2*x2);
double y1 = y*cdist + k[3]*2*x*y + k[2]*(r2 + 2*y2);
mx[u] = (float)(x1*fx + cx);
{
CV_ImgWarpBaseTest::get_test_array_types_and_sizes( test_case_idx, sizes, types );
types[INPUT][1] = types[INPUT][2] = CV_32FC1;
+ interpolation = CV_INTER_LINEAR;
}
{
CvMat* dst = &test_mat[REF_INPUT_OUTPUT][0];
CvMat* dst0 = &test_mat[INPUT_OUTPUT][0];
- int nr = interpolation == CV_INTER_CUBIC ? 3 : 3, nc = nr;
- CvMat part;
- cvTsRemap( &test_mat[INPUT][0], dst, dst0,
+ CvMat* mask = cvCreateMat( dst->rows, dst->cols, CV_8U );
+ cvTsRemap( &test_mat[INPUT][0], dst,
&test_mat[INPUT][1], &test_mat[INPUT][2],
- interpolation );
- nr = MIN(nr, dst->rows);
- nc = MIN(nc, dst->cols);
- cvGetRows( dst, &part, dst->rows - nr, dst->rows );
- cvTsZero( &part );
- cvGetRows( dst0, &part, dst->rows - nr, dst->rows );
- cvTsZero( &part );
- cvGetCols( dst, &part, dst->cols - nc, dst->cols );
- cvTsZero( &part );
- cvGetCols( dst0, &part, dst->cols - nc, dst->cols );
- cvTsZero( &part );
+ mask, interpolation );
+ cvTsZero( dst, mask );
+ cvTsZero( dst0, mask );
+ cvReleaseMat( &mask );
}
CvMat* dst0 = &test_mat[INPUT_OUTPUT][0];
CvMat* mapx = cvCreateMat( dst->rows, dst->cols, CV_32FC1 );
CvMat* mapy = cvCreateMat( dst->rows, dst->cols, CV_32FC1 );
- CvMat part;
- int nr = 2, nc = nr;
cvTsInitUndistortMap( &test_mat[INPUT][1], &test_mat[INPUT][2],
mapx, mapy );
- cvTsRemap( src, dst, dst0, mapx, mapy, interpolation );
- nr = MIN(nr, dst->rows);
- nc = MIN(nc, dst->cols);
- cvGetRows( dst, &part, 0, nr );
- cvTsZero( &part );
- cvGetRows( dst0, &part, 0, nr );
- cvTsZero( &part );
- cvGetRows( dst, &part, dst->rows - nr, dst->rows );
- cvTsZero( &part );
- cvGetRows( dst0, &part, dst->rows - nr, dst->rows );
- cvTsZero( &part );
-
- cvGetCols( dst, &part, 0, nc );
- cvTsZero( &part );
- cvGetCols( dst0, &part, 0, nc );
- cvTsZero( &part );
- cvGetCols( dst, &part, dst->cols - nc, dst->cols );
- cvTsZero( &part );
- cvGetCols( dst0, &part, dst->cols - nc, dst->cols );
- cvTsZero( &part );
+ CvMat* mask = cvCreateMat( dst->rows, dst->cols, CV_8U );
+ cvTsRemap( src, dst, mapx, mapy, mask, interpolation );
+ cvTsZero( dst, mask );
+ cvTsZero( dst0, mask );
cvReleaseMat( &mapx );
cvReleaseMat( &mapy );
+ cvReleaseMat( &mask );
}
double CV_UndistortMapTest::get_success_error_level( int /*test_case_idx*/, int /*i*/, int /*j*/ )
{
- return 1e-4;
+ return 1e-3;
}