使用LF-Net進(jìn)行三維重建

LF-Net就是"LF-Net: Learning Local Features from Images"一種端到端的深度學(xué)習(xí)局部特征子.
基于OpenMVG稍微對特征提取部分進(jìn)行改造即可使用深度學(xué)習(xí)特征點(diǎn)進(jìn)行重建

主要內(nèi)容:

  • OpenMVG代碼修改
  • 重建實(shí)驗(yàn)對比
  • 結(jié)論

一. 代碼修改

主要修改代碼如下:
1.在regions_factory_io.hpp注冊下新的特征點(diǎn)览绿,用來序列化

CEREAL_REGISTER_TYPE_WITH_NAME(openMVG::features::LFNET_Float_Regions , "LFNET_Float_Regions");
CEREAL_REGISTER_POLYMORPHIC_RELATION(openMVG::features::Regions, openMVG::features::LFNET_Float_Regions)

2.在region_factory.hpp聲明新的特征點(diǎn)類型:

using LFNET_Float_Regions = Scalar_Regions<SIOPointFeature, float, 256>;
EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION_INITIALIZER_LIST(openMVG::features::LFNET_Float_Regions)

3.最后寫一下怎么讀取特征點(diǎn)策严,我直接寫了新的app實(shí)現(xiàn)這個功能.

class LFNET_Image_describer : public Image_describer
{
public:
    using Regions_type = LFNET_Float_Regions;

    LFNET_Image_describer() : Image_describer() {}
    ~LFNET_Image_describer() {}

    bool Set_configuration_preset(EDESCRIBER_PRESET preset){
        return true;
    }

    std::unique_ptr<Regions> Describe(
            const image::Image<unsigned char>& image,
            const image::Image<unsigned char> * mask = nullptr
    ) override
    {
        return Describe_LFNET(image, mask);
    }

    std::unique_ptr<Regions_type> Describe_LFNET(
            const image::Image<unsigned char>& image,
            const image::Image<unsigned char>* mask = nullptr
    )
    {
        std::string filename_=filename;
        auto regions = std::unique_ptr<Regions_type>(new Regions_type);
        std::ifstream infile_feat(filename_);
        std::string feature;

        float feat_onePoint;  //存儲每行按空格分開的每一個float數(shù)據(jù)
        std::vector<float> lines; //存儲每行數(shù)據(jù)
        std::vector<vector<float>> lines_feat; //存儲所有數(shù)據(jù)
        lines_feat.clear();
        while(!infile_feat.eof())
        {
            getline(infile_feat, feature); //一次讀取一行數(shù)據(jù)

            stringstream stringin(feature); //使用串流實(shí)現(xiàn)對string的輸入輸出操作
            lines.clear();
            while (stringin >> feat_onePoint) {      //按空格一次讀取一個數(shù)據(jù)存入feat_onePoint
                lines.push_back(feat_onePoint); //存儲每行按空格分開的數(shù)據(jù)
            }
            if(lines.size() != 0){
                lines_feat.push_back(lines); //存儲所有數(shù)據(jù)
            }
        }
        infile_feat.close();
        regions->Features().reserve(lines_feat.size());
        regions->Descriptors().reserve(lines_feat.size());

        // Copy keypoints and descriptors in the regions
        int cpt = 0;
        for (auto i_kp = lines_feat.begin();
             i_kp != lines_feat.end();
             ++i_kp, ++cpt)
        {
            SIOPointFeature feat((*i_kp)[0], (*i_kp)[1], 0, 0);
            regions->Features().push_back(feat);

            Descriptor<float, 256> desc;
            //
            for (int j = 0; j < 256; j++)
            {
                desc[j] = (*i_kp)[j+2];
            }
            //
            regions->Descriptors().push_back(desc);
        }
        return regions;
    };
    /// Allocate Regions type depending of the Image_describer
    std::unique_ptr<Regions> Allocate() const override
    {
        return std::unique_ptr<Regions_type>(new Regions_type);
    }
    template<class Archive>
    void serialize( Archive & ar )
    {
    }
};
#include <cereal/cereal.hpp>
#include <cereal/types/polymorphic.hpp>
CEREAL_REGISTER_TYPE_WITH_NAME(LFNET_Image_describer, "LFNET_Image_describer");
CEREAL_REGISTER_POLYMORPHIC_RELATION(openMVG::features::Image_describer, LFNET_Image_describer)

二. 重建實(shí)驗(yàn)對比

對于重建的結(jié)果如下:


軌跡投影

XYZ

APE

看起來效果還是可以的,對比下SIFT的方法結(jié)果饿敲,由于我只是更改了pipline特征提取的一層妻导,后面優(yōu)化流程是一樣的,所以可以很好的進(jìn)行對比研究.


image1.png

image2.png

SIFT里面中間有四幀重建失敗了.....導(dǎo)致看起來不太好,還需要再試試倔韭,一次性重建一千多張圖片還是很費(fèi)時間的

每隔五幀重建對比:

中間有兩幀失敗了术浪,導(dǎo)致誤差比較大,分別是"1305031938.769073.png"和"1305031938.936828.png"連續(xù)兩幀寿酌,這樣導(dǎo)致的誤差就比較大了
這相鄰四幀如下:


1305031938.601007.png

1305031938.769073.png

1305031938.936828.png

1305031939.101368.png

看起來是中間無紋理區(qū)域?qū)е缕ヅ涫?br> 而且圖片比較模糊
不過實(shí)際比較下發(fā)現(xiàn)其實(shí)在這相鄰幾幀匹配效果是不錯的:

所以還是重建過程中在這一段累積的誤差最后導(dǎo)致在這里失敗了......
同時還有問題就是胰苏,邊緣的特征點(diǎn)形成畫框一樣的分布都不是好的特征點(diǎn)

每隔十幀重建對比:

初看效果出奇的好,不過要考慮到醇疼,其中只成功了70幀硕并,本來130幀的,也就是因?yàn)閛verlap太大直接崩了.


image4.png

image.png

看看哪塊崩來秧荆?


match_screenshot_09.06.2019.png

外點(diǎn)還是蠻多的
不過應(yīng)該不至于ransac都找不到正確匹配吧..
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末倔毙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辰如,更是在濱河造成了極大的恐慌,老刑警劉巖贵试,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琉兜,死亡現(xiàn)場離奇詭異,居然都是意外死亡毙玻,警方通過查閱死者的電腦和手機(jī)豌蟋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桑滩,“玉大人梧疲,你說我怎么就攤上這事≡俗迹” “怎么了幌氮?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長胁澳。 經(jīng)常有香客問我该互,道長,這世上最難降的妖魔是什么韭畸? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任宇智,我火速辦了婚禮,結(jié)果婚禮上胰丁,老公的妹妹穿的比我還像新娘随橘。我一直安慰自己,他們只是感情好锦庸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布机蔗。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蜒车。 梳的紋絲不亂的頭發(fā)上讳嘱,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機(jī)與錄音酿愧,去河邊找鬼沥潭。 笑死,一個胖子當(dāng)著我的面吹牛嬉挡,可吹牛的內(nèi)容都是我干的钝鸽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼庞钢,長吁一口氣:“原來是場噩夢啊……” “哼拔恰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起基括,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤颜懊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后风皿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體河爹,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年桐款,在試婚紗的時候發(fā)現(xiàn)自己被綠了咸这。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡魔眨,死狀恐怖媳维,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情遏暴,我是刑警寧澤侄刽,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站朋凉,受9級特大地震影響唠梨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侥啤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一当叭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盖灸,春花似錦蚁鳖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钾腺。三九已至,卻和暖如春讥裤,著一層夾襖步出監(jiān)牢的瞬間放棒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工己英, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留间螟,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓损肛,卻偏偏與公主長得像厢破,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子治拿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,383評論 0 5
  • JAVA序列化機(jī)制的深入研究 對象序列化的最主要的用處就是在傳遞,和保存對象(object)的時候,保證對象的完整...
    時待吾閱讀 10,864評論 0 24
  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當(dāng)在唯一索引所對應(yīng)的列上鍵入重復(fù)值時摩泪,會觸發(fā)此異常。 O...
    我想起個好名字閱讀 5,317評論 0 9
  • 問題導(dǎo)讀: 1.如何構(gòu)建高并發(fā)電商平臺架構(gòu) 2.哈希劫谅、B樹见坑、倒排、bitmap的作用是什么捏检? 3.作為軟件工程師荞驴,...
    MaLiang閱讀 5,123評論 1 70
  • 高并發(fā)平臺架構(gòu) 設(shè)計(jì)理念 1. 空間換時間 多級緩存,靜態(tài)化前端頁面緩存(HTTP Header中包含Expire...
    AkaTBS閱讀 3,020評論 0 13