我有一些工作代碼,但性能很糟糕,可以做得更好,所以讓我們看看它如何進行優化。Opencv和python - 兩行之間的着色區域
我有一張圖片,上面繪製了兩條半垂直線,並希望遮蔽這兩條線之間的區域。我當前的代碼逐個像素迭代,這在python中很慢。
#Get starting images
shade_image = np.zeros_like(image)
line_image = plot_lines(shade_image, left_line, right_line)
#Choose color
shade_color = [0, 255, 0]
#Iterate through and fill blank image
left_switch = False
right_switch = False
for i in range(0, image.shape[0]):
left_switch = False
right_switch = False
for j in range(0, image.shape[1]):
if left_switch & right_switch: shade_image[i][j] = shade_color
#Find left edge of left line
if (not left_switch) & (not right_switch) & np.any(line_image[i][j] != 0):
left_switch = True
#Find right edge of left line
elif left_switch & (not right_switch) & np.all(line_image[i][j] == 0):
right_switch = True
#Find left edge of left line
elif left_switch & right_switch & np.any(line_image[i][j] != 0):
break
#In case of a single line, no shading
elif left_switch & right_switch & (j == (image.shape[1] - 1)):
shade_image[i].fill(0)
#Shade lane area
output_image = cv2.addWeighted(image, 1.0, shade_image, 1.0, gamma=0.0)
不漂亮。我想不知怎麼這可以通過使用line_image中的所有nonzeros並創建一個蒙版來完成,但我不知道如何在左右點之間填充。我嘗試使用fillPolygon,但我不知道如何將所有非零值轉換爲頂點。
如果有幫助,陰影也可以包含線條,這不是確切的。
@Alxeander - 非常有幫助!我幾乎在那裏,除了現在有一個問題,因爲邊界框,填充凸線之外,如下所示:
或者,我拋棄cv2.convexHull並直接使用連接的點作爲頂點一個多邊形,並得到這個結果:
它遵循的曲率,凸或凹,但因爲它的順序點時,它從左到右翻轉。我試過使用np.flips(points2,0)但沒有改變。我會再玩一些,幾乎在那裏。
感謝您的幫助!
如何在您的線定義的?你有沒有在圖像邊界線的端點,你有一個公式,你有起點的角度和距離嗎?等等。你可以用'fillPoly'或其他方法來完成這個工作,這些方法不會像這樣循環遍歷每個點,但這取決於你的行是如何定義的。看起來您可能可以使用'line_image'通過查找行顏色來查找第一行和最後一行的行終點,並將其用作「fillPoly」的終點,但如果行先前已定義你可能根本不需要第一個線。 –
線條不會延伸到頂部和底部。這些線實際上是由一個多項式定義的,我使用plot_lines()來繪製它們與matplotlib.pyplot,然後將它們轉換爲一個np.array(BGR) – DrTarr