18 #ifndef PIC_FEATURES_MATCHING_HARRIS_CORNER_DETECTOR_HPP 19 #define PIC_FEATURES_MATCHING_HARRIS_CORNER_DETECTOR_HPP 23 #include "../util/vec.hpp" 24 #include "../util/std_util.hpp" 25 #include "../util/polynomial.hpp" 26 #include "../base.hpp" 28 #include "../image.hpp" 29 #include "../filtering/filter_luminance.hpp" 30 #include "../filtering/filter_gaussian_2d.hpp" 31 #include "../filtering/filter_gradient_harris_opt.hpp" 32 #include "../filtering/filter_max.hpp" 33 #include "../features_matching/general_corner_detector.hpp" 35 #ifndef PIC_DISABLE_EIGEN 37 #ifndef PIC_EIGEN_NOT_BUNDLED 38 #include "../externals/Eigen/Dense" 40 #include <Eigen/Dense> 49 #ifndef PIC_DISABLE_EIGEN 129 this->ki =
CLAMPi(
ki, 0.04f, 0.06f);
139 if(img == NULL || corners == NULL) {
160 float delta = maxL - minL;
167 std::vector< Eigen::Vector3f > corners_w_quality;
172 float eps = 2.2204e-16f;
183 for(
int i = 0; i <
height; i++) {
184 for(
int j = 0; j <
width; j++) {
185 float *data_ret = (*ret)(j, i);
187 float *I_grad_val = (*I_grad_flt)(j, i);
189 float x2 = I_grad_val[0];
190 float y2 = I_grad_val[1];
191 float xy = I_grad_val[2];
193 float detA = x2 * y2 - xy * xy;
202 data_ret[0] = x0 < x1 ? x0 : x1;
209 data_ret[0] = detA -
ki * trA * trA;
213 data_ret[0] = detA / (trA + eps);
233 for(
int i = 0; i <
height; i++) {
234 float i_f = float(i);
235 float cx, cy, ax, ay, bx, by, x, y;
237 for(
int j = 0; j <
width; j++) {
239 float R = (*ret)(j, i)[0];
240 float R_flt = (*ret_flt)(j, i)[0];
243 float Rr = (*ret)(j, i + 1)[0];
244 float Rl = (*ret)(j, i - 1)[0];
245 float Ru = (*ret)(j + 1, i)[0];
246 float Rd = (*ret)(j - 1, i)[0];
249 ax = (Rl + Rr) / 2.0f - cx;
253 x = -w * bx / (2.0f * ax);
259 ay = (Rd + Ru) / 2.0f - cy;
263 y = -w * by / (2.0f * ay);
268 corners_w_quality.push_back(Eigen::Vector3f(
float(j) + x, i_f + y, R));
Definition: filter_luminance.hpp:28
void release()
release
Definition: harris_corner_detector.hpp:72
void update(float sigma=1.0f, int radius=3, float threshold=0.001f, float ki=0.04f, CORENE_DETECTOR_TYPE type=CD_NOBLE)
update
Definition: harris_corner_detector.hpp:121
int channels
Definition: image.hpp:80
T * delete_s(T *data)
delete_s
Definition: std_util.hpp:123
~HarrisCornerDetector()
Definition: harris_corner_detector.hpp:110
void execute(Image *img, std::vector< Eigen::Vector2f > *corners)
execute
Definition: harris_corner_detector.hpp:137
static Image * execute(Image *imgIn, Image *imgOut=NULL, int colorChannel=0)
execute
Definition: filter_gradient_harris_opt.hpp:78
float sigma
Definition: harris_corner_detector.hpp:62
CORENE_DETECTOR_TYPE type
Definition: harris_corner_detector.hpp:64
static bool getSecondOrderRoots(float a, float b, float c, float *x0, float *x1)
getSecondOrderRoots solves second order equations, ax^2 + b x + c = 0
Definition: polynomial.hpp:437
HarrisCornerDetector(float sigma=1.0f, int radius=3, float threshold=0.001f, float ki=0.04f, CORENE_DETECTOR_TYPE type=CD_NOBLE)
HarrisCornerDetector.
Definition: harris_corner_detector.hpp:102
float * getMinVal(BBox *box, float *ret)
getMinVal computes the minimum value for the current Image.
int radius
Definition: harris_corner_detector.hpp:63
The HarrisCornerDetector class.
Definition: harris_corner_detector.hpp:54
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
void setNULL()
setNULL
Definition: harris_corner_detector.hpp:83
float threshold
Definition: harris_corner_detector.hpp:62
static Image * execute(Image *imgIn, Image *imgOut, int size)
execute
Definition: filter_max.hpp:101
The Image class stores an image as buffer of float.
Definition: image.hpp:60
Image * clone() const
Clone creates a deep copy of the calling instance.
Definition: harris_corner_detector.hpp:47
Image * allocateSimilarOne()
allocateSimilarOne creates an Image with similar size of the calling instance.
int height
Definition: harris_corner_detector.hpp:67
#define CLAMPi(x, a, b)
Definition: math.hpp:81
CORENE_DETECTOR_TYPE
Definition: harris_corner_detector.hpp:47
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
Image * ret
Definition: harris_corner_detector.hpp:59
Image * I_grad_flt
Definition: harris_corner_detector.hpp:58
float ki
Definition: harris_corner_detector.hpp:62
Image * I_grad
Definition: harris_corner_detector.hpp:57
The FilterGaussian2D class.
Definition: filter_gaussian_2d.hpp:31
float * getMaxVal(BBox *box, float *ret)
getMaxVal computes the maximum value for the current Image.
Definition: harris_corner_detector.hpp:47
int width
Definition: image.hpp:80
Definition: harris_corner_detector.hpp:47
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
int width
Definition: harris_corner_detector.hpp:67