OpenCV實(shí)現(xiàn)相機(jī)校正
本文實(shí)例為大家分享了OpenCV實(shí)現(xiàn)相機(jī)校正的具體代碼,供大家參考,具體內(nèi)容如下
1. 相機(jī)標(biāo)定
根據(jù)張正友校正算法,利用棋盤(pán)格數(shù)據(jù)校正對(duì)車(chē)載相機(jī)進(jìn)行校正,計(jì)算其內(nèi)參矩陣,外參矩陣和畸變系數(shù)。
標(biāo)定的流程是:
- 準(zhǔn)備棋盤(pán)格數(shù)據(jù),即用于標(biāo)定的圖片
- 對(duì)每一張圖片提取角點(diǎn)信息
- 在棋盤(pán)上繪制提取到的角點(diǎn)(非必須,只是為了顯示結(jié)果)
- 利用提取的角點(diǎn)對(duì)相機(jī)進(jìn)行標(biāo)定
- 獲取相機(jī)的參數(shù)信息
2.關(guān)于相機(jī)校正用到的幾個(gè)API:
1、尋找棋盤(pán)圖中的棋盤(pán)角點(diǎn)
rect, corners = cv2.findChessboardCorners(image, pattern_size, flags)
參數(shù):
- Image: 輸入的棋盤(pán)圖,必須是8位的灰度或者彩色圖像
- Pattern_size:棋盤(pán)圖中每行每列的角點(diǎn)個(gè)數(shù)(內(nèi)角點(diǎn))。
- flags: 用來(lái)定義額外的濾波步驟以有助于尋找棋盤(pán)角點(diǎn)。所有的變量都可以單獨(dú)或者以邏輯或的方式組合使用。取值主要有:
CV_CALIB_CB_ADAPTIVE_THRESH :使用自適應(yīng)閾值(通過(guò)平均圖像亮度計(jì)算得到)將圖像轉(zhuǎn)換為黑白圖,而不是一個(gè)固定的閾值。
CV_CALIB_CB_NORMALIZE_IMAGE :在利用固定閾值或者自適應(yīng)的閾值進(jìn)行二值化之前,先使用cvNormalizeHist來(lái)均衡化圖像亮度。
CV_CALIB_CB_FILTER_QUADS :使用其他的準(zhǔn)則(如輪廓面積,周長(zhǎng),方形形狀)來(lái)去除在輪廓檢測(cè)階段檢測(cè)到的錯(cuò)誤方塊。
返回:
- Corners:檢測(cè)到的角點(diǎn)
- rect: 輸出是否找到角點(diǎn),找到角點(diǎn)返回1,否則返回0
2、檢測(cè)完角點(diǎn)之后可以將測(cè)到的角點(diǎn)繪制在圖像上,使用的API是:
cv2.drawChessboardCorners(img, pattern_size, corners, rect)
參數(shù):
- Img: 預(yù)繪制檢測(cè)角點(diǎn)的圖像
- pattern_size : 預(yù)繪制的角點(diǎn)的形狀
- corners: 角點(diǎn)矩陣
- rect: 表示是否所有的棋盤(pán)角點(diǎn)被找到,可以設(shè)置為findChessboardCorners的返回值
注意:如果發(fā)現(xiàn)了所有的角點(diǎn),那么角點(diǎn)將用不同顏色繪制(每行使用單獨(dú)的顏色繪制),并且把角點(diǎn)以一定順序用線連接起來(lái)。
3、利用定標(biāo)的結(jié)果計(jì)算內(nèi)外參數(shù)
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(object_points, image_points, image_size, None, None)
參數(shù):
- Object_points:世界坐標(biāo)系中的點(diǎn),在使用棋盤(pán)的場(chǎng)合,令z的坐標(biāo)值為0,而x,y坐標(biāo)用里面來(lái)度量,選用英寸單位,那么所有參數(shù)計(jì)算的結(jié)果也是用英寸表示。最簡(jiǎn)單的方式是定義棋盤(pán)的每一個(gè)方塊為一個(gè)單位。
- image_points:在圖像中尋找到的角點(diǎn)的坐標(biāo),包含object_points所提供的所有點(diǎn)
- image_size: 圖像的大小,以像素為衡量單位
返回:
- ret: 返回值
- mtx: 相機(jī)的內(nèi)參矩陣,大小為3*3的矩陣
- dist: 畸變系數(shù),為5*1大小的矢量
- rvecs: 旋轉(zhuǎn)變量
- tvecs: 平移變量
2.1 圖像去畸變
上一步中得到相機(jī)的內(nèi)參及畸變系數(shù),利用其進(jìn)行圖像的去畸變,最直接的方法就是調(diào)用opencv中的函數(shù)得到去畸變的圖像:
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)
參數(shù):
- Img: 要進(jìn)行校正的圖像
- mtx: 相機(jī)的內(nèi)參
- dist: 相機(jī)的畸變系數(shù)
返回:
- dst: 圖像校正后的結(jié)果
3. 相機(jī)校正
import cv2 import numpy as np import matplotlib.pyplot as plt import matplotlib.image as mpimg import glob def plot_contrast_imgs(origin_img, converted_img, origin_img_title="origin_img", converted_img_title="converted_img", converted_img_gray=False): """ 用于對(duì)比顯示兩幅圖像 """ fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 20)) ax1.set_title(origin_img_title) ax1.imshow(origin_img) ax2.set_title(converted_img_title) if converted_img_gray==True: ax2.imshow(converted_img, cmap="gray") else: ax2.imshow(converted_img) plt.show() # 1. 參數(shù)設(shè)定:定義棋盤(pán)橫向和縱向的角點(diǎn)個(gè)數(shù)并指定校正圖像的位置 nx = 9 ny = 6 file_paths = glob.glob("./camera_cal/calibration*.jpg") # 2. 計(jì)算相機(jī)的內(nèi)外參數(shù)及畸變系數(shù) def cal_calibrate_params(file_paths): object_points = [] # 三維空間中的點(diǎn):3D image_points = [] # 圖像空間中的點(diǎn):2d # 2.1 生成真實(shí)的交點(diǎn)坐標(biāo):類(lèi)似(0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)的三維點(diǎn) objp = np.zeros((nx * ny, 3), np.float32) objp[:, :2] = np.mgrid[0:nx, 0:ny].T.reshape(-1, 2) # 2.2 檢測(cè)每幅圖像角點(diǎn)坐標(biāo) for file_path in file_paths: img = cv2.imread(file_path) # 將圖像轉(zhuǎn)換為灰度圖 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 自動(dòng)檢測(cè)棋盤(pán)格內(nèi)4個(gè)棋盤(pán)格的角點(diǎn)(2白2黑的交點(diǎn)) rect, corners = cv2.findChessboardCorners(gray, (nx, ny), None) # 若檢測(cè)到角點(diǎn),則將其存儲(chǔ)到object_points和image_points if rect == True: object_points.append(objp) image_points.append(corners) # 2.3 獲取相機(jī)參數(shù) 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): """ 圖像去畸變 """ return cv2.undistort(img, mtx, dist, None, mtx) # 測(cè)試去畸變函數(shù)的效果 file_paths = glob.glob("./camera_cal/calibration*.jpg") ret, mtx, dist, rvecs, tvecs = cal_calibrate_params(file_paths) if mtx.any() != None: # a.any() or a.all() img = mpimg.imread("./camera_cal/calibration1.jpg") undistort_img = img_undistort(img, mtx, dist) plot_contrast_imgs(img, undistort_img) print("done!") else: print("failed")
執(zhí)行代碼:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
pytorch 實(shí)現(xiàn)多個(gè)Dataloader同時(shí)訓(xùn)練
這篇文章主要介紹了pytorch 實(shí)現(xiàn)多個(gè)Dataloader同時(shí)訓(xùn)練的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05python3使用print打印帶顏色的字符串代碼實(shí)例
這篇文章主要介紹了python3使用print打印帶顏色的字符串代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08python實(shí)現(xiàn)教務(wù)管理系統(tǒng)
這篇文章主要介紹了python實(shí)現(xiàn)教務(wù)管理系統(tǒng),實(shí)現(xiàn)了管理員、教職工、學(xué)生三種不同身份的操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03Python實(shí)現(xiàn)學(xué)生管理系統(tǒng)的代碼(JSON模塊)
這篇文章主要介紹了Python實(shí)現(xiàn)學(xué)生管理系統(tǒng)的代碼(JSON模塊),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Pandas實(shí)現(xiàn)復(fù)制dataframe中的每一行
這篇文章主要介紹了Pandas實(shí)現(xiàn)復(fù)制dataframe中的每一行方式,2024-02-02python 基于opencv實(shí)現(xiàn)圖像增強(qiáng)
這篇文章主要介紹了python 基于opencv實(shí)現(xiàn)圖像增強(qiáng)的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-12-12Python+Pygame實(shí)現(xiàn)簡(jiǎn)單的單詞小游戲
語(yǔ)言是一種藝術(shù),但是作為語(yǔ)言的基礎(chǔ)——詞匯,卻不像藝術(shù)那樣賞心悅目。不斷的記憶與復(fù)習(xí),讓詞匯成為很多孩子在學(xué)習(xí)英語(yǔ)時(shí),最難完全攻克的關(guān)卡。本文就來(lái)用Python制作一個(gè)簡(jiǎn)單的英語(yǔ)單詞游戲吧2023-03-03python出現(xiàn)"IndentationError: unexpected indent"錯(cuò)誤解決辦法
這篇文章主要介紹了python出現(xiàn)"IndentationError: unexpected indent"錯(cuò)誤解決辦法的相關(guān)資料,希望通過(guò)本文能解決遇到這樣的問(wèn)題,需要的朋友可以參考下2017-10-10