我正试图在航拍图像上找到人行横道的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()
答案 0 :(得分:4)
这不是一个简单的分割任务,因为有多个方向,复杂背景和其他具有相似颜色分布的对象。正如评论中所提到的Haar features对此模式非常具有描述性。 Road feature detection and estimation Stephen Se和Michael Brady讨论了人行横道边缘是有趣的特征,它们通常是具有周期性间隔的直线。可以使用霍夫变换来累积线,然后使用斜率变量过滤线以查找目标模式。关于城市文物检测的这个Masters Thesis - Stefania Pedrazzi谈到了同样的特征:人行横道条纹的主要特性,也称为斑马条纹,是两极的,即 明暗区域的交替。双极性导致高梯度值 条纹的边缘。因此,计算梯度和提取线将提供 一个很好的起点。然后,它将仅保持行和列的迭代 通过图像,检查连续线的几何结构。 虽然这是针对侧面视点,但人们仍然可以使用几何特征。