赏金状态更新:
我发现了如何映射线性透镜,从destination
坐标到source
坐标。
你如何计算从中心到从鱼眼到直线的径向距离?
1)。我实际上很难扭转它,并将源坐标映射到目标坐标。在我发布的转换函数样式的代码中,相反的是什么?
2)。我还发现我的不失真在某些镜头上并不完美——大概是那些不是严格线性的镜头。这些镜头的等效往返源和目的地坐标是多少?再次,请提供比数学公式更多的代码...
原问题:
我有一些点可以描述用鱼眼镜头拍摄的照片中的位置。
我想将这些点转换为直线坐标。我想不扭曲图像。
我找到了如何生成鱼眼效果的描述,但没有找到如何反转它。
还有一篇博客文章描述了如何使用工具来做到这一点;这些图片来自:
(1) :SOURCE
原始照片链接
Input :修复鱼眼失真的原始图像。
(2):DESTINATION
原始照片链接
输出:校正后的图像(技术上也带有透视校正,但这是一个单独的步骤)。
你如何计算从中心到从鱼眼到直线的径向距离?
我的函数存根如下所示:
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 中是否有一种简单的方法可以做到这一点,并且它的性能是否足以将它用于实时视频源?