【问题标题】:How to detect an ellipse in a wheel with OpenCV如何使用 OpenCV 检测车轮中的椭圆
【发布时间】:2019-11-29 15:59:39
【问题描述】:

我有一个车轮的图像,我想用 OpenCV 检测映射到这个车轮(或车轮的内圆)的椭圆(用于车辆/车轮的姿态估计)。

[![在此处输入图片描述][1]][1]

有人知道怎么做吗?

[![在此处输入图片描述][2]][2]

生成的图像应该看起来像这样(或者有点像这样 - 我需要检索一些通过省略号的点)。请注意,结果应该是椭圆,而不是圆形,因为如果从侧面看,轮子可能会透视/变形。

到目前为止,我尝试了 Contour(并识别最大的轮廓区域)、canny 和颜色阈值,我能够在我的大多数测试图像上识别出车轮的内椭圆(成功!)。这个“内椭圆”是最大轮廓的一部分,但它也包含我不需要的其他点。

看图: [![在此处输入图片描述][3]][3]

最后一个问题是,如何推导出这个内圆/椭圆的几个点(并去除其他垃圾)以便我可以计算椭圆参数?

任何帮助将不胜感激。

非常感谢!

编辑:

到目前为止,这是我的代码:


import sys
import numpy as np
import skimage.io
import skimage.filters
import matplotlib.pyplot as plt
import cv2

from skimage import data, color, img_as_ubyte
from skimage.feature import canny
from skimage.transform import hough_ellipse
from skimage.draw import ellipse_perimeter

# get filename and sigma value from command line
filename0 = 'back_wheel.png'
filename1 = "backwheel1.png"
filename2 = "backwheel2.png"
filename3 = "backwheel3.png"
filename4 = "frontwheel1.png"
filename5 = "frontwheel2.png"

def getWheel0(filename):

    image_rgb_orig = cv2.imread(filename)
    image_rgb = image_rgb_orig.copy()

    print('Original Dimensions : ',image_rgb.shape)

    width = 350
    height = (int)(width * image_rgb.shape[0]/image_rgb.shape[1])
    dim = (width, height)


    image_rgb = cv2.resize(image_rgb, dim, interpolation=cv2.INTER_AREA)

    image_gray = cv2.cvtColor(image_rgb, cv2.COLOR_BGR2GRAY)

    equ = cv2.equalizeHist(image_gray)
    #edges = cv2.Canny(image_gray, 150, 200)

    norm_image = cv2.normalize(equ, None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)

    #--- First obtain the threshold using the greyscale image ---
    ret,th = cv2.threshold(norm_image, 50, 100, cv2.THRESH_TOZERO_INV)

    #--- Find all the contours in the binary image ---
    contours,hierarchy = cv2.findContours(th,2,1)
    #contours, hierarchy = cv2.findContours(th, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_L1)
    cnt = contours
    big_contour = []
    max = 0
    for i in cnt:
      area = cv2.contourArea(i) #--- find the contour having biggest area ---
      if(area > max):
        max = area
        big_contour = i 

    result = cv2.drawContours(image_rgb, big_contour, -1, (0,255,0), 3)

    fig2, (ax1, ax2, ax3) = plt.subplots(ncols=3, nrows=1, figsize=(8, 4), sharex=True,
                                    sharey=True)

    ax1.set_title('Original picture')
    ax1.imshow(image_rgb_orig)

    ax2.set_title('Threshhold')
    ax2.imshow(th)

    ax3.set_title('Contour')
    ax3.imshow(result)

    plt.show()

getWheel0(filename0)
getWheel0(filename1)
getWheel0(filename2)
getWheel0(filename3)
getWheel0(filename4)
getWheel0(filename5)


运行它 “蟒蛇轮胎.py”

【问题讨论】:

  • 你指的是哪个椭圆?黄色的打扰了?
  • 我想知道穿过轮胎的椭圆。它大多接近圆形,但从侧面看,它会是一个椭圆。我之所以想知道穿过车轮的椭圆,是因为从这个椭圆中,我可以估计出车辆的姿态。
  • 所以基本上是轮胎的内部部分?
  • 是的。轮胎的内部就是它。
  • 我会尝试基于 RANSAC 的方法。

标签: opencv


【解决方案1】:

在图像上定位圆的问题是众所周知的并且已经解决了。

使用霍夫圆变换。 这是 OpenCV 库的基本功能:docs

广义霍夫变换可用于检测椭圆。但是您需要自己编写代码,因为this question 的答案中提供了一些合理的想法。在检测线 (2) 或圆 (3) 的情况下,您需要具有更多维度 (5) 的累加器,但这应该不是问题。

看起来 canny 也为您的图像提供了良好的边缘。您可以尝试以下操作:

  1. 对于连接的轮廓(超过某个最小长度),找到最远的点对(大轴)和与大轴正交的最接近的点对。
  2. 连接点对给出椭圆轴(椭圆中心位于交叉点)。计算椭圆参数。
  3. 检查其他轮廓的点是否与计算出的椭圆相匹配(允许一些小的偏移)。如果是,contours 是椭圆,否则不是。

这两种解决方案都可能不适用于具有不对称轴的椭圆和类椭圆轮廓。

【讨论】:

  • 霍夫圆变换仅适用于圆。我需要同样的省略号。
  • 这是我的小姐。你的一些测试图像看起来像圆圈,这就是欺骗我的原因。
  • 您好,我编辑了我的问题。识别内椭圆似乎没问题,现在我需要从最大轮廓中分离出好的点来识别椭圆的一些点。也许你有一个想法。非常感谢!
  • 您可以执行以下操作:将轮廓点拆分为上半部分和下半部分 -> 对于每个点对(一个顶部,一个底部),它们之间的距离的一半是可能的半径,投票给它(你可以只考虑外轮廓点并省略关闭点以降低计算成本)->您可能需要最常投票的半径,如果几个接近的半径值具有接近的分数,则取平均值 -> 半径 * 2 值应该接近轮廓的边界框高度。您可以对左右轮廓的一半执行相同的操作,以找到另一个轴。
  • 当然投票方案可以更复杂,例如RANSAC 喜欢在 cmets 中针对您的问题提出建议。
【解决方案2】:

感谢大家的帖子。这些对于接近答案非常有帮助。我最终做了以下事情:

灰度 标准化 查找轮廓

然后在轮廓上,我做cornerHarris,它返回一个图像大小的Mat,轮廓的每个像素都有一个角值。

我将cornerHarries Mat 的值标准化为 0 到 255 之间的值。 0 是直线(没有拐角),然后我将每个值设置为低于 2(直线)和任何高于 20 到 255 的值,这样只有“软曲线”保留在垫子中。

在这一步之后,我循环遍历 Mat 并删除所有 =255 或距离 255 点很近的值。

结果是(至少对于这个测试图像而言)只剩下一部分椭圆点,这些足以让 findEllipse 返回正确的椭圆。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-01
    • 2012-06-14
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 2014-07-27
    • 2020-06-16
    相关资源
    最近更新 更多