从两幅图像的取得相机畸变系数

现在利用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后:


由于只有两个图,空缺比较多

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值