【发布时间】:2014-04-04 23:29:04
【问题描述】:
我想检测图像中的椭圆。由于当时正在学习Mathematica,所以问了一个问题here,从下面的答案中得到了满意的结果,使用的是RANSAC算法检测椭圆。
但是,最近我需要将它移植到 OpenCV,但是有一些功能只存在于 Mathematica 中。其中一个关键功能是“GradientOrientationFilter”功能。
由于一般椭圆有五个参数,因此我需要采样五个点来确定一个。然而,越多的采样点表明获得良好猜测的机会越低,这导致椭圆检测的成功率越低。因此,来自 Mathematica 的答案添加了另一个条件,即图像的梯度必须平行于椭圆方程的梯度。无论如何,我们只需要三个点就可以使用 Mathematica 方法中的最小二乘法确定一个椭圆。结果还不错。
但是,当我尝试在 OpenCV 中使用 Sobel 或 Scharr 算子来寻找图像梯度时,它还不够好,这总是导致结果不好。
如何准确计算图像的梯度或切线?谢谢!
带有渐变的结果,三个点
没有梯度的结果,五分
---------更新----------
我事先做了一些边缘检测和中值模糊,然后在边缘图像上绘制结果。我原来的测试图是这样的:
一般来说,我的最终目标是检测场景中或物体上的椭圆。像这样的:
这就是我选择使用 RANSAC 从边缘点拟合椭圆的原因。
【问题讨论】:
-
"由于一般椭圆有五个参数,所以我需要采样五个点来确定一个。" > 我有兴趣对此进行详细解释,因为对我来说 3 个 二维 点足以估计 5 个 标量 参数。关于你的问题,你能在你的问题中包含你用来估计梯度的代码吗?
-
我的想法是一般椭圆是 ax^2+by^2+cxy+dx+ey+1=0。所以如果我想解这个方程,我需要有五个点,(x1,y1)~(x5,y5)。将它们代入椭圆方程的(x,y),我可以解出五个变量的联立方程。这就是为什么我说我需要抽样五个点来确定一个。
-
代码sn-p是here
-
考虑到更新后的图像,使用广义霍夫变换。