如何使用椭圆计算透视变换
Posted
技术标签:
【中文标题】如何使用椭圆计算透视变换【英文标题】:How to calculate perspective transformation using ellipse 【发布时间】:2013-02-26 05:37:22 【问题描述】:我对 3D 图像处理非常陌生。我正在我的项目中寻找圆的透视角度。 一个有一组白色圆圈的盘子,使用这些圆圈我想找到那个盘子的旋转角度(3D)。
为此,我已经完成了相机校准部分并获得了相机误差参数。下一步我已经捕获了图像并应用了 sobel 边缘检测。
在那之后我对椭圆拟合算法有点困惑。我在椭圆拟合中看到了很多算法。哪个是最好的方法和快速的方法?
完成椭圆拟合后,我不知道如何进一步进行?如何使用该椭圆计算旋转和平移矩阵?
你能告诉我哪种算法更适合和简单吗?我需要一些 matlab 代码来理解概念。
提前致谢
对不起我的英语。
【问题讨论】:
你的情况很简单:找到所有的圆([L,N]=bwlabel(image)
),然后遍历每一个圆(level
)并计算它的重心([X,Y] = meshgrid(1:size(image,1), 1:size(image,2)); idx = find(L == level); N = size(idx,2); Xc = sum(X(idx)) / N; Yc = sum(Y(idx)) / N;
)。现在您可以通过较少平方的方法将结果与标准具进行比较以找到变换参数。如果你懂俄语或使用在线翻译,你可以阅读我关于矩阵坐标变换的一些想法here。
还有更多:如果你想找到所有的欧拉角,你应该至少使用 2 个相机。在这种情况下,您应该找到所有椭圆的边缘(与二进制图像及其膨胀的差异,之后 - bwlabel
),每个椭圆的近似参数(我建议阅读this article),然后通过矩阵运算计算欧拉角(这将比 2D 更复杂)。
谢谢 Eddy...但是我需要使用单个相机图像(2D)并参考另一张图像(2D)找到所有欧拉角。你能建议哪一个是椭圆拟合的最佳和快速算法...我不会俄语,也不能翻译成我自己的语言。这对我可能没用。
阅读我第二条消息中的文章。它给出了一个很好的椭圆近似值,并用英文写成。为了以良好的精度找到欧拉角,我建议您首先制作模型:扫描原始图像,进行从某个点看到的变换,计算所有椭圆(中心+半轴)的属性,然后尝试计算欧拉角。我认为,逆模型(通过给定的相机位置计算椭圆的属性)将帮助您开发直接算法。
【参考方案1】:
首先,找到椭圆/圆心(例如,在描述的其他 cmets 中作为 Eddy_Em)。
然后你可以参考张的经典论文 https://research.microsoft.com/en-us/um/people/zhang/calib/ 如果某些相机参数已知,它允许您从单个图像估计相机姿势,例如投影中心。请注意,该方法无法用于正面记录,即透视效果越多,您的估计就越准确。该算法相当简单,您需要一个 SVD 和一些叉积。
【讨论】:
以上是关于如何使用椭圆计算透视变换的主要内容,如果未能解决你的问题,请参考以下文章