Exemplo n.º 1
0
    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
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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