【问题标题】:OpenCV: Contours hidden behind mask. How to detect when a contour is about to move near mask edge?OpenCV:隐藏在面具后面的轮廓。如何检测轮廓何时将在掩模边缘附近移动?
【发布时间】:2019-10-29 11:42:52
【问题描述】:

问题总结

我正在检测光源前的物体轮廓。为了简化背景并消除噪音,我需要遮盖所有不是光源的东西。如何判断对象何时位于遮罩区域的边缘?

假设

假设无特征(用于边缘检测的单色黑白)和模棱两可的形状(图像 1 中的正方形可能是图像 2 中的圆形)。

“高质量”图问题的详细解释

考虑光源前的剪影。它是不同的,我们可以看出它嵌套在外轮廓内。图 1 描述了一个简化的案例。

在这种情况下,我们可以将外圈视为蒙版,并轻松忽略不在轮廓内的所有内容。图 2 描述了带有一些边缘检测的简化情况。

在剪影移到光源边缘之前,一切都很可爱。突然间,我们遇到了问题。图 3 是边缘形状的示例。

轮廓与背景/蒙版区域的黑色无法区分。 OpenCV 要么假设我们的光源的轮廓突然变成了奇怪的形状,并且没有其他物体可以被检测到。

问题重述

我可以使用哪些工具来检测边缘形状是否存在某种中断?有没有一种好的/计算成本低廉的方法来确定我们的轮廓是否与另一个相交?

我所知行不通的墓地

  • 假设是静态或简单的轮廓形状。这些数字是代表一个更复杂的实际问题的漫画。
  • 假设一个完美的圆形光源。 HoughCircles 不起作用。

【问题讨论】:

    标签: python opencv geometry computer-vision edges


    【解决方案1】:

    您可以使用cv2.log_polar 函数来展开圆形/椭圆形。

    之后,np.argmax 可用于查找曲线。尝试使用 Scipy 的signal.savgol_filter() 平滑曲线。当物体遮挡光源时,平滑线和argmax数据会有很大的不同:

    这是我使用的代码:

    import numpy as np
    import cv2
    # Read the image
    img = cv2.imread('/home/stephen/Desktop/JkgJw.png', 0)
    # Find the log_polar image
    log_polar = cv2.logPolar(img, (img.shape[0]/2, img.shape[1]/2), 40, cv2.WARP_FILL_OUTLIERS)
    # Create a background to draw on
    bg = np.zeros_like(log_polar)
    # Iterate through each row in the image and get the points on the edge
    h,w = img.shape
    points = []
    for col in range(h-1):
        col_slice = log_polar[col:col+1, :]
        curve = np.argmax(255-col_slice)
        cv2.circle(bg, (curve, col), 0, 255, 1)
        points.append((curve, col))
    
    cv2.imshow('log_polar', log_polar)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    
    import scipy
    from scipy import signal
    
    x,y = zip(*points)
    x_smooth = signal.savgol_filter(x,123,2)
    
    import matplotlib.pyplot as plt
    plt.plot(x)
    plt.plot(x_smooth)
    plt.show()
    

    【讨论】:

    • 这是一个有用的答案,因为它提出了一个我不知道的 CV2 函数,尽管我在实现比简单模型更复杂的“真实”问题时遇到了麻烦操作问题。我目前正在玩它。您是如何在 logPolar 函数中得出 40 的量级的?
    • @WesH 您应该查看 OpenCV 示例(运行 demo.py)。这就是我了解cv2.logPolar 的地方。我使用了与样本logPolar.py 相同的magnitude 值。
    • 看起来秘诀在于图像需要接近正方形。添加一行:img = img[0:img.shape[0], int((img.shape[1]-img.shape[0])/2):int(img.shape[1]-((img.shape[1]-img.shape[0])/2))] 有很大帮助。
    猜你喜欢
    • 2015-09-26
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 2021-09-07
    相关资源
    最近更新 更多