|
本帖最后由 sonwendi 于 2011-11-7 19:55 编辑
貌似还没有人发过这方面的帖子,不过我们之前用过这个技术,我也研究了一小下,公开一下吧:
我们都知道,镜头焦距越长可以看得视野越窄,但是图像越接近真实的;焦距越短,看的范围越大,但是失真越严重。
一般的,像我们比赛的话就只用考虑两种失真就够了:一是桶形失真;一个是梯形失真。
梯形失真我们都很熟悉,对于矩阵变换的公式也有很多,就不提了。
但是对于桶形失真这个不好解决,因为在摄像头的边缘位置图像被压缩得很厉害,造成看到的图像就不能按照梯形失真那一套来解决。
所以,在进行梯形变换之前要先进行桶形失真的矫正。
先看下效果(焦距1.8mm):
源图像:
校正后的图像:
另外一个(焦距2.1):
(第一幅图是完整的展开对应起来,第二幅图只要了原图的一部分,因为四个角的图像压缩太厉害,不好用)
这个原理并不难,像我们大学物理里面做的实验--牛顿环。
你可以认为两幅图片是经过一个函数建立起来的对应关系,而且校正以后的图上多个点可以对应原图上的一个点,所以会有校正后畸形的情况,但是这对于计算的误差很小,几乎可以忽略,所以可以认为误差是可以容忍的。
具体的原理因为有点烦,画图不好画,我就直接引用一篇论文,我也是看着这一篇和以前师兄留下的代码才做出来的:
矫正一块的matlab代码如下:
-
- for l1 = 1:(img_size(1)+cy*2) % 垂直方向
-
- y = l1 - img_size(1)/2-cy;
-
- for l2 = 1:(img_size(2)+cx*2) % 水平方向
-
- x = l2 - img_size(2)/2-cx;
-
- x1 = round( x * ( 1 + k1 * x * x + k1 * y * y ) );
- x1_err = x * ( 1 + k1 * x * x + k1 * y * y ) - x1;
- y1 = round( y * ( 1 + k2 * x * x + k2 * y * y ) );
- y1_err = y * ( 1 + k2 * x * x + k2 * y * y ) - y1;
- err = x1_err * x1_err + y1_err * y1_err;
- y1 = y1 + img_size(1)/2;
- x1 = x1 + img_size(2)/2;
-
-
- if y1>0 && y1<(img_size(1)+1) && x1>0 && x1<(img_size(2)+1)
- yy(y1,x1) = l1;
- xx(y1,x1) = l2;
- error(l1,l1) = err;
- counter(y1,x1)=counter(y1,x1)+1;
- img_undist(l1,l2) = img_origin(y1, x1);
- end
- end
- end
复制代码
可以这样理解:点是通过函数对应,那么久一点一点的解算出校正以后的点在原图上的位置,搬运过来。
函数对应关系:
这样子,可以把图像校正以后做结算,用标定的方法算出黑线的真实距离,用真实的斜率来控制。
标定的完整matlab代码:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
评分
-
3
查看全部评分
-
|