【发布时间】: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