人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

OpenCV實現(xiàn)相機(jī)校正

發(fā)布日期:2022-08-01 14:22 | 文章來源:腳本之家

本文實例為大家分享了OpenCV實現(xiàn)相機(jī)校正的具體代碼,供大家參考,具體內(nèi)容如下

1. 相機(jī)標(biāo)定

根據(jù)張正友校正算法,利用棋盤格數(shù)據(jù)校正對車載相機(jī)進(jìn)行校正,計算其內(nèi)參矩陣,外參矩陣和畸變系數(shù)。

標(biāo)定的流程是:

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

2.關(guān)于相機(jī)校正用到的幾個API:

1、尋找棋盤圖中的棋盤角點

rect, corners = cv2.findChessboardCorners(image, pattern_size, flags)

參數(shù):

  • Image: 輸入的棋盤圖,必須是8位的灰度或者彩色圖像
  • Pattern_size:棋盤圖中每行每列的角點個數(shù)(內(nèi)角點)。
  • flags: 用來定義額外的濾波步驟以有助于尋找棋盤角點。所有的變量都可以單獨(dú)或者以邏輯或的方式組合使用。取值主要有:

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

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

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

返回:

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

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

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

參數(shù):

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

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

3、利用定標(biāo)的結(jié)果計算內(nèi)外參數(shù)

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

參數(shù):

  • Object_points:世界坐標(biāo)系中的點,在使用棋盤的場合,令z的坐標(biāo)值為0,而x,y坐標(biāo)用里面來度量,選用英寸單位,那么所有參數(shù)計算的結(jié)果也是用英寸表示。最簡單的方式是定義棋盤的每一個方塊為一個單位。
  • image_points:在圖像中尋找到的角點的坐標(biāo),包含object_points所提供的所有點
  • 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):
 """
 用于對比顯示兩幅圖像
 """
 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è)定:定義棋盤橫向和縱向的角點個數(shù)并指定校正圖像的位置
nx = 9
ny = 6
file_paths = glob.glob("./camera_cal/calibration*.jpg")
# 2. 計算相機(jī)的內(nèi)外參數(shù)及畸變系數(shù)
def cal_calibrate_params(file_paths):
 object_points = []  # 三維空間中的點:3D
 image_points = []# 圖像空間中的點:2d
 # 2.1 生成真實的交點坐標(biāo):類似(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 檢測每幅圖像角點坐標(biāo)
 for file_path in file_paths:
  img = cv2.imread(file_path)
  # 將圖像轉(zhuǎn)換為灰度圖
  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  # 自動檢測棋盤格內(nèi)4個棋盤格的角點(2白2黑的交點)
  rect, corners = cv2.findChessboardCorners(gray, (nx, ny), None)
  # 若檢測到角點,則將其存儲到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)
# 測試去畸變函數(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í)行代碼:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持本站。

香港服務(wù)器租用

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部