VO的初始化
利用LK光流和本質矩陣恢復的初始化:
待更
#include <opencv2/features2d.hpp>
#include <opencv2/core/types.hpp>
#include <opencv2/calib3d.hpp>
#include <opencv2/video/tracking.hpp>
#include<iostream>
#include<vector>
using namespace std;
class Initialization
{
private:
bool is_first_frame_;
cv::Mat frame_ref_;
cv::Mat frame_cur_;
vector<cv::Point2f> p2d_ref_;
vector<cv::Point2f> p2d_cur_;
public:
Initialization():is_first_frame_(true){};
~Initialization(){};
void addFrame(cv::Mat& frame);
void detectFeatures(cv::Mat& frame,vector<cv::Point2f>& p2d);
void trackFeatures(cv::Mat& frame_ref, cv::Mat& frame_cur,
vector<cv::Point2f>& p2d_ref, vector<cv::Point2f>& p2d_cur);
void recoverRT(vector<cv::Point2f>& p2d_ref, vector<cv::Point2f>&
p2d_cur,cv::Mat& cameraMatrix);
};
void Initialization::addFrame(cv::Mat& frame)
{
if(is_first_frame_){
frame_ref_ = frame;
detectFeatures(frame_ref_,p2d_ref_);
is_first_frame_ = false;
}
frame_cur_ = frame;
detectFeatures(frame_cur_,p2d_cur_);
return;
}
void Initialization::detectFeatures(cv::Mat& frame,vector<cv::Point2f>& p2d)
{
auto detector = cv::FastFeatureDetector::create(10,true);
vector<cv::KeyPoint> kpts;
detector->detect(frame,kpts);
p2d.resize(kpts.size());
for(auto kpt:kpts) p2d.emplace_back(kpt.pt);
return;
}
void Initialization::trackFeatures(cv::Mat& frame_ref, cv::Mat& frame_cur,
vector<cv::Point2f>& p2d_ref, vector<cv::Point2f>& p2d_cur)
{
const int win_size = 10;
vector<uchar> features_found;
cv::calcOpticalFlowPyrLK(frame_ref,frame_cur,p2d_ref,p2d_cur,features_found,
cv::noArray(), cv::Size(win_size*2+1,win_size*2+1),3,cv::TermCriteria(
cv::TermCriteria::MAX_ITER | cv::TermCriteria::EPS,20,0.3));
auto p2d_ref_it = p2d_ref.begin();
auto p2d_cur_it = p2d_cur.begin();
for(int i=0;i<features_found.size();i++,p2d_ref_it++,p2d_cur_it++){
if(!features_found[i]){
p2d_ref.erase(p2d_ref_it);
p2d_cur.erase(p2d_cur_it);
}
}
return;
}
void Initialization::recoverRT(vector<cv::Point2f>& p2d_ref, vector<cv::Point2f>&
p2d_cur,cv::Mat& cameraMatrix)
{
cv::Mat E, R, t;
E = findEssentialMat(p2d_ref, p2d_cur, cameraMatrix, cv::RANSAC, 0.999, 1.0, cv::noArray());
recoverPose(E, p2d_ref, p2d_cur, cameraMatrix, R, t, cv::noArray());
cout<<"R: "<<R<<endl;
cout<<"t: "<<t<<endl;
}
相關文章
- javabean:VO和POJO的區別?JavaBeanPOJO
- DTO轉VO工具
- Java | DO / DTO / BO / VO的區別Java
- vo bo dto pojo(entity)POJO
- OAF export data from VO in xlsx formatExportORM
- PO、VO、DTO、DO等淺析
- Java中PO、DO、TO、DTO、 VO、 BO、POJO 、DAO的概念JavaPOJO
- VO/DTO/DO/PO通俗的解釋加上自己的理解
- POJO、PO、DO、VO、DTO等淺析POJO
- filebeat 5.3.1 結合 rancher 和 data-vo
- java的幾種物件(PO,VO,DAO,BO,POJO,DTO)解釋Java物件POJO
- 淺析VO、DTO、DO、PO的概念、區別和用處
- 專案中DO、PO、BO,DTO、VO的概念與意義
- 概念POJO、DTO、DAO、PO、BO、VO、ENTITY詳解POJO
- DO、DTO、BO、AO、VO、POJO定義規範POJO
- VO(檢視模型) 與 DTO(資料傳輸物件)的區別模型物件
- 手機存量市場下的激烈角逐:VO榮米格局初定
- Mybatis的初始化和結合Spring Framework後初始化的MyBatisSpringFramework
- 深入理解javascript系列(四):變數物件(VO)1JavaScript變數物件
- 深入理解javascript系列(五):變數物件(VO)2JavaScript變數物件
- 陣列的初始化陣列
- ()和{}初始化的用法
- 前端入門16-JavaScript進階之EC和VO前端JavaScript
- Mybatis的初始化和結合Spring Framework後初始化的原始碼探究MyBatisSpringFramework原始碼
- Java開發中的幾種物件的說明(PO,VO,DTO,BO,POJO,DAO,SAO等)Java物件POJO
- 類的初始化場景
- Spring IoC bean 的初始化SpringBean
- MyBatis是如何初始化的?MyBatis
- Spring Bean如何初始化的SpringBean
- 物件的初始化和清理物件
- 後端開發基礎概念 Entity,DAO,DO,DTO,VO, Service,Controller後端Controller
- ThinkCMF製作文章列表 <portal:articles 標籤報錯 Undefined variable $voUndefined
- OpenKruise v0.5.0 版本釋出 | 雲原生生態週報 VoUI
- 深入瞭解 iOS 的初始化iOS
- Go初始化變數的招式Go變數
- java類初始化的順序Java
- Java中String類的初始化?Java
- webrtc PeerConnectionFactory 的初始化流程分析Web