以编程方式校正鱼眼失真

我发现了如何绘制线性透镜,从一个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中是否有一种简单的方法可以做到这一点,并且它的性能足以将其用于实时视频供稿?


翻阅古今
浏览 650回答 3
3回答
打开App,查看更多内容
随时随地看视频慕课网APP