摄像机标定和图像径向畸变校正
2010-03-16 12:25 libiver 阅读(813) 评论(0) 编辑 收藏 举报声明:欢迎任何人和组织转载本blog中文章,但必须标记文章原始链接和作者信息。
本文链接:http://blog.csdn.net/li_007/archive/2010/03/16/5384937.aspx
开拓进取的小乌龟------->CSDN点滴点点滴滴Blog
这段时间断断续续在弄这个摄像头的标定和图像畸形矫正的问题,基本差不多了,乘休息时间,发点成果和大家分享吧!
一、标定
关于摄像头的标定,说实话网上的资料太多了,方法也很多的。个人觉得想要研究这个的话,可以先了解基本原理,然后看opencv的例子calibration。如果你还了解的更深入的话,建议下载一些论文看看。
当然我推荐一个网址:http://www.ti-times.com/dfiles.asp?fl=download(深圳科创时代)我也是在查找资料的过程中发现的,觉得它上面为我们总结了很多有用的资料。
在这里说明一点。opencv的calibration是基于张正友标定法的,我们在标定的过程中要避免两次标定板的角度倾斜相差过小,这样会产生很大的误差(当然我们可以结合一些论文上的方法的来改进算法)。
上一张截图 : http://hi.csdn.net/space-9784-do-album-picid-497526-goto-down.html(CSDN的blog上传图片功能被和谐了)
二、畸形矫正
其实在opencv的calibration这个例子中完成了畸形矫正。但是我在我的工程中,由于一些条件的限制,在没有做矫正的情况下,2.8的镜头刚好照满整个触摸区域,但是经过矫正后,由于主要是径向畸变,可是opencv是校正前后图像一样大小的做法,必然导致有一部分校正后的图像被裁剪了。没办法,我只好自己去按原理写最基本的校正算法了。现在贴一些基本算法原理出来。
图片 : http://hi.csdn.net/space-9784-do-album-picid-497527-goto-down.html
具体代码如下:(TMD,插代码的也被和谐了,么烂CSDN,准备转移blog了)
//#pragma parallel omp for
for (int i = 0; i < realWidth; i ++)
{
//#pragma parallel omp for
for (int j = 0; j < realHeight; j ++)
{
// 图像物理坐标系中点在图像像素坐标系中的对应点u、v
double u = i - 65;
double v = j - 25;
// 根据图像在图像物理和图像像素坐标系中点的关系来计算图像物理坐标系中的点
//
// u = x / dx + u0 fx = 1 / dx
// v = y / dy + v0 fy = 1 / dy
double x = (u - u0) / fx;
double y = (v - v0) / fy;
double r2 = pow(x, 2) + pow(y, 2);
double r4 = pow(r2, 2);
double fr = 1 + k1 * r2 + k2 * r4 + k3 * r2 * r4;
double ud = (u - u0) * fr + u0;
double vd = (v - v0) * fr + v0;
int u0 = int(ud);
int v0 = int(vd);
int u1 = int(1 + ud);
int v1 = int(1 + vd);
if (ud > 0 && ud < 640 && vd > 0 && vd < 480)
{
fcImagePlus->image.pData[i + j * realWidth] = pixelInterpolation(tmpImage[0].image.pData,
ud, vd, u0, v0, u1, v1);
}
}
}
结果贴图:
http://hi.csdn.net/space-9784-do-album-picid-497528-goto-down.html
http://hi.csdn.net/space-9784-do-album-picid-497525-goto-down.html