analysis

新的程序写完了,调试了半天,几乎还是老样,除了不再随机出现不好的F

现在所有的参数只需要在一个配置文件里设置就行

开始的normalization贼慢,怀疑是in memory database实现有问题,或者copy transform的效率太差

模拟数据的效果还是完美

真实数据总是差很多

准确的说也就是medical的数据差很多

这些又都是什么原因呢?

voodoo其实开始也很差,效果跟我的差不多,后来一bundle adjustment就好很多

估计到最后也得做bundle adjustment

不过现在得先把目前的问题搞清楚

tracking的结果其实还可以

但是3D到后面的reprojection就对不上了

得把reprojection全部输出,仔细查看一下

以及inliers的points,看看哪些点到后面就成了outliers

还有三维显示的贴图,控制当前view的每一个三维点

每一个image point,对应的reprojection error

每一个inlier image point,对应的reprojection error

每一个3d point,对应的inlier image points, frameId

计算过程中使用的inliers应该都保留到输出结果之中

 

calibration

感觉上sfm都得假定camera已经是calibrated好的,或者起码得用一个假定的

当然,理论上来说可以先直接做uncalibrated的情况,但是极度怀疑这种方法的scalability

前面几帧reprojection error还很小,一到后面就不行了

主要问题是参数太多。calibrated的情况只有5个参数。而uncalibrated需要11个参数。

另外,从经验上来看,即使是一个不准确的calibration也比uncalibrated的效果要好得多

怀疑marc同学的方法只适用于几张图片。

其实到最后还是要做self-calibration

错误的calibration与正确的calibration最后效果会差多少?

感觉voodoo就是直接假定一个calibration

不然相机的orientation都怎么算出来的

准备把程序再改改了,之前太灵活,太general了,其实没必要,导致不必要的复杂

目前先就假定calibrated

hide

面向对象的设计原则之一是信息隐藏

让用户知道的信息越少越好

但是,重要的中间状态信息也被隐藏了

于是出现问题的话,就得去猜测原因是什么

或者,即使出现问题也不知道

如果一个电视机坏掉了,就得把电视机给拆开

如果一个系统出了问题,怎么办呢?

那就得不断重现出现问题的环境,运行程序,调试,或者log

总之呢,出现问题和解决问题被完全分离了

是否应该在接口层面就提供一个衡量返回结果是否好坏的指标呢?或者中间重要的状态信息?

很多时候没有简单的fail或者success

而是介于两者之间

可以用一个confidence?

怎么定义confidence呢?

pov-ray depth map

这方面的例子很少

可以搜到一个,http://runevision.com/graphics/stereo/depthmap/

但是感觉讲解不详细

今天试了一下最简单的一个例子才基本彻底搞明白

camera {

  location <0, 0, -2>

  look_at <0, 0, 0>

}


union {

  plane { z, -0.25} //define a plane z = -0.25

  texture {

    pigment {

      gradient -z

    }

    //scale 2

    finish {ambient 1 diffuse 0}

  }

}

最关键的一行就是gradient -z

就是说呢,一个pixel对应的点的-z值,就是这个pixel的color,如果-z = 1,那么color = 255,如果-z > 1,那么color就等于-z的小数位。所以呢,就会很容易看到黑白的bands。解决黑白bands的方法就是后面一行scale,scale 2是什么意思呢?就相当于把坐标轴变为原来的两倍。反过来说,就是把color值改为原来一半,就是color *= 1/2。

直接运行这个程序,得到一个灰色图像,每个pixel color = 63 = 0.25 * 255。

如果scale 2呢,颜色就变暗一半。

那么camera的参数有没有关系呢?答案是没有。当然啦,如果camera看不到任何物体,结果也就会漆黑一片。

opencv gauss newton

non-linear least squares problem

equation: x_i = f(P, d_i)

d_i is the input data, x_i is the target value, f is the function

write in matrix form:

X = f(P), where X = [x_0, x_1, …,]’ is a column vector, suppose x_i is a scalar value

start with P_0, suppose P_1 = P_0 + delta, delta is a column vector

f(P_0 + delta) = f(P_0) + J * delta.

where J is the jacobian matrix, J(i, j) = d(f_i) / d(p_j), where p_j is the j-th parameter of P

we want

f(P_0 + delta) = f(P_0) + J * delta = X

so

J * delta = X – f(P_0) = e

To solve this equation, we solve

(J’ * J) * delta = J’ * e

So delta = inv(J ‘ * J) * J’ * e

In opencv, first do SVD of J’ * J

V * W * V’ = J’ * J

and e’ = J’ * e

then solve delta for V * W * V’ * delta = e’

delta = V * inv(W) * V’ * e’; 

this is directly computed with cvSVBkSb

In opencv function cvFindExtrinsicCameraParams2, the program is like:

cvMulTransposed( _J, &_JtJ, 1 ); //_JtJ = J’ * J

cvGEMM( _J, _mn, 1, 0, 0, &_JtErr, CV_GEMM_A_T ); //_mn is e, _JtErr = J’ * e

cvSVD( &_JtJ, &_JtJW, 0, &_JtJV, CV_SVD_MODIFY_A + CV_SVD_V_T ); //SVD of J’ * J

if( JtJW[5]/JtJW[0] < 1e-12 ) break; //stop iteration if the ratio between least singular value and max one is too small

cvSVBkSb( &_JtJW, &_JtJV, &_JtJV, &_JtErr, &_delta, CV_SVD_U_T + CV_SVD_V_T ); //solve delta

cvAdd( &_delta, &_param, &_param ); //P_1 = P_0 + delta

n1 = cvNorm( &_delta ); n2 = cvNorm( &_param ); if( n1/n2 < 1e-10 ) break; //stop if the increment ratio is too small

============

The core problem is to define the function and then compute the jacobian matrix

 

美国军方的机器人技术

http://news.cnet.com/2300-1008_3-6246291-1.html

不知道中国会有多大差距

里面的机器人基本上都是由专门的公司制作的,比如前几个,都是iRobot公司制作的。上次还听过iRobot公司的宣讲。

虽然很想进这些幕后的机器人公司,但是这些公司基本都只收公民。

国内好像没听说有专门的机器人公司。

 

camera calibration

发觉各种问题的核心都是camera calibration

只要camera calibration做的好,剩下的就比较简单

核心问题:给定两个2D view的correspondences,怎么算?标准方法是先算F。如果有K,那么算R, t都很简单。不过呢,问题是,F有可能有问题,或者,K有问题,得到的E不好,也就是两个singular value不一样,如果差5%以上就有严重问题了。另外一种方法是,假定已经有K,每次直接算E(先算F),用E做ransac。这样的话应该好一些。如果没有K的话,就得做self-calibration。

给定三个1Dview。怎么算。先算tensor,然后算e,然后算r,算t,然后triangulate。

给定三维点,和image points。怎么算?

给定一个view,怎么算?

如果有lens distortion。怎么解决?

如果是多个view,怎么解决?现在3d reconstruction。得到point cloud跟初始的两个cameras。后面的就不断的refine了。如果view degenerate怎么办?这个得先自动detect dominant plane homography。