国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

從雙目標(biāo)定到立體匹配:pyton實踐指南

這篇具有很好參考價值的文章主要介紹了從雙目標(biāo)定到立體匹配:pyton實踐指南。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

立體匹配是計算機視覺中的一個重要領(lǐng)域,旨在將從不同角度拍攝的圖像匹配起來,以創(chuàng)建類似人類視覺的3D效果。實現(xiàn)立體匹配的過程需要涉及許多步驟,包括雙目標(biāo)定、立體校正、視差計算等。在這篇文章中,將介紹如何使用Python實現(xiàn)立體匹配的基本步驟和技巧。

從雙目標(biāo)定到立體匹配:pyton實踐指南

下面的代碼實現(xiàn)了從相機標(biāo)定到立體匹配的完整流程,下面將分別介紹各個函數(shù)的參數(shù)和輸出。

標(biāo)定

首先,該程序需要用到以下庫:

numpy
cv2 (OpenCV)
os

在程序開頭,需要定義一些變量來存儲標(biāo)定圖片的路徑、棋盤格參數(shù)、角點坐標(biāo)等等。具體介紹如下:

path_left = "./data/left/"
path_right = "./data/right/"

path_left和path_right是左右相機標(biāo)定圖片文件夾的路徑。

CHESSBOARD_SIZE = (8, 11)
CHESSBOARD_SQUARE_SIZE = 15  # mm

CHESSBOARD_SIZE是棋盤格內(nèi)部角點的行列數(shù),CHESSBOARD_SQUARE_SIZE是棋盤格內(nèi)部每個小正方形的大?。▎挝粸楹撩祝?/p>

objp = np.zeros((CHESSBOARD_SIZE[0] * CHESSBOARD_SIZE[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:CHESSBOARD_SIZE[0], 0:CHESSBOARD_SIZE[1]].T.reshape(-1, 2) * CHESSBOARD_SQUARE_SIZE

objp是物理坐標(biāo)系下每個角點的三維坐標(biāo),即棋盤格的位置。該變量在后續(xù)的相機標(biāo)定以及立體匹配中都會被用到。

criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)

criteria是角點檢測的終止準(zhǔn)則,一般都使用這個默認(rèn)值。

img_list_left = sorted(os.listdir(path_left))
img_list_right = sorted(os.listdir(path_right))

img_list_left和img_list_right分別是左、右圖像的文件名列表,使用os.listdir()函數(shù)獲取。

obj_points = []
img_points_left = []
img_points_right = []

obj_points、img_points_left和img_points_right分別是存儲每個標(biāo)定圖片對應(yīng)的物理坐標(biāo)系下的角點坐標(biāo)、左相機的像素坐標(biāo)和右相機的像素坐標(biāo)。這些變量同樣在后續(xù)的相機標(biāo)定和立體匹配中用到。

接下來,程序讀取標(biāo)定圖片并檢測角點。對于每幅圖片,程序執(zhí)行以下操作:

img_l = cv2.imread(path_left + img_list_left[i])
img_r = cv2.imread(path_right + img_list_right[i])
gray_l = cv2.cvtColor(img_l, cv2.COLOR_BGR2GRAY)
gray_r = cv2.cvtColor(img_r, cv2.COLOR_BGR2GRAY)

首先讀取左右圖像,然后將它們轉(zhuǎn)換為灰度圖像。

ret_l, corners_l = cv2.findChessboardCorners(gray_l, CHESSBOARD_SIZE, None)
ret_r, corners_r = cv2.findChessboardCorners(gray_r, CHESSBOARD_SIZE, None)

通過OpenCV的cv2.findChessboardCorners()函數(shù)檢測左右圖像上的棋盤格角點。這個函數(shù)的參數(shù)包括:

image:需要檢測角點的灰度圖像。
patternSize:內(nèi)部角點的行列數(shù),即(CHESSBOARD_SIZE[1]-1, CHESSBOARD_SIZE[0]-1)。
corners:用于存儲檢測到的角點坐標(biāo)的數(shù)組。如果檢測失敗,則該參數(shù)為空(None)。
flags:檢測時使用的可選標(biāo)志。
這個函數(shù)的返回值包括:

ret:一個布爾值,用于指示檢測是否成功。如果檢測成功,則為True,否則為False。
corners:用于存儲檢測到的角點坐標(biāo)的數(shù)組。
接下來是亞像素級別的角點檢測。

cv2.cornerSubPix(gray_l, corners_l, (11, 11), (-1, -1), criteria)
cv2.cornerSubPix(gray_r, corners_r, (11, 11), (-1, -1), criteria)

這里使用了OpenCV的cv2.cornerSubPix()函數(shù)來進行亞像素級別的角點檢測。這個函數(shù)的參數(shù)包括:

image:輸入的灰度圖像。
corners:用于存儲檢測到的角點坐標(biāo)的數(shù)組。
winSize:每次迭代中搜索窗口的大小,即每個像素周圍的搜索范圍大小。
通常為11x11。
zeroZone:死區(qū)大小,表示怎樣的對稱性(如果有的話)不考慮。通常為(-1,-1)。
criteria:定義迭代停止的誤差范圍、迭代次數(shù)等標(biāo)準(zhǔn),和以上的criteria一樣。

img_points_left.append(corners_l)
img_points_right.append(corners_r)

如果檢測到了左右圖像上的角點,則將這些角點的坐標(biāo)存儲到img_points_left和img_points_right中。

cv2.drawChessboardCorners(img_l, CHESSBOARD_SIZE, corners_l, ret_l)
cv2.imshow("Chessboard Corners - Left", cv2.resize(img_l,(img_l.shape[1]//2,img_l.shape[0]//2)))
cv2.waitKey(50)

cv2.drawChessboardCorners(img_r, CHESSBOARD_SIZE, corners_r, ret_r)
cv2.imshow("Chessboard Corners - Right", cv2.resize(img_r,(img_r.shape[1]//2,img_r.shape[0]//2)))
cv2.waitKey(50)

從雙目標(biāo)定到立體匹配:pyton實踐指南
在圖片上標(biāo)出檢測到的角點,并在窗口中顯示。這里使用了cv2.drawChessboardCorners()函數(shù),該函數(shù)的參數(shù)包括:

img:需要標(biāo)定角點的圖像。
patternSize:內(nèi)部角點的行列數(shù),即(CHESSBOARD_SIZE[1]-1, CHESSBOARD_SIZE[0]-1)。
corners:存儲檢測到的角點坐標(biāo)的數(shù)組。
patternfound:檢測到角點的標(biāo)記,即ret。

程序接下來對雙目攝像機進行標(biāo)定。

ret_l, mtx_l, dist_l, rvecs_l, tvecs_l = cv2.calibrateCamera(obj_points, img_points_left, gray_l.shape[::-1],None,None)
ret_r, mtx_r, dist_r, rvecs_r, tvecs_r = cv2.calibrateCamera(obj_points, img_points_right, gray_r.shape[::-1],None,None)

flags = 0
flags |= cv2.CALIB_FIX_INTRINSIC
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
ret, M1, d1, M2, d2, R, T, E, F = cv2.stereoCalibrate(
    obj_points, img_points_left, img_points_right,
    mtx_l, dist_l, mtx_r, dist_r,
    gray_l.shape[::-1], criteria=criteria, flags=flags)

這段代碼首先對左右相機進行單獨標(biāo)定:

ret_l, mtx_l, dist_l, rvecs_l, tvecs_l = cv2.calibrateCamera(obj_points, img_points_left, gray_l.shape[::-1],None,None)
ret_r, mtx_r, dist_r, rvecs_r, tvecs_r = cv2.calibrateCamera(obj_points, img_points_right, gray_r.shape[::-1],None,None)

這里使用了OpenCV的cv2.calibrateCamera()函數(shù)對左右相機進行標(biāo)定。這個函數(shù)的參數(shù)包括:

objectPoints:每幅標(biāo)定圖片對應(yīng)的物理坐標(biāo)系下的角點坐標(biāo)。
imagePoints:每幅標(biāo)定圖片上檢測到的像素坐標(biāo)。
imageSize:標(biāo)定圖片的尺寸。
cameraMatrix:用于存儲標(biāo)定結(jié)果的內(nèi)參數(shù)矩陣。
distCoeffs:用于存儲標(biāo)定結(jié)果的畸變系數(shù)。
rvecs:每幅標(biāo)定圖片的外參數(shù)矩陣中的旋轉(zhuǎn)向量。
tvecs:每幅標(biāo)定圖片的外參數(shù)矩陣中的平移向量。
這個函數(shù)的返回值包括:

ret:一個標(biāo)志位,表示標(biāo)定是否成功。
cameraMatrix:用于存儲標(biāo)定結(jié)果的內(nèi)參數(shù)矩陣。
distCoeffs:用于存儲標(biāo)定結(jié)果的畸變系數(shù)。
rvecs:每幅標(biāo)定圖片的外參數(shù)矩陣中的旋轉(zhuǎn)向量。
tvecs:每幅標(biāo)定圖片的外參數(shù)矩陣中的平移向量。
然后對雙目攝像機進行標(biāo)定:

flags = 0
flags |= cv2.CALIB_FIX_INTRINSIC
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
ret, M1, d1, M2, d2, R, T, E, F = cv2.stereoCalibrate(
    obj_points, img_points_left, img_points_right,
    mtx_l, dist_l, mtx_r, dist_r,
    gray_l.shape[::-1], criteria=criteria, flags=flags)

這里使用了OpenCV的cv2.stereoCalibrate()函數(shù)進行雙目攝像機標(biāo)定。這個函數(shù)的參數(shù)包括:

objectPoints:每幅標(biāo)定圖片對應(yīng)的物理坐標(biāo)系下的角點坐標(biāo)。
imagePoints1:每幅標(biāo)定圖片的左相機上檢測到的像素坐標(biāo)。
imagePoints2:每幅標(biāo)定圖片的右相機上檢測到的像素坐標(biāo)。
cameraMatrix1:左相機的內(nèi)參數(shù)矩陣。
distCoeffs1:左相機的畸變系數(shù)。
cameraMatrix2:右相機的內(nèi)參數(shù)矩陣。
distCoeffs2:右相機的畸變系數(shù)。
imageSize:標(biāo)定圖片的尺寸。
criteria:定義迭代停止的誤差范圍、迭代次數(shù)等標(biāo)準(zhǔn)。
flags:標(biāo)定的可選標(biāo)志。
這個函數(shù)的返回值包括:

ret:一個標(biāo)志,表示標(biāo)定是否成功。
cameraMatrix1:左相機的內(nèi)參數(shù)矩陣。
distCoeffs1:左相機的畸變系數(shù)。
cameraMatrix2:右相機的內(nèi)參數(shù)矩陣。
distCoeffs2:右相機的畸變系數(shù)。
R:旋轉(zhuǎn)矩陣。
T:平移向量。
E:本質(zhì)矩陣。
F:基礎(chǔ)矩陣。

立體匹配

通過圖像標(biāo)定得到的參數(shù)進行立體匹配的整個流程,如下:

首先,我們需要讀取左右兩張圖像:

img_left = cv2.imread("./left.png")
img_right = cv2.imread("./right.png")

其中,“./left.png” 和 “./right.png” 是放置左右圖像的路徑。這兩幅圖像是未經(jīng)校正和矯正的圖像。

接下來,通過圖像標(biāo)定得到相機的參數(shù),根據(jù)得到的參數(shù),將圖像進行去畸變:

img_left_undistort = cv2.undistort(img_left, M1, d1)
img_right_undistort = cv2.undistort(img_right, M2, d2)

在上述代碼中,M1、M2、d1、d2 是從雙目相機標(biāo)定中獲得的參數(shù)。去畸變后的圖像 img_left_undistort 和 img_right_undistort 可供之后的操作使用。

然后,進行極線校正,以實現(xiàn)左右圖像在幾何上的一致性:

R1, R2, P1, P2, Q, roi1, roi2 = cv2.stereoRectify(M1, d1, M2, d2, (width, height), R, T, alpha=1)
map1x, map1y = cv2.initUndistortRectifyMap(M1, d1, R1, P1, (width, height), cv2.CV_32FC1)
map2x, map2y = cv2.initUndistortRectifyMap(M2, d2, R2, P2, (width, height), cv2.CV_32FC1)
img_left_rectified = cv2.remap(img_left_undistort, map1x, map1y, cv2.INTER_LINEAR)
img_right_rectified = cv2.remap(img_right_undistort, map2x, map2y, cv2.INTER_LINEAR)

其中,R、T 是雙目相機標(biāo)定得到的旋轉(zhuǎn)和平移矩陣, (width, height)是左右圖像的尺寸。R1、R2 是左右圖像的旋轉(zhuǎn)矩陣,P1、P2 是左右圖像的投影矩陣,Q 是視差轉(zhuǎn)換矩陣,roi1、roi2 是矯正后的圖像中可以使用的區(qū)域。

然后,將左右圖像拼接在一起以方便觀察:

img_stereo = cv2.hconcat([img_left_rectified, img_right_rectified])

從雙目標(biāo)定到立體匹配:pyton實踐指南

接下來,需要計算視差圖:

minDisparity = 0
numDisparities = 256
blockSize = 9
P1 = 1200
P2 = 4800
disp12MaxDiff = 10
preFilterCap = 63
uniquenessRatio = 5
speckleWindowSize = 100
speckleRange = 32
sgbm = cv2.StereoSGBM_create(minDisparity=minDisparity, numDisparities=numDisparities, blockSize=blockSize,
                             P1=P1, P2=P2, disp12MaxDiff=disp12MaxDiff, preFilterCap=preFilterCap,
                             uniquenessRatio=uniquenessRatio, speckleWindowSize=speckleWindowSize,
                             speckleRange=speckleRange, mode=cv2.STEREO_SGBM_MODE_SGBM_3WAY)

disparity = sgbm.compute(img_left_rectified,img_right_rectified)

上面的代碼塊定義了使用的視差算法的參數(shù),并使用了 SGBM(Semi Global Block Matching)算法計算了原始的視差圖。注意,由于使用的是16位的 SGBM 輸出,因此需要將它除以16。
從雙目標(biāo)定到立體匹配:pyton實踐指南
接下來,可以對視差圖進行 WLS 濾波,減少視差空洞:

# 定義 WLS 濾波參數(shù)
lambda_val = 4000
sigma_val = 1.5

# 運行 WLS 濾波
wls_filter = cv2.ximgproc.createDisparityWLSFilterGeneric(False)
wls_filter.setLambda(lambda_val)
wls_filter.setSigmaColor(sigma_val)
filtered_disp = wls_filter.filter(disparity, img_left_rectified,  None, img_right_rectified)
filtered_disp_nor = cv2.normalize(filtered_disp, filtered_disp, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)

上述代碼塊中,WLS 濾波為視差圖降噪,并進行平滑處理。 這里使用了 cv2.ximgproc.createDisparityWLSFilterGeneric 函數(shù),創(chuàng)建一個生成 WLS 濾波器的對象 wls_filter,然后設(shè)置了濾波參數(shù) lambda_val 和 sigma_val。filtered_disp 是經(jīng)過濾波后的視差圖。filtered_disp_nor 是經(jīng)過歸一化處理后的、用于顯示的視差圖。

最后,可以在窗口中顯示原始視差圖、預(yù)處理后的 WLS 濾波器的視差圖:

cv2.imshow("disparity", cv2.resize(disparity_nor,(disparity_nor.shape[1]//2,disparity_nor.shape[0]//2)))
cv2.imshow("filtered_disparity", cv2.resize(filtered_disp_nor,(filtered_disp_nor.shape[1]//2,filtered_disp_nor.shape[0]//2)))
cv2.waitKey()
cv2.destroyAllWindows()

從雙目標(biāo)定到立體匹配:pyton實踐指南

文章已經(jīng)同步更新在3D視覺工坊啦,原文鏈接如下:

從雙目標(biāo)定到立體匹配:Python實踐指南文章來源地址http://www.zghlxwxcb.cn/news/detail-500167.html

到了這里,關(guān)于從雙目標(biāo)定到立體匹配:pyton實踐指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 雙目立體匹配_StereoNet網(wǎng)絡(luò)

    雙目立體匹配_StereoNet網(wǎng)絡(luò)

    端到端立體匹配網(wǎng)絡(luò):通常以左右視圖作為輸入,經(jīng)卷積模塊提取特征后,按相關(guān)性操作(Correlation)或拼接操作(Concat)構(gòu)建代價體,最后根據(jù)代價體的維度進行不同的卷積操作,回歸出視差圖。 根據(jù)代價體維度的不同,可分為基于 3D 代價體和基于 4D 代價體的兩種方法, 2D 編碼

    2024年02月05日
    瀏覽(20)
  • 雙目立體匹配算法SGM步驟拆解

    雙目立體匹配算法SGM步驟拆解

    ????????立體匹配是立體視覺研究中的關(guān)鍵部分,其目標(biāo)是在兩個或多個視點中匹配相應(yīng)像素點,計算視差。雙目攝像頭類似人眼的工作原理,對同一目標(biāo)可以形成視差,用來感知三維世界,由于成本遠(yuǎn)低于激光雷達,因此在自動駕駛領(lǐng)域被廣泛研究。 ????????SGM(

    2024年02月07日
    瀏覽(27)
  • 【OpenCV】雙目相機標(biāo)定、極線矯正、SIFT匹配以及深度估計

    【OpenCV】雙目相機標(biāo)定、極線矯正、SIFT匹配以及深度估計

    雙目標(biāo)定有很多示例,就不多講,直接放代碼 有個小技巧就是可以先使用matlab標(biāo)定箱試一下,把誤差過大的左右相機圖片剔除,保證精度 匹配: 過濾: 這里過濾條件2需要注意一下 ,因為我們是進行了極線校正的,所以理論上左右視圖相同的點應(yīng)該在同一條水平線上,即像

    2024年02月07日
    瀏覽(29)
  • 雙目立體匹配中的極線約束(Epipolar Constraint),基礎(chǔ)矩陣(Fundamental Matrix),本質(zhì)矩陣(Essential Matrix),對極幾何(2D-2D)

    雙目立體匹配中的極線約束(Epipolar Constraint),基礎(chǔ)矩陣(Fundamental Matrix),本質(zhì)矩陣(Essential Matrix),對極幾何(2D-2D)

    考慮一個SLAM中一個常見的問題:如果兩個相機在不同位置拍攝同一個物體,或者一個運動的相機在不同時刻拍攝同一物體,我們有理由相信兩張圖片中各點存在著某種幾何關(guān)系,這種關(guān)系可以用對極幾何來描述。對極幾何描述了兩幀圖像中各像素的射影關(guān)系(或者說是各匹配

    2024年02月05日
    瀏覽(30)
  • 立體匹配入門指南(8):視差圖、深度圖、點云

    立體匹配入門指南(8):視差圖、深度圖、點云

    本篇是比較簡單的基礎(chǔ)概念,剛?cè)腴T的朋友可能是需要的。 視差圖 三維點云 首先,我們要介紹下這三個概念。 視差(disparity) 視差 d d d 等于同名點對在左視圖的列坐標(biāo)減去在右視圖上的列坐標(biāo),是 像素單位 d = x l ? x r d=x_l-x_r d = x l ? ? x r ? 立體視覺里,視差概念在極

    2023年04月08日
    瀏覽(62)
  • 雙目立體視覺:SAD算法

    雙目立體視覺:SAD算法

    SAD(Sum of absolute differences)是一種圖像匹配算法。基本思想:差的絕對值之和。此算法常用于圖像塊匹配,將每個像素對應(yīng)數(shù)值之差的絕對值求和,據(jù)此評估兩個圖像塊的相似度。該算法快速、但并不精確,通常用于多級處理的初步篩選。 常見的立體匹配算法主要包括以下四步

    2024年02月06日
    瀏覽(18)
  • 雙目立體視覺空間坐標(biāo)精度分析

    雙目立體視覺空間坐標(biāo)精度分析

    參考鏈接:https://zhuanlan.zhihu.com/p/362718946 本文主要參考鏈接博主的理論推導(dǎo),并按照自己的理解作分析和修正 雙目立體視覺系統(tǒng)的精度由那些因素決定? X/Y/Z三個方向的精度都是一樣的嗎?如果不是一樣,哪個方向精度更好呢? 最常見的情況下,雙目立體視覺的最終輸出是

    2024年02月10日
    瀏覽(23)
  • 雙目立體視覺(一) 基本原理和步驟

    雙目立體視覺(一) 基本原理和步驟

    目錄 一、雙目立體視覺系統(tǒng)的四個基本步驟 二、各步驟原理 1、相機標(biāo)定 2、立體校正 3、立體匹配 相機標(biāo)定 主要包含兩部分內(nèi)容: 單相機的內(nèi)參標(biāo)定和雙目相機的外參標(biāo)定,前者可以獲得每個相機的焦距、光心、畸變系數(shù)等參數(shù),后者可以獲得雙目相機之間的相機坐標(biāo)系的

    2024年02月14日
    瀏覽(31)
  • 雙目測距--3 雙目標(biāo)定

    雙目測距--3 雙目標(biāo)定

    目錄 -1 流程說明: 0 幾個重要 函數(shù) 1、calibrateCamera()函數(shù) 2、stereoCalibrate() 3、findChessboardCorners() 棋盤格角點檢測 4、stereoRectify() 5、initUndistortRectifyMap() 6、remap()? 1、用于標(biāo)定的圖像 ?2、標(biāo)定前 3、OpenCV進行雙目標(biāo)定 單目標(biāo)定 calibration.h 雙目標(biāo)定 doule--camera--calibration.h 主函數(shù)

    2024年02月09日
    瀏覽(20)
  • 計算機視覺之三維重建(5)---雙目立體視覺

    計算機視覺之三維重建(5)---雙目立體視覺

    ?如下圖即是一個平行視圖。特點:(1) 兩個平面平行。 (2) 基線平行于圖像平面,極點 e e e 和 e ′ e\\\' e ′ 位于無窮遠(yuǎn)處。 ?1. 對于基礎(chǔ)矩陣我們有另一個表達式: F = e ′ × K ′ R K ? 1 F=e\\\'×K\\\'RK^{?1} F = e ′ × K ′ R K ? 1 ,推導(dǎo)過程如下所示。 ?2. 在平行視圖情況下,極點

    2024年04月12日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包