【发布时间】:2011-01-29 11:37:35
【问题描述】:
赏金状态更新:
I discovered how to map a linear lens,从destination 坐标到source 坐标。
如何计算从中心到从鱼眼到直线的径向距离?
1). 我实际上很难将其反转,并将源坐标映射到目标坐标。在我发布的转换函数样式的代码中,相反的是什么?
2). 我还发现我的不失真在某些镜头上并不完美——大概是那些不是严格线性的镜头。这些镜头的等效往返源和目的地坐标是多少?再次,请提供比数学公式更多的代码...
问题如前所述:
我有一些点可以描述用鱼眼镜头拍摄的照片中的位置。
我想将这些点转换为直线坐标。我想不扭曲图像。
我找到了this description 如何生成鱼眼效果,但没有找到如何反转它。
还有一个blog post 描述了如何使用工具来做到这一点;这些图片来自于:
(1) : SOURCE Original photo link
输入:需要修复鱼眼失真的原始图像。
(2) : DESTINATION Original photo link
输出:校正后的图像(技术上也带有透视校正,但这是一个单独的步骤)。
如何计算从中心到从鱼眼到直线的径向距离?
我的函数存根如下所示:
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 documentation 弄糊涂了。在 OpenCV 中是否有一种直接的方法可以做到这一点,并且它的性能是否足以在实时视频源中做到这一点?
【问题讨论】:
-
我不太明白你在找什么。鱼眼从球体映射到图片平面。反向映射将从图片回到球体,对吗?你在找什么直线坐标?
-
@mtrw 我的源图像是鱼眼扭曲的,我想不扭曲它
-
那么photo.net/learn/fisheye上的图片是你要找的吗?
-
是的,正确的图片例如通过 OpenCV,或用于校正图片中任何点的公式。
-
威尔,你有没有得到一个确凿的答案?我很想看看你最终得到的任何代码。
标签: math graphics geometry projection