【问题标题】:Recognizing crosswalk on aerial images在航拍图像上识别人行横道
【发布时间】:2014-02-04 16:57:14
【问题描述】:

我正在尝试在航拍图像上找到人行横道的 x/y 坐标。

例如在这张图片上:

...我想在两条黄色人行横道的中心提取两个节点。

我开始在 Python 上使用 OpenCV。我尝试的第一种方法是隔离图像中的黄色部分。但结果并不完美。

由于人行横道的图案非常独特,我认为应该有一种方法可以非常可靠地检测人行横道的存在和坐标。由于我在图像处理方面没有太多经验,您能否通过一个小例子给我一些正确方向的指示?也许我应该使用 FFT,或者创建一个分类器?

这是我用于上面截图的代码。

# -*- coding: utf-8 -*-
import cv2
import numpy as np

def nothing(x):
    pass

# Create a window
cv2.namedWindow('image')

# Create trackbars
cv2.createTrackbar('H-', 'image', 16, 180, nothing)
cv2.createTrackbar('H+', 'image', 25, 180, nothing)
cv2.createTrackbar('S-', 'image', 40, 255, nothing)
cv2.createTrackbar('S+', 'image', 150, 255, nothing)
cv2.createTrackbar('V-', 'image', 97, 255, nothing)
cv2.createTrackbar('V+', 'image', 172, 255, nothing)

while 1:
    # Choose image
    img = cv2.cvtColor(cv2.imread('img/1.jpg'), cv2.COLOR_BGR2HSV)

    # Get slider values
    h = cv2.getTrackbarPos('H-', 'image'), cv2.getTrackbarPos('H+', 'image')
    s = cv2.getTrackbarPos('S-', 'image'), cv2.getTrackbarPos('S+', 'image')
    v = cv2.getTrackbarPos('V-', 'image'), cv2.getTrackbarPos('V+', 'image')

    # Thresholds
    lower = np.array([h[0], s[0], v[0]], np.uint8)
    upper = np.array([h[1], s[1], v[1]], np.uint8)

    # Calculate mask using thresholds
    mask = cv2.inRange(img, lower, upper)

    # Combine original image and mask
    h, w = img.shape[:2]
    vis = np.zeros((h, w * 2), np.uint8)
    vis = cv2.cvtColor(vis, cv2.COLOR_GRAY2BGR)
    vis[:h, :w] = cv2.cvtColor(img, cv2.COLOR_HSV2BGR)
    vis[:h, w:w * 2] = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)

    # Show image
    cv2.imshow('image', vis)
    k = cv2.waitKey(1) & 0xFF
    if k == 27:  # ESC
        break

cv2.destroyAllWindows()

【问题讨论】:

  • Here 是一个类似的讨论,其中包含许多可以提供帮助的想法。
  • 也许你可以看看条码代码,看看它们是如何检测条码位置的,而无需实际阅读它......
  • 所有这些图像是在相同的高度获取的吗?即,人们可以期望过境点具有一定的规模吗?
  • @StefanvanderWalt 是的,可能。现在这不是一个约束,但我可以做到。
  • 如果你知道比例,你可以做模板匹配(skimage已经实现了)。您必须尝试匹配人行横道的多个方向。我也可能会在适当的色带中执行此操作(例如,转换为 HSV 颜色空间并抑制所有非黄色的颜色)。

标签: python opencv image-processing classification object-detection


【解决方案1】:

这不是一个简单的分割任务,因为有多个方向、复杂的背景和其他具有相似颜色分布的对象。正如评论中提到的Haar features 对这种模式非常有描述性。 Road feature detection and estimationStephen Se 和 Michael Brady 讨论了人行横道边缘是有趣的特征,它们通常是具有周期性间隔的直线。可以使用霍夫变换来累积线,然后用斜率变量过滤线以寻找目标模式。这个Masters Thesis on Urban Artifacts Detection - Stefania Pedrazzi 谈到了相同的特征:人行横道条纹(也称为斑马条纹)的主要特性是双极性,即 明亮和黑暗区域的交替。双极性导致高梯度值 条纹的边缘。因此,计算梯度和提取线将提供 一个很好的起点。然后,它将只保留逐行和逐列迭代 通过图像,检查连续线条的几何结构。 虽然这是用于横向观察,但仍然可以使用几何特征。

【讨论】:

  • Haar 分类器仍在训练中,已经训练了 2 天 :) 训练结束后我会告诉你它是否有效。
  • 也许你也可以看看 scikit-image 中的概率霍夫变换——它会返回短线段。
  • @beedot 分类器花了八天的时间来训练,并且不能正常工作:(但这可能是训练图像的问题。无论如何感谢您提供的答案,其中包含许多指向(可能)正确的指针方向。我现在会接受它,即使还没有任何积极的结果。
  • 嘿@DaniloBargen - 糟糕的是它不起作用,因为它是一个基本的几何特征。人行道模式的不同比例的失败是什么样的?
  • 要么不识别任何东西,要么在根本没有人行横道的地方识别它们......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-19
  • 2011-07-18
  • 2015-07-19
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多