回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我正在检测停车场的线路,如下所示</p>
<p><a href="https://i.stack.imgur.com/sDQLM.png" rel="noreferrer"><img src="https://i.stack.imgur.com/sDQLM.png" alt="Empty parking lot"/></a></p>
<p>我希望得到的是在交叉线上的清晰线和(x,y)位置,但是结果不是很有希望</p>
<p><a href="https://i.stack.imgur.com/IcDQ6.png" rel="noreferrer"><img src="https://i.stack.imgur.com/IcDQ6.png" alt="Parking lot with Hough Lines drawn"/></a></p>
<p>我想主要是因为两个原因</p>
<ol>
<li><p>有些纹路断了,甚至连人眼都看不清
识别他们。(即使是HoughLine也可以帮助连接一些丢失的
因为HoughLine有时会连接不必要的线路
一起,所以我宁愿手动操作)</p></li>
<li><p>有一些重复的行</p></li>
</ol>
<p>工程总管道如下</p>
<h2>一。选择一些特定的颜色(白色或黄色)</h2>
<pre><code>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)
</code></pre>
<p><a href="https://i.stack.imgur.com/befJN.png" rel="noreferrer"><img src="https://i.stack.imgur.com/befJN.png" alt="Binary image"/></a></p>
<h2>2。重复扩张和侵蚀,直到图像无法改变(<a href="http://felix.abecassis.me/2011/09/opencv-morphological-skeleton/" rel="noreferrer">reference</a>)</h2>
<pre><code>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)
</code></pre>
<p><a href="https://i.stack.imgur.com/mtkZb.png" rel="noreferrer"><img src="https://i.stack.imgur.com/mtkZb.png" alt=" After the erosion and dialation"/></a></p>
<h2>三。用canny过滤线条,用HoughLinesP得到线条</h2>
<pre><code>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)
</code></pre>
<p><a href="https://i.stack.imgur.com/P2DmC.png" rel="noreferrer"><img src="https://i.stack.imgur.com/P2DmC.png" alt="After Canny"/></a></p>
<p>我不知道在选择了某个颜色的第一步后,线是有断线和噪音的,我想在这一步我们应该做些什么,使断线完整,噪音更小的线,然后尝试应用一些东西来做精明和豪夫线,有什么想法吗?</p>