侵權(quán)投訴
訂閱
糾錯(cuò)
加入自媒體

詳解車(chē)道線檢測(cè)算法之傳統(tǒng)圖像處理

繪制車(chē)道線

# 定義左右車(chē)道線的點(diǎn)集合right_list = []left_list = []

# 根據(jù)霍夫變換得到的線段,繪制左右各一條車(chē)道線if lines is not None:    for line in lines:        for x1,y1,x2,y2 in line:            if (y1 - y2) / (x1 - x2) > 0:# right side                right_list.a(chǎn)ppend([x1,y1,x2,y2,(y2-y1)/(x2-x1),(x1*y2-x2*y1)/(x1-x2)])            else:# left side                left_list.a(chǎn)ppend([x1,y1,x2,y2,(y2-y1)/(x2-x1),(x1*y2-x2*y1)/(x1-x2)])# 通過(guò)計(jì)算斜率,篩選得到最優(yōu)車(chē)道線    if len(right_list) != 0:        [k_right_mean,b_right_mean,x_list,y_list] = filter_lines(right_list)        y1_right = img.shape[0]-60        x1_right = (y1_right - b_right_mean) / k_right_mean        y2_right = img.shape[0]*.65 #min(y_right)        x2_right = (y2_right - b_right_mean) / k_right_mean                cv2.line(img, (np.int32(x1_right),  np.int32(y1_right)), (np.int32(x2_right),  np.int32(y2_right)), [255,0,0], thickness)           if len(left_list) != 0:        [k_left_mean,b_left_mean,x_list,y_list] = filter_lines(left_list)        y1_left = img.shape[0]-60        x1_left = (y1_left - b_left_mean) / k_left_mean        y2_left = img.shape[0]*.65 #min(y_left)        x2_left = (y2_left - b_left_mean) / k_left_mean        cv2.line(img, (np.int32(x1_left),  np.int32(y1_left)), (np.int32(x2_left),  np.int32(y2_left)), color, thickness)  
def filter_lines(xy_kb_list):    n = 3    k_list = [xy_kb[4] for xy_kb in xy_kb_list]    mean = np.mean(k_list)    std = np.std(k_list)    good_k_list = []    good_b_list = []    good_x_list = []    good_y_list = []    for [x1, y1, x2, y2, k, b] in xy_kb_list:        if k < mean + n*std:            good_k_list.a(chǎn)ppend(k)            good_b_list.a(chǎn)ppend(b)            good_x_list.a(chǎn)ppend(x1)            good_x_list.a(chǎn)ppend(x2)            good_y_list.a(chǎn)ppend(y1)            good_y_list.a(chǎn)ppend(y2)    if not good_x_list:        good_k_list = k_list        good_b_list = [xy_kb[5] for xy_kb in xy_kb_list]        good_x_list = [xy_kb[0] for xy_kb in xy_kb_list] + [xy_kb[2] for xy_kb in xy_kb_list]        good_y_list = [xy_kb[1] for xy_kb in xy_kb_list] + [xy_kb[3] for xy_kb in xy_kb_list]    k_mean = np.median(good_k_list)    b_mean = np.median(good_b_list)        return k_mean,b_mean,good_x_list,good_y_list

將算法應(yīng)用于視頻

output = 'test_video_output.mp4'

from moviepy.editor import VideoFileClip

clip1 = VideoFileClip("test_video.mp4")white_clip = clip1.fl_image(process_image) %time white_clip.write_videofile(output , audio=False)

高級(jí)車(chē)道線檢測(cè)算法--曲線

計(jì)算相機(jī)校正矩陣和失真系數(shù)

# 使用提供的一組棋盤(pán)格圖片計(jì)算相機(jī)校正矩陣(camera calibration matrix)和失真系數(shù)(distortion coefficients).

objpoints = [] imgpoints = [] 

for ny in [5,6]:    for nx in [6,7,8,9]:        objp = np.zeros((ny*nx,3), np.float32)        objp[:,:2] = np.mgrid[0:nx, 0:ny].T.reshape(-1,2)
       for idx, fname in enumerate(images):            img = cv2.imread(fname)            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)            # 使用cv2自動(dòng)尋找棋盤(pán)corners            ret, corners = cv2.findChessboardCorners(gray, (nx,ny), None)            if ret == True:                objpoints.a(chǎn)ppend(objp)                imgpoints.a(chǎn)ppend(corners)                # 繪制corners                cv2.drawChessboardCorners(img, (nx,ny), corners, ret)                image_name=os.path.split(fname)[1]                write_name = out_dir_cam+'corners_found_ny'+str(ny)+'_nx'+str(nx)+'_'+image_name                cv2.imwrite(write_name, img)                print(fname)                plt.imshow(img)

# Test undistortion on an imageimg = cv2.imread('camera_cal/calibration.jpg')img_size = (img.shape[1], img.shape[0])

# Do camera calibration given object points and image pointsret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, img_size,None,None)dst = cv2.undistort(img, mtx, dist, None, mtx)

# 保存相機(jī)校正矩陣和失真系數(shù)結(jié)果dist_pickle = {}dist_pickle["mtx"] = mtxdist_pickle["dist"] = distpickle.dump(dist_pickle, open( "camera_dist_pickle.p", "wb" ) )

校正車(chē)道線圖片

使用計(jì)算好的相機(jī)校正矩陣(camera calibration matrix)和失真系數(shù)(distortion coefficients)校正車(chē)道線圖片。

# 打開(kāi)相機(jī)校正矩陣和失真系數(shù)結(jié)果with open('camera_dist_pickle.p', mode='rb') as f:    dist_pickle = pickle.load(f)    mtx = dist_pickle["mtx"]    dist = dist_pickle["dist"]

# 應(yīng)用于車(chē)道線圖片images = glob.glob('test_images.jpg')

for idx, fname in enumerate(images):    img = cv2.imread(fname)    dst = cv2.undistort(img, mtx, dist, None, mtx)    image_name=os.path.split(fname)[1]    write_name = out_dir_img+'undistorted_'+image_name    cv2.imwrite(write_name,dst)    print(write_name)

組合閾值處理

# 轉(zhuǎn)換到HLS顏色空間(也可嘗試其他顏色空間)hls = cv2.cvtColor(img, cv2.COLOR_RGB2HLS).a(chǎn)stype(np.float)l_channel = hls[:,:,1]s_channel = hls[:,:,2]

# 使用Sobel算法在x方向進(jìn)行閾值處理sobelx = cv2.Sobel(l_channel, cv2.CV_64F, 1, 0)abs_sobelx = np.a(chǎn)bsolute(sobelx) scaled_sobel = np.uint8(255*abs_sobelx/np.max(abs_sobelx))

聲明: 本文由入駐維科號(hào)的作者撰寫(xiě),觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問(wèn)題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號(hào)