18 #ifndef PIC_FEATURES_MATCHING_SUSAN_CORNER_DETECTOR_HPP 19 #define PIC_FEATURES_MATCHING_SUSAN_CORNER_DETECTOR_HPP 21 #include "../util/vec.hpp" 22 #include "../util/std_util.hpp" 23 #include "../image.hpp" 24 #include "../filtering/filter_luminance.hpp" 25 #include "../filtering/filter_gaussian_2d.hpp" 27 #include "../features_matching/general_corner_detector.hpp" 29 #ifndef PIC_DISABLE_EIGEN 31 #ifndef PIC_EIGEN_NOT_BUNDLED 32 #include "../externals/Eigen/Dense" 34 #include <Eigen/Dense> 41 #ifndef PIC_DISABLE_EIGEN 100 if(img == NULL || corners == NULL) {
114 std::vector< Eigen::Vector3f > corners_w_quality;
121 std::vector< int > x, y;
127 if((j == 0) && (i == 0)) {
131 int r_sq = i_sq + j * j;
132 if(r_sq <= radius_sq){
142 float C = float(x.size());
148 Image R(1,width, height, 1);
153 int ind = i * width + j;
157 for(
unsigned int k = 0; k < x.size(); k++) {
158 int ind_c = (i + y[k]) * width + (j + x[k]);
161 float diff_2 = diff * diff;
162 float diff_4 = diff_2 * diff_2;
163 float diff_6 = diff_4 * diff_2;
165 sum += expf(-diff_6);
169 R.
data[ind] = g - sum;
176 int *indices =
new int [side * side];
185 if(R.
data[ind] <= 0.0f) {
193 int yy =
CLAMP(i + k, height);
197 if((l == 0) && (k == 0)) {
201 int xx =
CLAMP(j + l, width);
203 ind = yy * width + xx;
205 if(R.
data[ind]>0.0f){
206 indices[counter] = ind;
216 float R_value = R.
data[indices[0]];
219 for(
int k = 1; k < counter; k++){
220 if(R.
data[indices[k]] > R_value) {
221 R_value = R.
data[indices[k]];
227 corners_w_quality.push_back(Eigen::Vector3f (
float(j),
float(i), 1.0f) );
230 corners_w_quality.push_back(Eigen::Vector3f (
float(j),
float(i), 1.0f) );
237 if(indices != NULL) {
Definition: filter_luminance.hpp:28
~SusanCornerDetector()
Definition: susan_corner_detector.hpp:73
bool bComputeThreshold
Definition: susan_corner_detector.hpp:50
float * data
data is the main buffer where pixel values are stored.
Definition: image.hpp:91
void setZero()
setZero sets data to 0.0f.
int channels
Definition: image.hpp:80
T * delete_s(T *data)
delete_s
Definition: std_util.hpp:123
int radius_maxima
Definition: susan_corner_detector.hpp:53
Image * lum_flt
Definition: susan_corner_detector.hpp:49
int radius
Definition: susan_corner_detector.hpp:53
void execute(Image *img, std::vector< Eigen::Vector2f > *corners)
execute
Definition: susan_corner_detector.hpp:98
float sigma
Definition: susan_corner_detector.hpp:52
float threshold
Definition: susan_corner_detector.hpp:52
static Image * execute(Image *imgIn, Image *imgOut, LUMINANCE_TYPE type=LT_CIE_LUMINANCE)
execute
Definition: filter_luminance.hpp:166
Image * Process(ImageVec imgIn, Image *imgOut)
Process.
Definition: filter_npasses.hpp:310
The GeneralCornerDetector class.
Definition: general_corner_detector.hpp:42
SusanCornerDetector()
SusanCornerDetector.
Definition: susan_corner_detector.hpp:65
The Image class stores an image as buffer of float.
Definition: image.hpp:60
bool bLum
Definition: general_corner_detector.hpp:46
The SusanCornerDetector class.
Definition: susan_corner_detector.hpp:46
PIC_INLINE ImageVec Single(Image *img)
Single creates an std::vector which contains img; this is for filters input.
Definition: image_vec.hpp:36
Definition: bilateral_separation.hpp:25
Image * lum
Definition: general_corner_detector.hpp:45
#define CLAMP(x, a)
Definition: math.hpp:77
The FilterGaussian2D class.
Definition: filter_gaussian_2d.hpp:31
int width
Definition: image.hpp:80
int height
Definition: image.hpp:80
static void sortCornersAndTransfer(std::vector< Eigen::Vector3f > *corners, std::vector< Eigen::Vector2f > *cornersOut, int nBestPoints=-1, bool bDescend=true)
sortCornersAndTransfer
Definition: general_corner_detector.hpp:127
void release()
Definition: susan_corner_detector.hpp:55
void update(float sigma=1.0f, int radius_maxima=5, int radius=3, float threshold=0.001f)
update
Definition: susan_corner_detector.hpp:85