整个过程根据脚本执行过程来分析。
首先我们看到RunBundler.sh,这个shell脚本。
1、定义参数
BASE_PATH="/cygdrive/e/ProjectBefore/LearnCUDA/bundler_sfm-master"; if [ $BASE_PATH == "TODO" ] then echo "Please modify this script (RunBundler.sh) with the base path of your bundler installation."; exit; fi EXTRACT_FOCAL=$BASE_PATH/bin/extract_focal.pl OS=`uname -o` if [ $OS == "Cygwin" ] then MATCHKEYS=$BASE_PATH/bin/KeyMatchFull.exe BUNDLER=$BASE_PATH/bin/Bundler.exe else MATCHKEYS=$BASE_PATH/bin/KeyMatchFull BUNDLER=$BASE_PATH/bin/bundler fi TO_SIFT=$BASE_PATH/bin/ToSift.sh IMAGE_DIR="."
2、Rename ".JPG" to ".jpg"
用到了正则表达式egrep跟替换sed
3、Create the list of images
这样这个就执行到了perl脚本,脚本中给出了常见相机的ccd尺寸。
这个ccd的尺寸也就是感光器件的面积大小。目前主要尺寸有2/3英寸、1/1.8英寸、1/2.7英寸、1/3.2英寸等
举一个例子,标称1/2.7英寸的感光器件,实际上是把感光器件的全部面积(包括有效和无效的部分),连同其固定支架、电子快门、辅助输出接口等等一股脑都“用一个圆包起来”,这个
圆的直径才是1/2.7英寸,即9.407mm! 而实际参与成像的“CCD感光区”尺寸,只有5.27mm×3.96mm!
其它常见的小CCD实际尺寸如下: 1/2.5英寸:5.38x4.39mm; 1/1.8英寸:7.178x5.319mm; 2/3英寸:8.8x6.6mm;
作者将ccd的尺寸转换成了CCD的感光区域的宽。如果相机的中心点在感光区域的中心的话,这样我们就可以得到相机的内参的中心点。
然后通过jhead来获取照片的exif信息,如下:
另外并不是所有的相机照片都会有上述信息,如下:
这个脚本的目的也就是为了获得可以通过jhead获得的相机参数
4、接下来在看RunBundler.sh,就是特征提取执行ToSift.sh脚本
Run the ToSift script to generate a list of SIFT commands
5、Execute the SIFT commands
sift使用了siftWin32.exe
6、Match images (can take a while)
7、Generate the options file for running bundler
8、Run Bundler
主要流程如上,对于下面重点分析Run Bundler。