我发现了如何绘制线性透镜,从一个destination坐标到另一个source坐标。
您如何计算从中心到鱼眼到直线的径向距离?
1)。我实际上很难扭转它,并将源坐标映射到目标坐标。按照我发布的转换函数的样式,代码的反函数是什么?
2)。我还看到我的失真在某些镜头上不完美-大概不是严格线性的。这些镜头的等效源坐标和源坐标是什么?同样,请提供更多的代码,而不仅仅是数学公式...
最初陈述的问题:
我有一些要点描述用鱼眼镜头拍摄的照片中的位置。
我想将这些点转换为直线坐标。我想使图像不失真。
我已经找到了关于如何产生鱼眼效果的描述,但没有找到如何扭转它的描述。
还有一篇博客文章,描述了如何使用工具来完成该任务。
输出:校正后的图像(从技术上讲,也可以进行透视校正,但这是一个单独的步骤)。
您如何计算从中心到鱼眼到直线的径向距离?
我的函数存根看起来像这样:
Point correct_fisheye(const Point& p,const Size& img) {
// to polar
const Point centre = {img.width/2,img.height/2};
const Point rel = {p.x-centre.x,p.y-centre.y};
const double theta = atan2(rel.y,rel.x);
double R = sqrt((rel.x*rel.x)+(rel.y*rel.y));
// fisheye undistortion in here please
//... change R ...
// back to rectangular
const Point ret = Point(centre.x+R*cos(theta),centre.y+R*sin(theta));
fprintf(stderr,"(%d,%d) in (%d,%d) = %f,%f = (%d,%d)\n",p.x,p.y,img.width,img.height,theta,R,ret.x,ret.y);
return ret;
}
另外,我可以在找到点之前以某种方式将图像从鱼眼转换为直线,但是我完全被OpenCV文档所迷惑。在OpenCV中是否有一种简单的方法可以做到这一点,并且它的性能足以将其用于实时视频供稿?