opencv - 如何在不使用 opencv 中的 fitEllipse() 的情况下检测图像中的椭圆?

标签 opencv image-processing computer-vision

我正在尝试使用 C++ 在 OpenCV 中检测椭圆核。我尝试获取 Canny 边,然后在边上使用 fitEllipse() 函数。虽然这会找到椭圆,但当图像有噪声或有很多边缘时,准确性会很差。

我已经意识到要走的路是检测椭圆,而不是拟合它们。也许像霍夫圆圈,但对于椭圆?我也不知道椭圆的长度,因为它因图像而异。

有人可以帮助我开始吗?所有相关的答案都非常模糊,我只想知道从哪里开始。

Fitted Ellipses on Canny Edges

最佳答案

正如您已经得到的,您不需要椭圆拟合,而是椭圆检测

您可以在 my other answer 中找到两篇带有 C++ 代码的论文。为了完整性,我将在这里报告:

  1. L. Libuda, I. Grothues, K.-F. Kraiss, Ellipse detection in digital image data using geometric features, in: J. Braz, A. Ranchordas, H. Arajo, J. Jorge (Eds.), Advances in Computer Graphics and Computer Vision, volume 4 of Communications in Computer and Information Science, Springer Berlin Heidelberg, 2007, pp. 229-239. link, code

  2. M. Fornaciari, A. Prati, R. Cucchiara, "A fast and effective ellipse detector for embedded vision applications", Pattern Recognition, 2014 link, code

移植到 OpenCV 也相当容易 this matlab script随着两篇论文的实现:

  • “一种新的高效椭圆检测方法”(谢永红,季强/2002)
  • “用于带结果聚类的椭圆检测的随机霍夫变换”(CA Basca、M Talos、R Brad/2005)

另一个非常有趣的算法是:

  • Dilip K. Prasad、Maylor K.H. Leung 和 Siu-Yeung Cho,“基于边缘曲率和凸性的椭圆检测方法”,Pattern Recognition,2012。

可以找到Matlab代码here


直接应用霍夫变换对于椭圆是不可行的,因为您将在 5 维参数空间中工作。这将非常缓慢,而且不准确。于是提出了很多算法。在此处提到的那些中:

  • Xie 和 Ji 的方法非常有名而且非常简单(但仍然很慢)
  • 巴斯卡等人。方法更快,但可能不准确
  • 普拉萨德等人。方法快速且非常准确。
  • Libuda 等人。方法非常快速和准确
  • Fornaciari 等人。方法是最快的,但在特定情况下可能不准确。

关于椭圆检测的最新引用书目,您可以引用this页面。

关于opencv - 如何在不使用 opencv 中的 fitEllipse() 的情况下检测图像中的椭圆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35648514/

相关文章:

image-processing - 在 Mathematica 中重建图像

python - 如何使用 python 调整图像大小和形状?

opencv - 在深度图上找到曲率

python-3.x - 从单个图像生成图像数据集

linux - 显着性模型 - BMS(设置错误)

c++ - Mat.Depth() Opencv

python - 如何使用大于 2 GB 的 OpenCV 编写 avi 文件?

python - 使用边框从图像裁剪脸部

python - 如何提取 skimage 骨架信息到 python 中的 NetworkX 节点和边以进行进一步的高级分析

java - 如何使用 OpenCV 检测文本