Skip to content

Commit ea3e118

Browse files
committed
Restored test_cornerEigenValsVecs
1 parent be29755 commit ea3e118

1 file changed

Lines changed: 98 additions & 2 deletions

File tree

modules/imgproc/test/test_goodfeaturetotrack.cpp

Lines changed: 98 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,101 @@ struct greaterThanPtr
6262
{ return *a > *b; }
6363
};
6464

65+
static void
66+
test_cornerEigenValsVecs( const Mat& src, Mat& eigenv, int block_size,
67+
int _aperture_size, double k, int mode, int borderType, const Scalar& _borderValue )
68+
{
69+
int i, j;
70+
Scalar borderValue = _borderValue;
71+
int aperture_size = _aperture_size < 0 ? 3 : _aperture_size;
72+
Point anchor( aperture_size/2, aperture_size/2 );
73+
74+
CV_Assert( src.type() == CV_8UC1 || src.type() == CV_32FC1 );
75+
CV_Assert( eigenv.type() == CV_32FC1 );
76+
CV_Assert( ( src.rows == eigenv.rows ) &&
77+
(((mode == MINEIGENVAL)||(mode == HARRIS)) && (src.cols == eigenv.cols)) );
78+
79+
int type = src.type();
80+
int ftype = CV_32FC1;
81+
double kernel_scale = 1;
82+
83+
Mat dx2, dy2, dxdy(src.size(), CV_32F), kernel;
84+
85+
kernel = cvtest::calcSobelKernel2D( 1, 0, _aperture_size );
86+
cvtest::filter2D( src, dx2, ftype, kernel*kernel_scale, anchor, 0, borderType, borderValue );
87+
kernel = cvtest::calcSobelKernel2D( 0, 1, _aperture_size );
88+
cvtest::filter2D( src, dy2, ftype, kernel*kernel_scale, anchor, 0, borderType,borderValue );
89+
90+
double denom = (1 << (aperture_size-1))*block_size;
91+
denom = denom * denom;
92+
93+
if( _aperture_size < 0 )
94+
denom *= 2.;
95+
if(type != ftype )
96+
denom *= 255.;
97+
98+
denom = 1./denom;
99+
100+
for( i = 0; i < src.rows; i++ )
101+
{
102+
float* dxdyp = dxdy.ptr<float>(i);
103+
float* dx2p = dx2.ptr<float>(i);
104+
float* dy2p = dy2.ptr<float>(i);
105+
106+
for( j = 0; j < src.cols; j++ )
107+
{
108+
double xval = dx2p[j], yval = dy2p[j];
109+
dxdyp[j] = (float)(xval*yval*denom);
110+
dx2p[j] = (float)(xval*xval*denom);
111+
dy2p[j] = (float)(yval*yval*denom);
112+
}
113+
}
114+
115+
kernel = Mat::ones(block_size, block_size, CV_32F);
116+
anchor = Point(block_size/2, block_size/2);
117+
118+
cvtest::filter2D( dx2, dx2, ftype, kernel, anchor, 0, borderType, borderValue );
119+
cvtest::filter2D( dy2, dy2, ftype, kernel, anchor, 0, borderType, borderValue );
120+
cvtest::filter2D( dxdy, dxdy, ftype, kernel, anchor, 0, borderType, borderValue );
121+
122+
if( mode == MINEIGENVAL )
123+
{
124+
for( i = 0; i < src.rows; i++ )
125+
{
126+
float* eigenvp = eigenv.ptr<float>(i);
127+
const float* dxdyp = dxdy.ptr<float>(i);
128+
const float* dx2p = dx2.ptr<float>(i);
129+
const float* dy2p = dy2.ptr<float>(i);
130+
131+
for( j = 0; j < src.cols; j++ )
132+
{
133+
double a = dx2p[j]*0.5f, b = dxdyp[j], c = dy2p[j]*0.5f;
134+
//double d = sqrt( ( a - c )*( a - c ) + 4*b*b );
135+
//eigenvp[j] = (float)( 0.5*(a + c - d));
136+
eigenvp[j] = (float)((a + c) - std::sqrt((a - c)*(a - c) + b*b));
137+
}
138+
}
139+
}
140+
else if( mode == HARRIS )
141+
{
142+
143+
for( i = 0; i < src.rows; i++ )
144+
{
145+
float* eigenvp = eigenv.ptr<float>(i);
146+
const float* dxdyp = dxdy.ptr<float>(i);
147+
const float* dx2p = dx2.ptr<float>(i);
148+
const float* dy2p = dy2.ptr<float>(i);
149+
150+
for( j = 0; j < src.cols; j++ )
151+
{
152+
double a = dx2p[j], b = dxdyp[j], c = dy2p[j];
153+
eigenvp[j] = (float)(a*c - b*b - k*(a + c)*(a + c));
154+
}
155+
}
156+
}
157+
}
158+
159+
65160
static void
66161
test_goodFeaturesToTrack( InputArray _image, OutputArray _corners,
67162
int maxCorners, double qualityLevel, double minDistance,
@@ -74,16 +169,17 @@ test_goodFeaturesToTrack( InputArray _image, OutputArray _corners,
74169

75170

76171
Mat image = _image.getMat(), mask = _mask.getMat();
172+
int aperture_size = gradientSize;
77173
int borderType = BORDER_DEFAULT;
78174

79175
Mat eig, tmp, tt;
80176

81177
eig.create( image.size(), CV_32F );
82178

83179
if( useHarrisDetector )
84-
cornerHarris( image, eig, blockSize, gradientSize, harrisK );
180+
test_cornerEigenValsVecs( image, eig, blockSize, aperture_size, harrisK, HARRIS, borderType, 0 );
85181
else
86-
cornerMinEigenVal( image, eig, blockSize, gradientSize );
182+
test_cornerEigenValsVecs( image, eig, blockSize, aperture_size, 0, MINEIGENVAL, borderType, 0 );
87183

88184
double maxVal = 0;
89185

0 commit comments

Comments
 (0)