Overview and Implementation of Fast Corner Detection Method
Overview and Implementation of Fast Corner Detection Method
Pi19404
March 3, 2013
Contents
Contents
Feature Detection - Fast Feature Detection 3
0.1 Introduction . . . . . . . . . . . . . . . . 0.2 Fast Feature Detection . . . . . . . 0.2.1 Implementation Details . . . . . Location of Points on Circle . Construction of Lookup Table 0.2.2 Corner Filter . . . . . . . . . . . 0.2.3 Comments . . . . . . . . . . . . . . 0.3 Code . . . . . . . . . . . . . . . . . . . . . References . . . . . . . . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
3 3 5 5 6 8 9 10 11
2 | 11
3 | 11
Feature Detection - Fast Feature Detection This implies point may be a isolated corner or linear edge. N contiguous pixels in the circle are analyzed to check if they are all brighter or darker than pixel being analyzed. This is done by checking if all the pixels are greater than p + t or smaller than p t where p is pixel being tested and t is a small threshold. The value of N is chosen to be 12.This enables rejection of of non corners easily. Thus if N=12 the pixels labelled atleast three
of the 4 pixels labelled 1,9,4,12 must satisfy the test. Thus if point p is a corner then atleast three of the pixels must be all brighter than Ip + t or darker than Ip t. If both the conditions are not satisfied then the point p cannot be a corner. Thus this test can be used to reject corners.If all these criteria are satisfied then we test the entire line segment.
4 | 11
Given a point p and image matrix I we need to quickly indentify the location of the different points on the circle. The location of different points relative to point p are given below 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 (0,-3) (1,-3) (2,-2) (3,-1) (3,0) (3,1) (2,2) (1,3) (0,3) (-1,3) (-2,2) (-3,1) (-3,0) (-3,-1) (-2,-2) (-1,-3)
These relative co-ordinates from the center pixel are stored in a vector and can be used to obtain the location of point on circle given the center pixel.
1 2 3 4 5 6 7 8
vector < Point2f > offset ; offset . push_back ( Point2f (0 , -3) ) ; offset . push_back ( Point2f (1 , -3) ) ; offset . push_back ( Point2f (2 , -2) ) ; offset . push_back ( Point2f (3 , -1) ) ; offset . push_back ( Point2f (3 ,0) ) ; offset . push_back ( Point2f (3 ,1) ) ; offset . push_back ( Point2f (2 ,2) ) ;
5 | 11
offset . push_back offset . push_back offset . push_back offset . push_back offset . push_back offset . push_back offset . push_back offset . push_back offset . push_back
( Point2f (1 ,3) ) ; ( Point2f (0 ,3) ) ; ( Point2f ( -1 ,3) ) ; ( Point2f ( -2 ,2) ) ; ( Point2f ( -3 ,1) ) ; ( Point2f ( -3 ,0) ) ; ( Point2f ( -3 , -1) ) ; ( Point2f ( -2 , -2) ) ; ( Point2f ( -1 , -3) ) ;
If the test pixel is 0 we need to check if all the pixels surronding pixels are greater than 0+t or less than 0-t. If the test pixel is 255 we need to check if all the surrounding pixels are less than 255-t or greater than 255+t. Since t can take value between 0 and 255 .The range of pixel values observed are 255 255. Let k be the neighboring pixel and we want to test if k>p+t . p-k < -t and k<p-t or p-k > t. If k-p<-t we will label the pixel as 1 and is k-p>t we will lable the pixel as 2. The range of values taken by k-p need to be determined. k can take values from 0 -255 and p and take values from 0 -255. thus the minumum values is -255 and the maximum value 255. Thus we construt a lookup table of size 512. for values of k-p from -255 to 255 which satisfy the condition k-p<-t value 1 is assigned to correponding element of look up table. For values of k-p from -255 to 255 which satisfy the condition k-p<-t value 1 is assigned to correponding element of look up table. For values of k-p which do not satisfy both the condition are assigned value 0 in the lookup table.
6 | 11
for ( i = -255; i <= 255; i ++ ) threshold_tab [ i +255] = ( int ) ( i < - threshold ? 1 : i > threshold ? 2 : 0) ;
Consider that values of k and p are given .Thus the task is to compute the index k-p and look up the cooresponding values from the lookup table. Thus given a pixel p(x,y) we need to derive all pixel on the circle using the relative offsets and look up their corresponding values from the lookup table. We have the pointer to the location of the pixel p(x,y).Let x and y offsets be denoted by (dx; dy ).Then location of the offset pixel is given by ptr + dy cols + dx Thus a simple check of pixel labels is performed to reject invalid corners. The aim is to check a if contigious 12 pixel with labels either 1 or 2 are observed. This is performed by process of elimination. The following pair of pixels are checked.If both of elements of any of pairs are zero then it cannot be a corner. The pairs of pixels are (1; 9)(3; 11)(5; 13)(7; 15)(2; 10)(4; 12)(6; 14)(8; 16) Let relative buffer index of elements from the center pixel is represented by a and b. Thus terminate processing of current pixel if both the elements of any of the pairs is zero.This can be easily checked by performing a bitwise OR operation elements,if it is zero then it cannot be a corner.
1 2 3 4 5 6 7 8
uchar * ptr = src . data + i * src . step ; // pointer to the row of center pixel a = checks [ k ]; // relative index from center pixel b = checks [ k +1]; int value1 = threshold_tab [ - ptr [ j + a ]+ v1 +255]; int value2 = threshold_tab [ - ptr [ j + b ]+ v1 +255]; flag = flag &( value1 | value2 ) ; // check if both of index pairs are 0 if ( flag ==0) break ;
7 | 11
If all the tests are positive we need to check if we obtain a continous sequence of 1 or 2 If we obtain a continuous sequence of length 12 then a corner is detected. This will provide us with a list of corners.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
int count =0; // corner count for ( int k =0; k <2; k ++) // for dark and bright thresholds { count =0; for ( int l =0; l < offset . size () ; l ++) // parsing the circle { int index = j + checks1 [ l ]; // index of element on circle int x = ptr [ index ]; // value of pixe ; int flag1 =( k ==0) ?( x < v1 - threshold ) :( x > v1 + threshold ) ; count =( flag1 ==1) ? count +1:0; // set count to 0 if false if ( count > K ) break ; // 12 continous pixel detected } if ( count > K ) { corners1 . push_back ( Point2f (j , i ) ) ; break ; // since only dark or bright pixels >12 on circle } }
8 | 11
Feature Detection - Fast Feature Detection indicates the strength of the corner. The response function used in the present application is sum of absolute difference of the pixels in contigious arc and the center pixel.
R(x; y )
arc I (p)
I (x; y )
(1)
The criteria used in the paper for corner filtering is to remove adjancet corner pixels which have adjacent corners with high values of response function. However the corner filtering described in the earlier corner detectors [4, 3] will used as the purpose is the same.
0.2.3 Comments
A significant performance improvement is obtained of 4x-10x compared to the earlier corner detectors. The present method gives better performance compared to feature descriptiors But the disadvantage is that lot of irrelevant or invalid corners may be detected. Hence the corner filtering stage may contain a lot of elements and this may lead to slighlty longer time for corner filtering. Some significant corners may also be detected in the textured areas which may necessarily not be useful. This can be seen in the demo videos available in code respository. Another disadvantage of the method is not generic and does not generalize well if a larger neighborhood is selected or N different than 12 is chosen. The choice of ordering of pixels from 1-16 assumes a specific distri-
9 | 11
Feature Detection - Fast Feature Detection bution of appearance of neighborhood about the test point. In the paper [5] a machine learning technique is proposed which learns the criteria for corner filtering using decision trees which is supposed to provides good generalization performance We will look at training procedure and detecting corners using machine learning techniques in the future.
0.3 Code
we define a main feature_detector base class containing methods and data common to all feature detector. the fast class is derived class containing specific implementations of algorithms. The code OpenCV code can be found in code repository https://github.com/ pi19404/m19404/tree/master/FEATURE_DETECTOR or https://code.google. com/p/m19404/source/browse/FEATURE_DETECTOR/
10 | 11
Bibliography
Bibliography
[1] Chris Harris and Mike Stephens. A combined corner and edge detector. In: In
Proc. of Fourth Alvey Vision Conference.
[2]
Ivan Laptev. On Space-Time Interest Points. In: Int. J. Comput. Vision 64.2-3 (Sept. 2005), pp. 107123.
[3]
issn: 0920-5691. doi: 10.1007/s11263-005-1838url: http://dx.doi.org/10.1007/s11263-005-1838-7. pi19404. Overview and Implementation Harris Corner Detection. url: http :
7. / / pi - virtualworld . blogspot . com / 2013 / 02 / feature - detection overview-of-harris.html.
pi19404. Overview and Implementation of Good Features to Track Feature De-
[4]
url: http://pi-virtualworld.blogspot.com/2013/02/overviewof-good-features-to-track.html.
tector.
[5]
Edward Rosten and Tom Drummond. Machine learning for high-speed corner detection. In: In European Conference on Computer Vision. 2006, pp. 430443.
[6]
Jianbo Shi and C. Tomasi. Good features to track. In: Computer Vision and
Pattern Recognition, 1994. Proceedings CVPR '94., 1994 IEEE Computer Society Conference on.
doi: 10.1109/CVPR.1994.323794.
11 | 11