BundleFusion那些事兒

背景:前面幾篇博客中寫了很多關于BundleFusion的東西,主要包括bundlefusion的論文閱讀筆記,.sens數據集的生成等,經過最近幾天的工作,我對bundlefusion又有了新的技術積累,在這里整理一下,也算是理一下思路,然后開始新的工作。

1. 生成.sens文件

根據在https://graphics.stanford.edu/projects/bundlefusion/下載的.zip的數據集可知,一個數據集中包含,以frame-xxxxxx.color.png的彩色圖像,有以frame-xxxxxx.depth.png命名的深度圖像,以及,以frame-xxxxxx.pose.txt命名的位姿文件,該文件中存儲的是一幀位姿,一個4x4的矩陣。如下圖所示,所以首先你需要想辦法得到這種標準格式的數據。我曾經把我使用kinectV2相機獲取的深度圖和彩色圖對齊后的數據編輯為如下格式,所有的.pose.txt文件中我都寫入單位陣。我還試著將TUM數據集和ICL-NUIM數據集編輯成下面這種格式,并且我將數據集提供的groundtruth寫入到.pose.txt文件中,目的是想讓bundlefusion按照groundtruth位姿來重建。由于數據集提供的groundtruth是用四元數表示的旋轉,所以需要將四元數轉換為旋轉矩陣,由于我使用的是python腳本,這個是時候,scipy庫就派上用場了,這里面有很多轉換,包括,四元數,旋轉矩陣,旋轉向量,歐拉角之間的轉換。

當然不要忘了,在目錄的最后還有一個info.txt文件, 除了彩色圖的尺寸,相機的內參數,要按照實際情況改寫之后,還有很關鍵的一個參數就是m_depthShift,在BundleFusion官網上下載的數據集,info.txt中設置的m_depthShift =1000,而在我生成TUM和ICL的數據集時,這個值就得設置為10000,否則生成的數據集,重建不出來模型,具體的分析請閱讀我的這篇博客,https://blog.csdn.net/weixin_38636815/article/details/107563959

?下面是我將ICL數據集整理成上述格式的python腳本

import numpy as np
from scipy.spatial.transform import Rotation as R
import associate
import os
import shutildef copy_files(sourcefile):rgb_path = sourcefile+"rgb/"depth_path = sourcefile + "depth/"bf_path = sourcefile + "bf_dataset/"print(rgb_path)print(depth_path)rgb_images = os.listdir(rgb_path)depth_images = os.listdir(depth_path)rgb_int = []depth_int = []for rgb in rgb_images:rgb = rgb.replace('.png', '')# print(rgb)rgb_int.append(int(rgb))for depth in depth_images:depth = depth.replace('.png', '')depth_int.append(int(depth))rgb_id = 0for rgb_name in sorted(rgb_int):print("frame-" + str(rgb_id).zfill(6) + ".color.png" + " is writing into bf_dataset" )shutil.copyfile(rgb_path + "/" + str(rgb_name) + ".png",bf_path + "frame-" + str(rgb_id).zfill(6) + ".color.png")rgb_id += 1depth_id = 0for depth_name in sorted(depth_int):print("frame-" + str(depth_id).zfill(6) + ".depth.png" + " is writing into bf_dataset")shutil.copyfile(depth_path + "/" + str(depth_name) + ".png",bf_path + "frame-" + str(depth_id).zfill(6) + ".depth.png")depth_id += 1"""transform quaternion into rotation and write them into separated pose files"""gt_file = open(sourcefile + "livingRoom3n.gt.freiburg")gt_data =gt_file.read()lines = gt_data.replace(",", " ").replace("\t", " ").split("\n")positions = []quaternions = []lines_data = []for line in lines:line_data = []if len(line) > 0 and line[0] != '#':for v in line.split(' '):line_data.append(v)lines_data.append(line_data)# print(line_data)share_vect = np.array([0, 0, 0, 1], dtype=np.float32)[np.newaxis, :]pose_id = 0for line in lines_data:single_position = np.array([line[1], line[2], line[3]], dtype=np.float32)[:, np.newaxis]single_quaternion = np.array([line[4], line[5], line[6], line[7]], dtype=np.float32)positions.append(single_position)quaternions.append(single_quaternion)rotation = R.from_quat(single_quaternion)m34 = np.concatenate((rotation.as_matrix(), single_position), axis=1)m44 = np.concatenate((m34, share_vect), axis=0)print("frame-" + str(pose_id).zfill(6) + ".pose.txt" + "is writing into bf_dataset")fp = open(bf_path + "frame-" + str(pose_id).zfill(6) + ".pose.txt", 'w')for row in m44:# fp.write(" ".join(row) + "\n")fp.write(' '.join(str(i) for i in row) + '\n')pose_id += 1print(len(positions))print(len(quaternions))if __name__ == '__main__':print('test')# copy_files("/media/yunlei/YL/DATASETS/ICL_DATABASE/lr_kt0/living_room_traj0_frei_png/")# copy_files("/media/yunlei/YL/DATASETS/ICL_DATABASE/lr_kt1/living_room_traj1n_frei_png/")# copy_files("/media/yunlei/YL/DATASETS/ICL_DATABASE/lr_kt2/living_room_traj2n_frei_png/")copy_files("/media/yunlei/YL/DATASETS/ICL_DATABASE/lr_kt3/living_room_traj3n_frei_png/")

假設現在已經 整理出的規范的文件格式,現在我們需要一個工具,將彩色圖,深度圖和位姿數據寫入到.sens文件中,在BundleFusion工程中有實現將圖像寫入到.sens文件的函數,只需要用下面的mian函數替換你原工程 BundleFusion/FriedLiver/Source下FriedLiver.cpp中的主函數,在新的主函數中寫入你自己數據的路徑和名稱,使用ctrl+F5的方式在vs2013中運行此時的工程,可以在saveToFile函數中加上一些打印信息,這樣可以更清楚的看到數據的生成狀態。不出意外的話上述方式就可以成功生成.sens文件。

int main()
{ml::SensorData sd;sd.initDefault(640, 480, 640, 480, sd.m_calibrationColor, sd.m_calibrationDepth);sd.loadFromImages("E:/DATASETS/ICL_DATABASE/lr_kt1/living_room_traj1n_frei_png/bf_dataset", "frame-", "png");sd.saveToFile("E:/DATASETS/ICL_DATABASE/lr_kt1/living_room_traj1n_frei_png.sens");std::cout << "generate sens data" << std::endl;return 0;
}

二、使用自己生成的.sens文件運行BundleFusion

如果你想通過ctrl+F5的方式運行代碼,那么你就修改,位于BundleFusion-master/FriedLiver下的zParametersDefault.txt下的s_binaryDumpSensorFile,當然你也可以先在vs2013上編譯工程,然后雙擊 BundleFusion-master/FriedLiver/x64/Release下的FriedLiver.exe可執行文件,這個時候你需要修改,FriedLiver.exe同目錄下的zParametersDefault.txt文件中的s_binaryDumpSensorFile變量。兩個配置文件中的其他一些參數也要調整,尤其是有關圖像的寬度和高度的變量,要根據你數據集的實際大小來修改。需要注意的是,在zParametersBundingDefault.txt文件中的s_downsampledWidth和s_downsampledHeight這兩變量的值設置不當,會導致系統很容易跟蹤失敗,大面積的跟蹤失敗會導致重建的模型不完整。

如果不出什么意外,自己生成的數據集就可以在bundlefusion上運行了。

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252378.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252378.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252378.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

問題:圖片怎么保存到數據庫, 以及怎么把圖片從數據庫中取出來使用?(已解決)...

簡單&#xff0c;不保存圖片到數據庫&#xff0c;而是圖片的路徑。 也就是說&#xff0c;先把圖片下載到服務器的指定目錄下&#xff0c;然后&#xff0c;在把相對的路徑保存到數據庫中。 如果下次獲取圖片&#xff0c;就訪問數據庫&#xff0c;獲取圖片路徑&#xff0c;然后根…

Oracle Study之--Oracle 11gR2通過RMAN克隆數據庫

Oracle Study之--Oracle 11gR2通過RMAN克隆數據庫Purpose of Database Duplication A duplicate database is useful for a variety of purposes, most of which involve testing. You can perform the following tasks in a duplicate database: Test backup and recovery pro…

ubuntu16.04安裝evo

背景:這已經是我第二次嘗試安裝evo了,最近因為在bundlefusion加入groundtruth的問題搞的很煩躁,我懷疑是不是我給定的groundtruth是不是不正確,所以我就寫python腳本,獲取計算生成的位姿數據,寫入的groundtruth位姿數據.獲取數據后,將數據可視化就成了一個很重要的問題,我還是打…

前端性能優化之gzip

gzip是GNUzip的縮寫&#xff0c;它是一個GNU自由軟件的文件壓縮程序。它最早由Jean-loup Gailly和Mark Adler創建&#xff0c;用于UNⅨ系統的文件壓縮。我們在Linux中經常會用到后綴為.gz的文件&#xff0c;它們就是GZIP格式的。現今已經成為Internet 上使用非常普遍的一種數據…

luogu2770 航空路線問題 網絡流

題目大意&#xff1a; 給定一張航空圖&#xff0c;圖中頂點代表城市&#xff0c;邊代表 2 城市間的直通航線。現要求找出一條滿足下述限制條件的且途經城市最多的旅行路線。(1)從最西端城市出發&#xff0c;單向從西向東途經若干城市到達最東端城市&#xff0c;然后再單向從東向…

手機錄音ogg格式怎么轉換mp3

Ogg這種音頻格式剛出來的時候大家是非常熱愛的&#xff0c;但是隨著時代的發展&#xff0c;這種音頻格式已經已經被取代了&#xff0c;現在呢走在音頻格式前端的是MP3格式&#xff0c;這是大家都比較熟悉的&#xff0c;但是我們還是會經常下載到ogg這種格式的音頻&#xff0c;就…

TP3.2設置URL偽靜態滿足更好的SEO效果

URL偽靜態通常是為了滿足更好的SEO效果&#xff0c;ThinkPHP支持偽靜態URL設置&#xff0c;可以通過設置URL_HTML_SUFFIX參數隨意在URL的最后增加你想要的靜態后綴&#xff0c;而不會影響當前操作的正常執行。 例如&#xff0c;我們設置 URL_HTML_SUFFIX>shtml 的話&#xf…

[機器學習] 推薦系統之協同過濾算法(轉)

[機器學習]推薦系統之協同過濾算法 在現今的推薦技術和算法中&#xff0c;最被大家廣泛認可和采用的就是基于協同過濾的推薦方法。本文將帶你深入了解協同過濾的秘密。下面直接進入正題. 1. 什么是推薦算法 推薦算法最早在1992年就提出來了&#xff0c;但是火起來實際上是最近這…

BundleFusion代碼框架講解

背景&#xff1a;前面用了幾篇文章來記錄和總結了&#xff0c;我在研究bundlefusion過程中遇到的一些問題以及解決方法&#xff0c;本來想實現給bundlefusion輸入先驗軌跡&#xff0c;然后讓其根據給定的軌跡進行重建&#xff0c;這樣即便在環境比較惡劣的情況下&#xff0c;也…

BundlePhobia

1、BundlePhobia用于分析npm package的依賴、bundle后的大小、下載速度預估等等&#xff0c;幫助你在引用一個package之前了解引入該package的代價。 2、也可以將項目的package.json文件上傳&#xff0c;BundlePhobia會幫你評估項目中所有包的大小和加載速度。

VFL演示樣例

VFL演示樣例 上篇文章向大家介紹了VFL的基本的語法點&#xff0c;假設對下面演示樣例不熟的童鞋&#xff0c;能夠前去參考。廢話不多說。我們直接來看演示樣例。演示樣例一 將五個大小同樣、顏色不同的view排成一行&#xff0c;view間的間隔為15px,第一個view的間隔與屏幕的左邊…

evo實用指令指南

下面這篇文章中有比較具體的關于evo的安裝以及使用的介紹&#xff0c;其中一點很重要&#xff0c;就是可以把euroc形式的.csv的軌跡格式轉換為tum格式的軌跡。 https://zhuanlan.zhihu.com/p/88223106#single evo_traj tum orb_slam2_tum.txt --reftum_groundtruth.txt -p --pl…

MailUtils

/***包名:com.thinkgem.jeesite.test*描述:package com.thinkgem.jeesite.test;*/ package com.thinkgem.jeesite.test;import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Properties; import java.util.regex.Matcher; import java.u…

ES6遍歷對象

遍歷對象 E S 6 一共有 5 種方法可以遍歷對象的屬性 。 for ... in for . . . in 循環遍歷對象自身的和繼承的可枚舉屬性&#xff08;不含 Symbol 屬性&#xff09;。 Object.keys(obj)Object . keys 返回 一個數組&#xff0c;包括對象自身的&#xff08;不含繼承的 &#xff…

SpringMvc中ModelAndView模型的應用

/** * 目標方法的返回值可以是 ModelAndView 類型。 * 其中可以包含視圖和模型信息 * SpringMVC 會把 ModelAndView 的 model 中數據放入到 request 域對象中. * return */ RequestMapping("/testModelAndView") public ModelAndView testModelAndView(){ String v…

ubuntu16.04 + ros-kinetic 配置cartographer

其實一直以來都感覺純視覺SLAM很難落地產品&#xff0c;所以一直在找機會學習激光slam,之前也在深藍學院上買了一個激光salm的課程&#xff0c;慚愧&#xff0c;至今也沒開始學呢&#xff0c;年底之前&#xff0c;我想工作之余研究一下激光slam和ros&#xff0c;我感覺這兩個東…

virtualbox中安裝ubuntu

為什么80%的碼農都做不了架構師&#xff1f;>>> virtualboxubuntu 安裝virtualbox&#xff0c;當前版本是6.0.4下載ubuntu安裝盤&#xff0c;建議lubuntu&#xff0c;鏈接是http://mirrors.ustc.edu.cn/ubuntu-cdimage/lubuntu/releases/18.04.2/release/lubuntu-1…

面向對象重寫(override)與重載(overload)區別

一、重寫&#xff08;override&#xff09; override是重寫&#xff08;覆蓋&#xff09;了一個方法&#xff0c;以實現不同的功能。一般是用于子類在繼承父類時&#xff0c;重寫&#xff08;重新實現&#xff09;父類中的方法。 重寫&#xff08;覆蓋&#xff09;的規則&#…

cartographer學習筆記--如何保存cartagrapher_ros建好的地圖

今天開始跟著網友大佬學習cartographer. 1. 如何保存cartographer的地圖數據 在運行cartographer過程中可以隨時保存建好的地圖&#xff0c;步驟如下&#xff1a; 首先是重新打開一個terminal, 如果你沒有將你的cartographer_ros下的setup.bash文件寫入到.bashrc中&#xff…

Java微信公眾號開發(五)—— SVN版本控制工具

1 作用 兩個疑問&#xff1a; 什么是版本控制&#xff1f;為什么要用版本控制工具&#xff1f;作用&#xff1a; 受保護受約束合作開發中&#xff0c;版本控制工具更重要的作用就是讓開發者更好地協作&#xff0c;每個人的代碼既能互相調用&#xff0c;來共同完成一個較大的功…