18 #ifndef PIC_FEATURES_MATCHING_GENERAL_CORNER_DETECTOR_HPP 19 #define PIC_FEATURES_MATCHING_GENERAL_CORNER_DETECTOR_HPP 21 #include "../image.hpp" 22 #include "../util/string.hpp" 23 #include "../util/string.hpp" 25 #ifndef PIC_DISABLE_EIGEN 27 #ifndef PIC_EIGEN_NOT_BUNDLED 28 #include "../externals/Eigen/Dense" 30 #include <Eigen/Dense> 37 #ifndef PIC_DISABLE_EIGEN 48 static bool scD (Eigen::Vector3f i, Eigen::Vector3f j)
50 return (i[2] > j [2]);
53 static bool scA (Eigen::Vector3f i, Eigen::Vector3f j)
55 return (i[2] < j [2]);
77 virtual void execute(
Image *img, std::vector< Eigen::Vector2f > *corners)
90 Image *imgOut,
unsigned int width,
unsigned int height,
bool bColor)
97 if((width < 1) || (height < 1)){
101 imgOut =
new Image(width, height, 1);
106 for(
unsigned int i = 0; i < corners->size(); i++) {
107 int x = int((*corners)[i][0]);
108 int y = int((*corners)[i][1]);
111 (*imgOut)(x, y)[0] = 1.0f;
113 (*imgOut)(x, y)[0] = (*corners)[i][2];
128 std::vector< Eigen::Vector2f > *cornersOut,
129 int nBestPoints = -1,
130 bool bDescend =
true)
136 int n = int(corners->size());
137 if(nBestPoints < 0) {
143 b =
MIN(nBestPoints, n);
145 b =
MIN(
int(corners->size()), n);
146 a =
MAX(b - nBestPoints, 0);
150 for(
int i = a; i < b; i++) {
151 Eigen::Vector3f tmp = corners->at(i);
156 cornersOut->push_back(p);
164 static void sortCorners(std::vector< Eigen::Vector3f > *corners,
bool bDescend =
true)
167 std::sort(corners->begin(), corners->end(),
scD);
169 std::sort(corners->begin(), corners->end(),
scA);
180 std::string out =
"[";
181 auto n = corners->size();
183 for(
auto i = 0; i < (n - 1); i++) {
196 std::vector< Eigen::Vector2f > *out,
200 int n =
MIN(
int(corners->size()), max_limit);
201 bool *processed =
new bool [n];
202 memset(processed, 0,
sizeof(
bool) * n);
204 for(
int i = 0; i < n; i++) {
209 std::vector< int > indices;
210 for(
int j = 0; j < n; j++) {
216 float dx = (*corners)[j][0] - (*corners)[i][0];
217 float dy = (*corners)[j][1] - (*corners)[i][1];
218 float dist = sqrtf(dx * dx + dy * dy);
220 if(dist < threshold) {
222 indices.push_back(j);
227 auto n_i = indices.size();
228 Eigen::Vector2f point;
231 point[0] = (*corners)[i][0];
232 point[1] = (*corners)[i][1];
235 for(
auto j = 0; j < indices.size(); j++) {
239 point[0] += (*corners)[k][0];
240 point[1] += (*corners)[k][1];
245 point[0] /= float(point_c);
246 point[1] /= float(point_c);
248 point[0] = (*corners)[i][0];
249 point[1] = (*corners)[i][1];
251 out->push_back(point);
268 Image full_image(1, 512, 512, 3);
271 Image quad(1, 128, 128, 3);
276 std::vector< Eigen::Vector2f > corners;
277 gcd->
execute(&full_image, &corners);
279 printf(
"\n Corner Detector Test:\n");
281 for(
unsigned int i = 0; i < corners.size(); i++) {
282 printf(
"X: %f Y: %f\n", corners[i][0], corners[i][1]);
288 img_corners->
Write(
"general_corner_test_image.hdr");
std::string fromNumberToString(T num)
fromNumberToString converts a number into a string.
Definition: string.hpp:102
void setZero()
setZero sets data to 0.0f.
static void removeClosestCorners(std::vector< Eigen::Vector2f > *corners, std::vector< Eigen::Vector2f > *out, float threshold, int max_limit)
removeClosestCorners
Definition: general_corner_detector.hpp:195
GeneralCornerDetector()
GeneralCornerDetector.
Definition: general_corner_detector.hpp:62
static std::string exportToString(std::vector< Eigen::Vector2f > *corners)
exportToString
Definition: general_corner_detector.hpp:178
Image * getCornersImage(std::vector< Eigen::Vector2f > *corners, Image *imgOut, unsigned int width, unsigned int height, bool bColor)
getCornersImage
Definition: general_corner_detector.hpp:89
~GeneralCornerDetector()
Definition: general_corner_detector.hpp:68
static void test(GeneralCornerDetector *gcd)
test
Definition: general_corner_detector.hpp:262
static bool scD(Eigen::Vector3f i, Eigen::Vector3f j)
Definition: general_corner_detector.hpp:48
static void sortCorners(std::vector< Eigen::Vector3f > *corners, bool bDescend=true)
sortCorners
Definition: general_corner_detector.hpp:164
The GeneralCornerDetector class.
Definition: general_corner_detector.hpp:42
#define MIN(a, b)
Definition: math.hpp:69
The Image class stores an image as buffer of float.
Definition: image.hpp:60
bool bLum
Definition: general_corner_detector.hpp:46
Definition: bilateral_separation.hpp:25
Image * lum
Definition: general_corner_detector.hpp:45
#define MAX(a, b)
Definition: math.hpp:73
void copySubImage(Image *imgIn, int startX, int startY)
copySubImage copies imgIn in the current image. The current image is written from (startX...
virtual void execute(Image *img, std::vector< Eigen::Vector2f > *corners)
execute
Definition: general_corner_detector.hpp:77
bool Write(std::string nameFile, LDR_type typeWrite, int writerCounter)
Write saves an Image into a file on the disk.
static bool scA(Eigen::Vector3f i, Eigen::Vector3f j)
Definition: general_corner_detector.hpp:53
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