现在利用bundler-v0.4-source 来取得内外参
现在要把bundler作为一个函数来使用,首先要抛弃Cygwin,自己来做所有工作。
先来看一下bundler的输入:
1。一组图(最少两个图),由一个list.txt提供路径和文件名
2。所有图的sift特征点和描述符 ,由list_keys.txt 提供
3。一个从图像中提取得参考焦距,也放到list.txt 中
4。一个options.txt,就取默认设置
两个图 et000.jpg 和 et001.jpg
list.txt文件为:
C:\2345downloads\bundler-v0.4-source\examples\ET\et000.jpg
C:\2345downloads\bundler-v0.4-source\examples\ET\et001.jpg
list_keys.txt文件为
C:\2345downloads\bundler-v0.4-source\examples\ET\et000.key
C:\2345downloads\bundler-v0.4-source\examples\ET\et001.key
下面用siftWin32.exe来生成*.key
FILE *fp1;
if((fp1=fopen("list.txt","r"))==NULL) printf("Can not open List File!\n");
char buff[255];
char cmd[255];
while (fgets(buff, 255, (FILE*)fp1))//读出一个文件名(一行)
{
char *ret;
const char needle[] = ".jpg";
ret = strstr(buff, needle);
if (ret!=NULL)
{
sprintf(cmd,"jpg2bmp %s", buff);//用jpg2bmp转化为bmp文件
system(cmd);
system("bmp2pgm");//bmp文件再转化为pgm文件
strcpy(ret, ".key");//'jpg'字符串替换成'key'
sprintf(cmd,"siftWin32 <tmp.pgm >%s", buff);//生成key
system(cmd);
}
}
fclose(fp1);
然后用前文哪样取得焦距放入list.txt中:
C:\2345downloads\bundler-v0.4-source\examples\ET\et000.jpg 0 660.803
C:\2345downloads\bundler-v0.4-source\examples\ET\et001.jpg 0 660.803
现在可以运行KeyMatchFull,再bundler了,由于只有两个图,很快运行结束,打开bundler.out
就可以得到每个图的焦距,和径向畸变系数了
# Bundle file v0.3
2 151
6.5866037911e+002 -6.5668852849e-002 -1.1324066760e-002
9.9998847390e-001 1.5594032074e-003 4.5409623044e-003
-1.5699400455e-003 9.9999608163e-001 2.3177582957e-003
-4.5373301915e-003 -2.3248606195e-003 9.9998700374e-001
1.1778667749e-002 9.6239431146e-003 4.5996287470e-002
6.5775554697e+002 -6.3056692125e-002 -2.3913975570e-002
9.9907745510e-001 -3.0632032802e-002 -3.0098459563e-002
2.2577829338e-002 9.7085032431e-001 -2.3862080676e-001
3.6530539608e-002 2.3772111046e-001 9.7064627610e-001
-6.0720867787e-002 -8.7794562857e-001 -4.4285546312e-001
1.3343488696e+000 -3.5480151593e-001 -3.2108441052e+000
72 58 15
2 0 36 273.5400 -72.8900 1 62 249.1500 -76.9300
1.2829642148e+000 -3.5864588844e-001 -3.4285022999e+000
202 175 44
2 0 37 245.4500 -68.9500 1 64 229.1900 -65.0700
图1焦距f=6.5866037911e+002,径向畸变系数k1= -6.5668852849e-002,k2=-1.1324066760e-002
图2焦距f=6.5775554697e+002,径向畸变系数k1= -6.3056692125e-002,k2=-2.3913975570e-002
然后运行RadialUndistort可得畸变校正后的图
void UndistortImage(const std::string &in,
const camera_params_t &camera,
const std::string &out)
{
printf("校正图象 %s\n", in.c_str());
fflush(stdout);
img_t *img = LoadJPEG(in.c_str());
int w = img->w;
int h = img->h;
img_t *img_out = img_new(w, h);
double f2_inv = 1.0 / (camera.f * camera.f);
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
double x_c = x - 0.5 * w;
double y_c = y - 0.5 * h;
double r2 = (x_c * x_c + y_c * y_c) * f2_inv;
double factor = 1.0 + camera.k[0] * r2 + camera.k[1] * r2 * r2;
x_c *= factor;
y_c *= factor;
x_c += 0.5 * w;
y_c += 0.5 * h;
fcolor_t c;
if (x_c >= 0 && x_c < w - 1 && y_c >= 0 && y_c < h - 1) {
/*在给定图像中,使用线性插值计算点的颜色( x,y )*/
c = pixel_lerp(img, x_c, y_c);
} else {
c = fcolor_new(0.0, 0.0, 0.0);
}
img_set_pixel(img_out, x, y,
iround(c.r), iround(c.g), iround(c.b));
}
}
WriteJPEG(img_out, (char *) out.c_str());
img_free(img);
img_free(img_out);
}
从这里可以看出畸变中心就取图像的中心
最后如果要pmvs得到稠密点云,还要修改Bundle2PMVS中的sh脚本为bat批文件
运行pmvs后:
由于只有两个图,空缺比较多