def __call__(self, img): undistorted = camera.undistort(img, self.mtx, self.dist) thresh_img = processImage(undistorted) warped, Minv = perspective.warp(thresh_img) leftx_poly, rightx_poly = self.lanefinder.findLanes(warped) polygon = vis.drawLaneWithPolygon(warped, leftx_poly, rightx_poly, self.ploty) polygon = perspective.unwarp(polygon, Minv) combined = cv2.addWeighted(undistorted, 1.0, polygon, 0.3, 0) curvature = self.lanefinder.getCurvature() car_offset = self.lanefinder.getCarOffset() cv2.putText(combined, "Curvature Radius:" + "{:5.2f}km".format(curvature), (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1.0, [255, 255, 255], 2, cv2.LINE_AA) cv2.putText( combined, "Distance from Center:" + '{:5.2f}cm'.format(car_offset * 100), (20, 80), cv2.FONT_HERSHEY_SIMPLEX, 1.0, [255, 255, 255], 2, cv2.LINE_AA) return combined
def draw(orign,predict_img, left_fit, right_fit): M,Minv = perspective() warped = warp(np.uint8(predict_img * 255)) warp_zero = np.zeros_like(warped).astype(np.uint8) color_warp = np.dstack((warp_zero, warp_zero, warp_zero)) plot_y = np.linspace(0, warped.shape[0] - 1, warped.shape[0]) left_fit_x = left_fit[0]*plot_y**2 + left_fit[1]*plot_y + left_fit[2] right_fit_x = right_fit[0]*plot_y**2 + right_fit[1]*plot_y + right_fit[2] middle_fit_x = (left_fit_x+right_fit_x)/2 dy = 2*left_fit[0]*710 + left_fit[1] ddy = 2*left_fit[0] R = ((1+dy**2)**(3/2))/ddy*2.87/584 pts_left = np.array([np.transpose(np.vstack([left_fit_x, plot_y]))]) pts_right = np.array([np.flipud(np.transpose(np.vstack([right_fit_x, plot_y])))]) pts_middle = np.array([np.flipud(np.transpose(np.vstack([middle_fit_x, plot_y])))]) PTS =np.hstack(pts_middle) pts = np.hstack((pts_left, pts_right)) try: cv2.fillPoly(color_warp, np.int_([pts]), (0, 255, 0),) cv2.polylines(color_warp,np.int_([PTS]),isClosed=False,color=(0,0,255),thickness=5) cv2.polylines(color_warp, np.int_([pts]), isClosed=False, color=(255, 150,0),thickness=8) print(color_warp.shape) except: pass newwarp = cv2.warpPerspective(color_warp, Minv, (880, 246)) newwarp = cv2.copyMakeBorder(newwarp,420,54,200,200, cv2.BORDER_CONSTANT,value=[0,0,0]) result = cv2.addWeighted(orign, 1, newwarp, 0.3, 0) try: cv2.putText(result, str('Radius of curvature:') + str(round(R, 2)), (60, 100), cv2.FONT_HERSHEY_SIMPLEX, 1,(255, 0, 5), 1) pass except: pass return result
def find_lane_xyaxis(img): img = warp(np.uint8(img * 255)) expected_x_starts = [500, 1254] # #[520,1264]���峵��ͼ����������ʼ���� xyaxis = [[], []] #����һ����list������������������ߵ����� search_range = int(248) # #������Χ���Գ����߿�ȵ�����֮һ�������� y_iters = int(12) # #���峵��ͼ���������������� lane_pixels = img.nonzero() #ȡ�������߶�ֵͼ���з�������꣬������������ lane_pixels_y = np.array(lane_pixels[0]) #ȡ���������������� lane_pixels_x = np.array(lane_pixels[1]) #ȡ�������ߺ������� for lane_idx in range(2): start_x = expected_x_starts[lane_idx] flag = False #����flag�������ж��Ƿ���box�д��ڳ����� for y_idx in range(y_iters): #�ֱ���ɶ�������������������ȡ y_mid = int((y_iters - y_idx) * 5951 / y_iters) #������������ֵ��0 - 5951��û��496������ȡһ�� '''����box���ĸ���������''' y_min = y_mid - search_range y_max = y_mid + search_range x_min = start_x - search_range x_max = start_x + search_range found_indices = ( (lane_pixels_x >= x_min) & (lane_pixels_x <= x_max) & (lane_pixels_y >= y_min) & (lane_pixels_y <= y_max)).nonzero()[0] #ȡ�������ߺ��������λ�� found_x = lane_pixels_x[found_indices] #ȡ�������ߺ������� if len(found_x) > 1: start_x = int( np.mean(found_x)) #ȥ�����ߺ��������ƽ��ֵ��Ϊʵ�ʺ������� flag = True #box�д��ڳ����� if flag: xyaxis[lane_idx].append([start_x, y_mid]) #��������������ӵ�list�� else: pass return xyaxis
def find_lane_xyaxis(img): img = warp(np.uint8(img * 255)) expected_x_starts = [500, 1254] # #[520,1264]定义车道图像矩阵横向起始坐标 xyaxis = [[], []]#定义一个空list用来存放左右两车道线的坐标 search_range = int(248) # #搜索范围,以车道线宽度的三分之一长度搜索 y_iters = int(12) # #定义车道图像矩阵纵向坐标个数 lane_pixels = img.nonzero()#取出车道线二值图像中非零点坐标,即车道线坐标 lane_pixels_y = np.array(lane_pixels[0])#取出车道线纵向坐标 lane_pixels_x = np.array(lane_pixels[1])#取出车道线横向坐标 for lane_idx in range(2): start_x = expected_x_starts[lane_idx] flag = False #定义flag,用以判断是否在box中存在车道线 for y_idx in range(y_iters):#分别完成对左右两车道线坐标提取 y_mid = int((y_iters - y_idx) * 5951 / y_iters)#定义纵向坐标值从0 - 5951,没隔496个像素取一个 '''定义box的四个顶点坐标''' y_min = y_mid - search_range y_max = y_mid + search_range x_min = start_x - search_range x_max = start_x + search_range found_indices = ((lane_pixels_x >= x_min) & (lane_pixels_x <= x_max) & (lane_pixels_y >= y_min) & ( lane_pixels_y <= y_max)).nonzero()[0]#取出车道线横向坐标的位置 found_x = lane_pixels_x[found_indices]#取出车道线横向坐标 if len(found_x) > 1: start_x = int(np.mean(found_x))#去车道线横向坐标的平均值作为实际横向坐标 flag = True#box中存在车道线 if flag: xyaxis[lane_idx].append([start_x, y_mid])#将车道线坐标添加到list中 else: pass return xyaxis
def draw(orign,predict_img, left_fit, right_fit): M,Minv = perspective() warped = warp(np.uint8(predict_img * 255)) cv2.imwrite('./newwarp.jpg', warped) warp_zero = np.zeros_like(warped).astype(np.uint8) color_warp = np.dstack((warp_zero, warp_zero, warp_zero)) plot_y = np.linspace(0, warped.shape[0] - 1, warped.shape[0]) left_fit_x = left_fit[0]*plot_y**2 + left_fit[1]*plot_y + left_fit[2] right_fit_x = right_fit[0]*plot_y**2 + right_fit[1]*plot_y + right_fit[2] middle_fit_x = (left_fit_x+right_fit_x)/2 dy = 2*left_fit[0]*710 + left_fit[1] ddy = 2*left_fit[0] R = ((1+dy**2)**(3/2))/ddy*2.87/584 pts_left = np.array([np.transpose(np.vstack([left_fit_x, plot_y]))]) pts_right = np.array([np.flipud(np.transpose(np.vstack([right_fit_x, plot_y])))]) pts_middle = np.array([np.flipud(np.transpose(np.vstack([middle_fit_x, plot_y])))]) PTS =np.hstack(pts_middle) pts = np.hstack((pts_left, pts_right)) try: cv2.fillPoly(color_warp, np.int_([pts]), (0, 255, 0),) cv2.polylines(color_warp,np.int_([PTS]),isClosed=False,color=(0,0,255),thickness=5) cv2.polylines(color_warp, np.int_([pts]), isClosed=False, color=(255, 150,0),thickness=8) except: pass cv2.imwrite('./newwarp0.jpg', color_warp) newwarp = cv2.warpPerspective(color_warp, Minv, (880, 246)) cv2.imwrite('./newwarp1.jpg',newwarp) newwarp = cv2.copyMakeBorder(newwarp,420,54,200,200, cv2.BORDER_CONSTANT,value=[0,0,0]) result = cv2.addWeighted(orign, 1, newwarp, 0.3, 0) cv2.imwrite('./result.jpg',result) try: cv2.putText(result, str('Radius of curvature:') + str(round(R, 2)), (60, 100), cv2.FONT_HERSHEY_SIMPLEX, 1,(255, 0, 5), 1) print( str('Radius of curvature:') + str(round(R, 2))+'m') except: pass #offset center left_point = left_fit[0] * 700 ** 2 + left_fit[1] * 700 + left_fit[2] right_point = right_fit[0] * 700 ** 2 + right_fit[1] * 700 + right_fit[2] lane_center = (left_point + right_point) / 2 off_center = (result.shape[1] / 2 - lane_center) * (3 / 734) off_center = round(off_center, 3) if off_center < 0: print("Offset to right:", abs(off_center), str("m")) center_messages = "Offset to right: : " + str(abs(off_center)) + str("m") if off_center > 0: print("Offset to left:", abs(off_center), str("m")) center_messages = "Offset to left:" + str(abs(off_center)) + str("m") if off_center == 0: print("On the center:", abs(off_center), str("m")) cv2.putText(result, center_messages, (60, 60), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 1) return result