我正在检测停车场的线路,如下所示
我希望得到的是在交叉线上的清晰线和(x,y)位置,但是结果不是很有希望
我想主要是因为两个原因
有些纹路断了,甚至连人眼都看不清 识别他们。(即使是HoughLine也可以帮助连接一些丢失的 因为HoughLine有时会连接不必要的线路 一起,所以我宁愿手动操作)
有一些重复的行
工程总管道如下
import cv2
import numpy as np
import matplotlib
from matplotlib.pyplot import imshow
from matplotlib import pyplot as plt
# white color mask
img = cv2.imread(filein)
#converted = convert_hls(img)
image = cv2.cvtColor(img,cv2.COLOR_BGR2HLS)
lower = np.uint8([0, 200, 0])
upper = np.uint8([255, 255, 255])
white_mask = cv2.inRange(image, lower, upper)
# yellow color mask
lower = np.uint8([10, 0, 100])
upper = np.uint8([40, 255, 255])
yellow_mask = cv2.inRange(image, lower, upper)
# combine the mask
mask = cv2.bitwise_or(white_mask, yellow_mask)
result = img.copy()
cv2.imshow("mask",mask)
height,width = mask.shape
skel = np.zeros([height,width],dtype=np.uint8) #[height,width,3]
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3,3))
temp_nonzero = np.count_nonzero(mask)
while(np.count_nonzero(mask) != 0 ):
eroded = cv2.erode(mask,kernel)
cv2.imshow("eroded",eroded)
temp = cv2.dilate(eroded,kernel)
cv2.imshow("dilate",temp)
temp = cv2.subtract(mask,temp)
skel = cv2.bitwise_or(skel,temp)
mask = eroded.copy()
cv2.imshow("skel",skel)
#cv2.waitKey(0)
edges = cv2.Canny(skel, 50, 150)
cv2.imshow("edges",edges)
lines = cv2.HoughLinesP(edges,1,np.pi/180,40,minLineLength=30,maxLineGap=30)
i = 0
for x1,y1,x2,y2 in lines[0]:
i+=1
cv2.line(result,(x1,y1),(x2,y2),(255,0,0),1)
print i
cv2.imshow("res",result)
cv2.waitKey(0)
我不知道在选择了某个颜色的第一步后,线是有断线和噪音的,我想在这一步我们应该做些什么,使断线完整,噪音更小的线,然后尝试应用一些东西来做精明和豪夫线,有什么想法吗?
我不知道你到底在问什么,因为你的帖子里没有问题。
从openCV 3开始,openCV中就出现了LSD(线段检测器),这是一种很好的检测线段的健壮技术。
这里有一些简单的C++基础代码,很容易转换为python:
给出这个结果:
比你的图像更适合进一步处理(没有行重复等)
这里有一些很好的答案来回答你的第一部分问题,但是对于第二部分(寻找直线交点),我没有看到太多。
我建议你看看Bentley-Ottmann算法。
有一些算法here和here的python实现。
编辑:使用VeraPoseidon的Houghlines实现和链接在这里的第二个库,我成功地获得了以下交叉点检测结果。归功于维拉和图书馆作者的出色工作。绿色方块表示检测到的交叉点。有一些错误,但这似乎是一个很好的起点对我来说。似乎大多数你实际想要检测交叉点的位置都检测到了多个交叉点,因此你可以在图像上运行一个大小合适的窗口,该窗口寻找多个交叉点,并将真正的交叉点视为激活该窗口的交叉点。
下面是我用来生成该结果的代码:
您可以使用类似于此代码块的方法来删除一个小区域中的多个交叉点:
输出图像:
不过,你得玩窗口功能。
这是我的管道,也许它能给你一些帮助。
首先,获取灰度图像并处理高斯模糊。
其次,使用Canny进行边缘检测。
然后,使用HoughLinesP获取行。您可以调整参数以获得更好的性能。
最后,在srcImage上画线。
这是我最后的表演。
最终图像:
相关问题 更多 >
编程相关推荐