日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

智慧交通day03-车道线检测实现03:相机校正和图像校正的实现

發布時間:2024/7/5 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 智慧交通day03-车道线检测实现03:相机校正和图像校正的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.相機標定

根據張正友校正算法,利用棋盤格數據校正對車載相機進行校正,計算其內參矩陣,外參矩陣和畸變系數。

標定的流程是:

  • 準備棋盤格數據,即用于標定的圖片
  • 對每一張圖片提取角點信息
  • 在棋盤上繪制提取到的角點(非必須,只是為了顯示結果)
  • 利用提取的角點對相機進行標定
  • 獲取相機的參數信息

1.1. 標定的圖片

標定的圖片需要使用棋盤格數據在不同位置、不同角度、不同姿態下拍攝的圖片,最少需要3張,當然多多益善,通常是10-20張。該項目中我們使用了20張圖片,如下圖所示:

把這些圖片存放在項目路徑中的camera_cal文件夾中。

1.2. 相機校正

下面我們對相機進行校正,OPenCV中提供了對相機進行校正的代碼,在本項目中直接使用opencv中的API進行相機的校正,如下所示:

# 1. 參數設定:定義棋盤橫向和縱向的角點個數并指定校正圖像的位置 nx = 9 ny = 6 file_paths = glob.glob("./camera_cal/calibration*.jpg") # 2. 計算相機的內外參數及畸變系數 def cal_calibrate_params(file_paths):object_points = [] # 三維空間中的點:3Dimage_points = [] # 圖像空間中的點:2d# 2.1 生成真實的交點坐標:類似(0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)的三維點objp = np.zeros((nx * ny, 3), np.float32)objp[:, :2] = np.mgrid[0:nx, 0:ny].T.reshape(-1, 2) # 2.2 檢測每幅圖像角點坐標for file_path in file_paths:img = cv2.imread(file_path)# 將圖像轉換為灰度圖gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 自動檢測棋盤格內4個棋盤格的角點(2白2黑的交點)rect, corners = cv2.findChessboardCorners(gray, (nx, ny), None)# 若檢測到角點,則將其存儲到object_points和image_pointsif rect == True:object_points.append(objp)image_points.append(corners)# 2.3 獲取相機參數ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(object_points, image_points, gray.shape[::-1], None, None)return ret, mtx, dist, rvecs, tvecs

在這里有幾個API給大家介紹下:

  • 尋找棋盤圖中的棋盤角點
  • rect, corners = cv2.findChessboardCorners(image, pattern_size, flags)

    參數:

    • Image: 輸入的棋盤圖,必須是8位的灰度或者彩色圖像

    • Pattern_size:棋盤圖中每行每列的角點個數(內角點)。

    • flags: 用來定義額外的濾波步驟以有助于尋找棋盤角點。所有的變量都可以單獨或者以邏輯或的方式組合使用。取值主要有:

      CV_CALIB_CB_ADAPTIVE_THRESH :使用自適應閾值(通過平均圖像亮度計算得到)將圖像轉換為黑白圖,而不是一個固定的閾值。

      CV_CALIB_CB_NORMALIZE_IMAGE :在利用固定閾值或者自適應的閾值進行二值化之前,先使用cvNormalizeHist來均衡化圖像亮度。

      CV_CALIB_CB_FILTER_QUADS :使用其他的準則(如輪廓面積,周長,方形形狀)來去除在輪廓檢測階段檢測到的錯誤方塊。

    返回:

    • Corners:檢測到的角點
    • rect: 輸出是否找到角點,找到角點返回1,否則返回0

    • 檢測完角點之后我們可以將將測到的角點繪制在圖像上,使用的API是:

      cv2.drawChessboardCorners(img, pattern_size, corners, rect)

      參數:

      • Img: 預繪制檢測角點的圖像
      • pattern_size : 預繪制的角點的形狀
      • corners: 角點矩陣
      • rect: 表示是否所有的棋盤角點被找到,可以設置為findChessboardCorners的返回值

      注意:如果發現了所有的角點,那么角點將用不同顏色繪制(每行使用單獨的顏色繪制),并且把角點以一定順序用線連接起來,如下圖所示:

    • 利用定標的結果計算內外參數

    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(object_points, image_points, image_size, None, None)

    參數:

    • Object_points:世界坐標系中的點,在使用棋盤的場合,我們令z的坐標值為0,而x,y坐標用里面來度量,選用英寸單位,那么所有參數計算的結果也是用英寸表示。最簡單的方式是我們定義棋盤的每一個方塊為一個單位。
    • image_points:在圖像中尋找到的角點的坐標,包含object_points所提供的所有點
    • image_size: 圖像的大小,以像素為衡量單位

    返回:

    • ret: 返回值

    • mtx: 相機的內參矩陣,大小為3*3的矩陣

    • dist: 畸變系數,為5*1大小的矢量

    • rvecs: 旋轉變量

    • tvecs: 平移變量

    1.3 圖像去畸變

    效果預覽:
    ? ? ? ? ? ? ? ? ? ? ? ? 處理前:??處理后:

    上一步中我們已經得到相機的內參及畸變系數,我們利用其進行圖像的去畸變,最直接的方法就是調用opencv中的函數得到去畸變的圖像:

    def img_undistort(img, mtx, dist):dst = cv2.undistort(img, mtx, dist, None, mtx)return dst

    我們看下求畸變的API:

    dst = cv2.undistort(img, mtx, dist, None, mtx)

    參數:

    • Img: 要進行校正的圖像
    • mtx: 相機的內參
    • dist: 相機的畸變系數

    返回:

    • dst: 圖像校正后的結果


    總結:

  • 標定的圖片?

    不同角度和方向拍攝的棋盤格圖片數據

  • 相機校正

    檢測棋盤格數據的角點:

    cv2.findChessboardCorners()

    計算相機的內參數和外參數:cv2.calibrateCamera()

  • 圖像去畸變

    cv2.undistort()


  • 代碼總覽:

    # encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt #遍歷文件夾 import glob from moviepy.editor import VideoFileClip"""參數設置""" nx = 9 ny = 6 #獲取棋盤格數據 file_paths = glob.glob("./camera_cal/calibration*.jpg")# 繪制對比圖 def plot_contrast_image(origin_img, converted_img, origin_img_title="origin_img", converted_img_title="converted_img",converted_img_gray=False):fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 20))ax1.set_title = origin_img_titleax1.imshow(origin_img)ax2.set_title = converted_img_titleif converted_img_gray == True:ax2.imshow(converted_img, cmap="gray")else:ax2.imshow(converted_img)plt.show()#相機矯正使用opencv封裝好的api #目的:得到內參、外參、畸變系數 def cal_calibrate_params(file_paths):#存儲角點數據的坐標object_points = [] #角點在真實三維空間的位置image_points = [] #角點在圖像空間中的位置#生成角點在真實世界中的位置objp = np.zeros((nx*ny,3),np.float32)#以棋盤格作為坐標,每相鄰的黑白棋的相差1objp[:,:2] = np.mgrid[0:nx,0:ny].T.reshape(-1,2)#角點檢測for file_path in file_paths:img = cv2.imread(file_path)#將圖像灰度化gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#角點檢測rect,coners = cv2.findChessboardCorners(gray,(nx,ny),None)#角點檢測結果的繪制# imgcopy = img.copy()# cv2.drawChessboardCorners(imgcopy,(nx,ny),coners,rect)# plot_contrast_image(img,imgcopy)#若檢測到角點,則進行保存 即得到了真實坐標和圖像坐標if rect == True :object_points.append(objp)image_points.append(coners)# 相機較真ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(object_points, image_points, gray.shape[::-1], None, None)return ret, mtx, dist, rvecs, tvecs# 圖像去畸變:利用相機校正的內參,畸變系數 def img_undistort(img, mtx, dist):dis = cv2.undistort(img, mtx, dist, None, mtx)return disif __name__ == "__main__":ret, mtx, dist, rvecs, tvecs =cal_calibrate_params(file_paths)if np.all(mtx!=None):img = cv2.imread("test/test1.jpg")undistort_img = img_undistort(img,mtx,dist)plot_contrast_image(img,undistort_img)print("done")else:print("failed")

    總結

    以上是生活随笔為你收集整理的智慧交通day03-车道线检测实现03:相机校正和图像校正的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。