通过单眼摄像头复原3d模型
为了能够通过单眼摄像头实现3d识别,sfm(structure from motion)的技术。采用的方法是,移动摄像头的位置,获得视点不同的多个图像,然后对这些图像加以比较,从而复原拍摄对象的三维(3d)模型。对于车载摄像头,只要车辆移动就能获得视点不同的多个图像,因此可以使用sfm制作车辆周边的简易3d模型。
获得的3d模型如何应用不是由芯片来决定的,而是取决于开发者。比如,可以组合使用由多个车载摄像头获得的图像生成的360度图像,从而提高驾驶辅助的精度等。上述一系列的图像识别处理利用vga和全高清(1920×1080像素)车载摄像头就能实现,无需专门选择某种摄像头。
1. bundler简介
bundler是一个采用c和c++开发的称为sfm(struct-from-motion)的系统,它能够利用无序的图片集合(例如来自网络的图片)重建出3d的模型。最早的版本被用在photo tourism的项目上。
bundler的输入是一些图像、图像特征以及图像匹配信息,输出则是一个根据这些图像反应的场景的3d重建模型,伴有少量识别得到的相机以及场景几何信息。系统借用一个由lourakis 和argyros提供的称为sparse bundle adjustment的开发包的修改版,一点一点递增地重建出图像场景。bundler已经成功的应用在许多网络相册系统,尤其是一些建筑相册里。
2. bundler的编译
下载到bundler的源代码之后,我们首先要对其进行编译。在bundler-v0.4-source\vc++\文件夹下有visual studio2005创建的工程bundler.sln,当然我们也可以使用更高的版本进行编译。
在编译f2c时,会给出无法找到#includesysdep1.h文件的错误。进入f2c的目录,将sysdep1.h0文件名修改为sysdep1.h即可。
同时将signal1.h0文件名修改为signal1.h。再次编译f2c库时,会提示无法找到#includearith.h文件的错误,同时在f2c目录下并没有名字为arith.h的文件,这时可以新建一个arith.h文件,在文件里添加如下内容即可:
#define ieee_8087
#define arith_kind_asl 1
#define long int
#define intcast (int)(long)
#define double_align
#define x64_bit_pointers
#define qnan0 0x0
#define qnan1 0xfff80000
这时,编译f2c,便成功了。
接下来编译keymatchfull和bundler项目,一切顺利。
为了进行获得稠密的三围重建效果,利用bundler提供的bundle2pmvs和radialundistort工具,生成稠密重建pmvs软件所需的参数。
在编译bundlr2pmvs时,在bundle2pmvs.cpp文件中会出现“未知的标识符mkdir”的错误。在文件的开头添加#include,
同时将mkdir替换为_mkdir,如下所示:
//mkdir(output_path,0770);
_mkdir(output_path);
至此,bundle2pmvs编译成功。
在编译radialundistort时,在radialundistort.cpp文件中会出现“无法识别的标识符index”。
原先的代码如下所示:
//char *space = index(buf, ' ');
//if (space) *space = 0;
将其替换为:
std::string str(buf);
int space_pos = str.find(' ');
str.at(space_pos) = 0;
files.push_back(str);
至此,radialundistort编译成功。
3. bundler的运行
编译完成后,需要将bundler-v0.4-source\vc++\debug\目录下的bundler.exe,keymatchfull.exe, radialundistort.exe, bundle2pmvs.exe, jpeg.dll,ann_1.1_char.dll文件统统考到bundler-v0.4-source\bin\目录下。
在成功执行bundler前,我们需要做几步准备工作:
1.下载和安装cygwin。cygwin是许多自由软件的集合,最初由cygnus solutions开发,用于各种版本的microsoft windows上,运行unix类系统。由于bundler默认是通过在unix环境下执行shell脚本来启动bundler的,因为在windows环境下需要安装cygwin以执行shell脚本。
要下载cygwin,直接在setup.exe上点右键“另存为”即可。也可以复制右边这个地址:http://cygwin.com/setup.exe
cygwin的安装比较简单,可以参考这篇教程:
但要注意一点,bundler程序中会使用perl、python来进行一些预处理,因此在安装过程中需要把devel、perl、python三个组件库都选上。另外还有imagemagick这个库,用来处理图片。
下载安装的时间比较久,需要等待一段时间。安装过程中一些杀毒软件(比如360)可能会提示一些安全警告,无视即可。
2.下载特征检测器。bundler推荐使用sift来进行特征提取,可以到sift的作者david lowe的主页上下载他提供的sift demo作为我们的检测器。
下载完成后,解压该文档,将目录下的siftwin32.exe文件拷贝到base_path\bin目录中。
3.准备图片。将要进行分析处理的图片放到一个目录里,比如base_path\pictures\中(下面也统一以pictures代替图片目录)。作为例子,bundler自己也提供了两套图片,分别放在base_path\examples\et和base_path\examples\kermit中。
4.下面对运行bundler的脚本文件进行修改:
把runbundler.sh文件中base_path=$(dirname $(which $0)); 一句等号后边的东西替换为bundler的根目录,也就是runbundler.sh文件所在的目录,记得加双引号。如base_path=e:/sdk/bundler-v0.4-source;。
然后把tosift.sh文件中bin_path设为bin目录,如bin_path=e:/sdk/bundler-v0.4-source/bin。
5.这下就大功告成了!!
打开cygwin,cd定位到bundler根目录下,然后输入下面的命令测试一下例子的图片:
./runbundler.sh examples/et
4. 后续工作
bundler输出的文件大多以“bundle_*.out”的形式来命名,我们称之为“bundle文件”。缺省命令下,bundler在每张图片经过分析和注册(register)后都会输出一个相应的bundle文件用来保存当前的状态信息,并以“bundle_.out”的形式命名。当所有的文件都注册后,bundler就会输出一个最终的文件“bundle.out”。另外,每一回合结束时还会紧接着生成一些后缀名为“ply”的文件,这些文件包含的是经过重建后的相机和点的信息。
这些ply文件可以通过使用专用的查看器scanalyze来查看,
当然也可以通过meshlab来查看。
利用bundler可以得到较为稀疏的点云(pointclouds)数据。如果需要得到更密集的点,可以使用yasutaka furukawa博士写的另外一个非常强大的软件包,称为pmvs2,
一种比较常见的途径是使用bundler来得到相机参数,然后使用bundle2pmvs程序,将生成结果转换为pmvs2的输入,然后使用pmvs2来得到更密集的点云。另外,读者们可能会对另外一个同样由furukawa博士开发的实用工具——cmvs感兴趣,cmvs是一个场景聚类程序,在使用pmvs2前可以使用它来进行一些预处理,
硅光子市场前景光明,工艺制造却面临挑战
我国液晶显示技术首次领先日韩
入耳式蓝牙耳机哪款音质好?入耳式降噪蓝牙耳音质排行榜
常用的串口通信协议之UART异步串行通信简析
是谁带来了万物互联时代?我们最应感谢的是射频技术
关于单目摄像头实现3D识别SFM技术的研究
评选2017年续航最强手机:三星Galaxy S8 Active上榜,iPhoneX不再其中
昆明发布政策措施,率先实施新能源汽车车电分离模式
我国超级计算机应用首次摘得“戈登·贝尔”奖
什么软件可以打开HEIC
学生宿舍安全用电智能管理终端设计
为什么示波器波形放大之后会有锯齿?
TI针对TMS320C2000微处理器推出controlSU
全球液晶面板出货量增长率下降,都去用AMOLED面板了吗
国民技术N32G455系列通用MCU累计具有超过100个产品应用案例
LCD模块液晶屏静电保护图及ESD二极管选型
海信成功实现了5G信号下8K超高清视频的在线播放
AT89C51单片机在无线数据传输中的应用
Intel Xe HPC芯片的内部照片曝光: 双芯、7种工艺
企业数字化转型艰难?三座大山难以推倒