前言:
首先計算之前檢測出來的車道線的中線與輸入圖像的中線進行計算距離,,并設置不同的閾值對于不同的方向進行相關的調整。
一、車輛中心線
一般而言將攝像頭架設在車輛的正中心軸上,所獲得的圖像的中間線極為車輛的中心。
def CalculateCurvature(binary_image, left_fit, right_fit, l_lane_inds, r_lane_inds):img_size = (binary_image.shape[1], binary_image.shape[0])ploty = np.linspace(0, img_size[1]-1, img_size[1])y_eval = np.max(ploty)# 找到圖像中不為零的所有像素點的像素坐標nonzero = binary_image.nonzero()nonzeroy = np.array(nonzero[0])nonzerox = np.array(nonzero[1])# 將這些不為零的像素點坐標分成x,y車道線中leftx = nonzerox[l_lane_inds]lefty = nonzeroy[l_lane_inds] rightx = nonzerox[r_lane_inds]righty = nonzeroy[r_lane_inds]# 將這些像素點對應到世界坐標系中,然后擬合成二次曲線left_fit_cr = np.polyfit(lefty, leftx*xm_per_pix, 2)right_fit_cr = np.polyfit(righty, rightx*xm_per_pix, 2) ## 以下計算本車在車道線中心的位置dist_from_center = 0.0if right_fit is not None:if left_fit is not None:# 攝像頭位于圖像中間,也是本車的中心camera_pos = img_size[0] / 2# 左右車道線最底端x坐標left_lane_pix = np.polyval(left_fit, binary_image.shape[0])right_lane_pix = np.polyval(right_fit, binary_image.shape[0])# 左右車道線中點x坐標center_of_lane_pix = (left_lane_pix + right_lane_pix) / 2# 攝像頭(本車中心)與車道線中心的距離dist_from_center = (camera_pos - center_of_lane_pix) * 3.7/960return dist_from_center
其中返回的dist_from_center是車輛中心線和車道線中心線之間的距離。
二、輸出顯示距離
在Carla中生成一輛車,并在車輛中心線位置生成一個相機,采集圖像信息,首先在車輛中心線上生成一一條線,并顯示出來。
直接取圖像的size然后設置起點和終點,
使用函數cv2.line就可以,
results = cv2.line(results, start_point, end_point, line_color, thickness)
這個是在圖像正中間畫上一條線。
然后再在識別出的車道線正中間畫上一條線
之前寫的函數lane_position會返回左邊和右邊的車道線的點,
取這兩個點然后算平均值,
lanes_pos = lane_position(img_histogram)l1 = lanes_pos[0][0]r1 = lanes_pos[1][0]p1 = int((l1 + r1) / 2)start_point1 = (p1, 0)end_point1 = (p1, int(height))
最后輸出結果:
?紅線是圖像的中心線,黃線是車道線的中心線。
之后的步驟就是直接用它們兩個之間的距離來計算控制車輛左轉和右轉。
三、車輛控制
在Carla中生成一輛車,中心線上搭載相機,Carla中有兩種相機可以選擇,一種是普通的RGB相機,另外一種是直接有的語義分割相機,選擇語義分割相機簡單簡單很多。
注意Carla中輸出的是圖像的格式是png格式,這會有一個問題,是它rgb通道會歸一化,所以輸出為0.8到1之間,大坑卡了我很久。
原始圖像:
通過rgb圖像旋轉輸出的圖像:
tmd,4通道圖象第四列全部設置為1才行!卡我很久
最好直接把第4列去除,方便!
融合sobel和rgb信息后輸出:
?然后選擇感興趣的區域:
?透視變換:
找到點為:
top_left =[1000,700]top_right = [1374,700]bottom_left = [330,1100]bottom_right = [2000,1100]# give 4 points to project.proj_top_left = [200,100]proj_top_right = [2200,100]proj_bottom_left = [200,1100]proj_bottom_right = [2200,1100]
?直方圖輸出:
?滑動窗口輸出:
?曲線擬合:
?添加圖層蒙版:
未完待續。。。