加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

从鸟瞰图拟合车道

发布时间:2020-12-14 03:19:46 所属栏目:大数据 来源:网络整理
导读:import numpy as np import matplotlib.image as mpimg import matplotlib.pyplot as plt import cv2 # Load our image binary_warped = mpimg.imread(‘warped_example.jpg‘) def find_lane_pixels(binary_warped): ??? # Take a histogram of the bottom

import numpy as np
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import cv2

# Load our image
binary_warped = mpimg.imread(‘warped_example.jpg‘)

def find_lane_pixels(binary_warped):
??? # Take a histogram of the bottom half of the image

??? #统计每一列的非零点数,从而形成列直方图,车道因为是垂直于x轴的,所以每一列的非零点数比其他的要多
??? histogram = np.sum(binary_warped[binary_warped.shape[0]//2:,:],axis=0)
??? # Create an output image to draw on and visualize the result
??? out_img = np.dstack((binary_warped,binary_warped,binary_warped))
??? # Find the peak of the left and right halves of the histogram
??? # These will be the starting point for the left and right lines
??? midpoint = np.int(histogram.shape[0]//2)

??? #左右车道分别在左半图和右半图查找最直方图的最大值
??? leftx_base = np.argmax(histogram[:midpoint])
??? rightx_base = np.argmax(histogram[midpoint:]) + midpoint

??? # HYPERPARAMETERS

??? #设置窗口大小
??? # Choose the number of sliding windows
??? nwindows = 9
??? # Set the width of the windows +/- margin
??? margin = 100
??? # Set minimum number of pixels found to recenter window
??? minpix = 50

??? # Set height of windows - based on nwindows above and image shape
??? window_height = np.int(binary_warped.shape[0]//nwindows)
??? # Identify the x and y positions of all nonzero pixels in the image

??? #获取到所有非零点的坐标,分别按照列坐标,行坐标,存储
??? nonzero = binary_warped.nonzero()
??? print(nonzero)

??? #列坐标
??? nonzeroy = np.array(nonzero[0])

??? #行坐标
??? nonzerox = np.array(nonzero[1])
??? print("length of nonzeroy",len(nonzeroy))
??? # Current positions to be updated later for each window in nwindows
??? leftx_current = leftx_base
??? rightx_current = rightx_base

??? # Create empty lists to receive left and right lane pixel indices
??? left_lane_inds = []
??? right_lane_inds = []

??? # Step through the windows one by one
??? for window in range(nwindows):
??????? # Identify window boundaries in x and y (and right and left)
??????? win_y_low = binary_warped.shape[0] - (window+1)*window_height
??????? win_y_high = binary_warped.shape[0] - window*window_height
??????? win_xleft_low = leftx_current - margin
??????? win_xleft_high = leftx_current + margin
??????? win_xright_low = rightx_current - margin
??????? win_xright_high = rightx_current + margin
?????? ?
??????? # Draw the windows on the visualization image
??????? cv2.rectangle(out_img,(win_xleft_low,win_y_low),
??????? (win_xleft_high,win_y_high),(0,255,0),2)
??????? cv2.rectangle(out_img,(win_xright_low,
??????? (win_xright_high,2)
?????? ?
??????? # Identify the nonzero pixels in x and y within the window #

??????? #对于区域内的点进行统计
??????? good_left_inds = ((nonzeroy >= win_y_low) & (nonzeroy < win_y_high) &
??????? (nonzerox >= win_xleft_low) &? (nonzerox < win_xleft_high)).nonzero()[0]
??????? good_right_inds = ((nonzeroy >= win_y_low) & (nonzeroy < win_y_high) &
??????? (nonzerox >= win_xright_low) &? (nonzerox < win_xright_high)).nonzero()[0]
?????? ?
??????? # Append these indices to the lists
??????? left_lane_inds.append(good_left_inds)
??????? right_lane_inds.append(good_right_inds)
?????? ?
??????? # If you found > minpix pixels,recenter next window on their mean position
??????? if len(good_left_inds) > minpix:
??????????? leftx_current = np.int(np.mean(nonzerox[good_left_inds]))
??????? if len(good_right_inds) > minpix:?????? ?
??????????? rightx_current = np.int(np.mean(nonzerox[good_right_inds]))

??? # Concatenate the arrays of indices (previously was a list of lists of pixels)

??? #将所有的所有的点进行合并
??? try:
??????? left_lane_inds = np.concatenate(left_lane_inds)
??????? right_lane_inds = np.concatenate(right_lane_inds)
??? except ValueError:
??????? # Avoids an error if the above is not implemented fully
??????? pass

??? # Extract left and right line pixel positions

??? # 将一维化的坐标重新映射回二维化的点坐标??? leftx = nonzerox[left_lane_inds]??? lefty = nonzeroy[left_lane_inds] ??? rightx = nonzerox[right_lane_inds]??? righty = nonzeroy[right_lane_inds]??? return leftx,lefty,rightx,righty,out_imgdef fit_polynomial(binary_warped):??? # Find our lane pixels first??? leftx,out_img = find_lane_pixels(binary_warped)??? # Fit a second order polynomial to each using `np.polyfit`??? left_fit = np.polyfit(lefty,leftx,2)??? right_fit = np.polyfit(righty,2)??? # Generate x and y values for plotting??? ploty = np.linspace(0,binary_warped.shape[0]-1,binary_warped.shape[0] )??? try:??????? left_fitx = left_fit[0]*ploty**2 + left_fit[1]*ploty + left_fit[2]??????? right_fitx = right_fit[0]*ploty**2 + right_fit[1]*ploty + right_fit[2]??? except TypeError:??????? # Avoids an error if `left` and `right_fit` are still none or incorrect??????? print(‘The function failed to fit a line!‘)??????? left_fitx = 1*ploty**2 + 1*ploty??????? right_fitx = 1*ploty**2 + 1*ploty??? ## Visualization ##??? # Colors in the left and right lane regions??? out_img[lefty,leftx] = [255,0]??? out_img[righty,rightx] = [0,255]??? # Plots the left and right polynomials on the lane lines??? plt.plot(left_fitx,ploty,color=‘yellow‘)??? plt.plot(right_fitx,color=‘yellow‘)??? return out_imgout_img = fit_polynomial(binary_warped)plt.imshow(out_img)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读