20 #ifndef INTEREST_POINT_H_
21 #define INTEREST_POINT_H_
23 #include <ff_common/thread.h>
24 #include <camera/camera_params.h>
26 #include <opencv2/imgproc.hpp>
28 #include <glog/logging.h>
32 #include <Eigen/Geometry>
46 typedef std::vector<float> descriptor_type;
47 typedef descriptor_type::iterator iterator;
48 typedef descriptor_type::const_iterator const_iterator;
59 uint32_t
octave = 0, uint32_t scale_lvl = 0)
69 scale_lvl(scale_lvl) {}
104 const_iterator begin()
const {
return descriptor.begin(); }
105 iterator begin() {
return descriptor.begin(); }
106 const_iterator end()
const {
return descriptor.end(); }
109 size_t size()
const {
return descriptor.size(); }
110 float operator[](
int index) {
return descriptor[index]; }
119 s <<
"IP: (" <<
x <<
"," << y <<
") scale: " <<
scale <<
" orientation: " <<
orientation
121 <<
" scale_lvl: " << scale_lvl <<
"\n";
122 s <<
" descriptor: ";
141 if (cv_descriptor.rows != 1 || cv_descriptor.cols < 2)
142 LOG(FATAL) <<
"The descriptors must be in one row, and have at least two columns.";
145 for (
size_t it = 0; it <
descriptor.size(); it++) {
146 descriptor[it] = cv_descriptor.at<
float>(0, it);
151 typedef std::pair<std::vector<InterestPoint>, std::vector<InterestPoint> > MATCH_PAIR;
152 typedef std::map<std::pair<int, int>, dense_map::MATCH_PAIR> MATCH_MAP;
154 void detectFeatures(
const cv::Mat& image,
bool verbose,
156 cv::Mat* descriptors, Eigen::Matrix2Xd* keypoints);
159 void matchFeatures(std::mutex* match_mutex,
int left_image_index,
int right_image_index,
160 cv::Mat
const& left_descriptors, cv::Mat
const& right_descriptors,
161 Eigen::Matrix2Xd
const& left_keypoints, Eigen::Matrix2Xd
const& right_keypoints,
bool verbose,
163 MATCH_PAIR* matches);
166 void writeMatchFile(std::string match_file, std::vector<InterestPoint>
const& ip1,
167 std::vector<InterestPoint>
const& ip2);
169 void saveImagesAndMatches(std::string
const& left_prefix, std::string
const& right_prefix,
170 std::pair<int, int>
const& index_pair, MATCH_PAIR
const& match_pair,
171 std::vector<cv::Mat>
const& images);
174 Eigen::Vector3d TriangulatePair(
double focal_length1,
double focal_length2, Eigen::Affine3d
const& world_to_cam1,
175 Eigen::Affine3d
const& world_to_cam2, Eigen::Vector2d
const& pix1,
176 Eigen::Vector2d
const& pix2);
179 Eigen::Vector3d Triangulate(std::vector<double>
const& focal_length_vec,
180 std::vector<Eigen::Affine3d>
const& world_to_cam_vec,
181 std::vector<Eigen::Vector2d>
const& pix_vec);
185 void detectMatchFeatures(
186 std::vector<dense_map::cameraImage>
const& cams,
187 std::vector<std::string>
const& cam_names,
188 std::vector<camera::CameraParameters>
const& cam_params,
189 std::vector<Eigen::Affine3d>
const& world_to_cam,
int num_overlaps,
190 int initial_max_reprojection_error,
int num_match_threads,
193 std::vector<std::vector<std::pair<float, float>>>& keypoint_vec,
194 std::vector<std::map<int, int>>& pid_to_cid_fid,
195 std::vector<std::string> & image_files);
199 #endif // INTEREST_POINT_H_