我正在尝试使用 C++ 在 OpenCV 中检测椭圆核。我尝试获取 Canny 边,然后在边上使用 fitEllipse() 函数。虽然这会找到椭圆,但当图像有噪声或有很多边缘时,准确性会很差。
我已经意识到要走的路是检测椭圆,而不是拟合它们。也许像霍夫圆圈,但对于椭圆?我也不知道椭圆的长度,因为它因图像而异。
有人可以帮助我开始吗?所有相关的答案都非常模糊,我只想知道从哪里开始。
最佳答案
正如您已经得到的,您不需要椭圆拟合,而是椭圆检测。
您可以在 my other answer 中找到两篇带有 C++ 代码的论文。为了完整性,我将在这里报告:
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
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/