Skip to content
Snippets Groups Projects
Commit c5c3d3e6 authored by César DEBEUNNE's avatar César DEBEUNNE :bicyclist:
Browse files

Use homogeneous pixels for Outlier rejection

Makes it more modular
Add getters for eigen points on WKeyPoints
Add computeRay to sensorCamera
Edit filterWithEssential
parent d3065a35
No related branches found
No related tags found
2 merge requests!36After cmake and const refactor,!28Resolve "Building a new visual odometry system"
...@@ -60,6 +60,9 @@ class WKeyPoint ...@@ -60,6 +60,9 @@ class WKeyPoint
cv::KeyPoint getCvKeyPoint() const {return cv_kp_;} cv::KeyPoint getCvKeyPoint() const {return cv_kp_;}
void setCvKeyPoint(cv::KeyPoint _cv_kp) {cv_kp_ = _cv_kp;} void setCvKeyPoint(cv::KeyPoint _cv_kp) {cv_kp_ = _cv_kp;}
Eigen::Vector2f getEigenKeyPoint() const {return Eigen::Vector2f(cv_kp_.pt.x, cv_kp_.pt.y);}
cv::Point2f getCvPoint() const {return cv_kp_.pt;}
cv::Mat getDescriptor() const {return desc_;} cv::Mat getDescriptor() const {return desc_;}
void setDescriptor(cv::Mat _desc) {desc_ = _desc;} void setDescriptor(cv::Mat _desc) {desc_ = _desc;}
......
...@@ -120,6 +120,7 @@ class SensorCamera : public SensorBase ...@@ -120,6 +120,7 @@ class SensorCamera : public SensorBase
bool useRawImages(); bool useRawImages();
bool useRectifiedImages(); bool useRectifiedImages();
Eigen::Vector3f computeRay(Eigen::Vector2f _pix);
int getImgWidth(){return img_width_;} int getImgWidth(){return img_width_;}
int getImgHeight(){return img_height_;} int getImgHeight(){return img_height_;}
......
...@@ -651,20 +651,26 @@ bool ProcessorVisualOdometry::filterWithEssential(const KeyPointsMap _mwkps_prev ...@@ -651,20 +651,26 @@ bool ProcessorVisualOdometry::filterWithEssential(const KeyPointsMap _mwkps_prev
std::vector<size_t> all_indices; std::vector<size_t> all_indices;
for (auto & track : _tracks_prev_curr){ for (auto & track : _tracks_prev_curr){
all_indices.push_back(track.first); all_indices.push_back(track.first);
p2f_prev.push_back(_mwkps_prev.at(track.first).getCvKeyPoint().pt); Eigen::Vector3f ray_prev = sen_cam_->computeRay(_mwkps_prev.at(track.first).getEigenKeyPoint());
p2f_curr.push_back(_mwkps_curr.at(track.second).getCvKeyPoint().pt); Eigen::Vector3f ray_curr = sen_cam_->computeRay(_mwkps_curr.at(track.second).getEigenKeyPoint());
p2f_prev.push_back(cv::Point2f(ray_prev.x() / ray_prev.z(), ray_prev.y() / ray_prev.z()));
p2f_curr.push_back(cv::Point2f(ray_curr.x() / ray_curr.z(), ray_curr.y() / ray_curr.z()));
} }
// We need at least five tracks // We need at least five tracks
if (p2f_prev.size() < 5) return false; if (p2f_prev.size() < 5) return false;
cv::Mat cvMask; cv::Mat cvMask;
cv::Mat K = cv::Mat::eye(3,3,CV_32F);
float focal = (sen_cam_->getIntrinsicMatrix()(0,0) +
sen_cam_->getIntrinsicMatrix()(1,1)) / 2;
_E = cv::findEssentialMat(p2f_prev, _E = cv::findEssentialMat(p2f_prev,
p2f_curr, p2f_curr,
Kcv_, Kcv_,
cv::RANSAC, cv::RANSAC,
prms.ransac_prob_, prms.ransac_prob_,
prms.ransac_thresh_, prms.ransac_thresh_ / focal,
cvMask); cvMask);
// Let's remove outliers from tracksMap // Let's remove outliers from tracksMap
......
...@@ -71,6 +71,13 @@ Eigen::Matrix3d SensorCamera::setIntrinsicMatrix(Eigen::Vector4d _pinhole_model) ...@@ -71,6 +71,13 @@ Eigen::Matrix3d SensorCamera::setIntrinsicMatrix(Eigen::Vector4d _pinhole_model)
K.row(2) << 0, 0, 1; K.row(2) << 0, 0, 1;
return K; return K;
} }
Eigen::Vector3f SensorCamera::computeRay(Eigen::Vector2f _pix)
{
Eigen::Vector3f ray;
ray = K_.cast<float>().inverse() * Eigen::Vector3f(_pix.x(), _pix.y(), 1);
return ray;
}
} // namespace wolf } // namespace wolf
// Register in the FactorySensor // Register in the FactorySensor
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment