@@ -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+
65160static void
66161test_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