在人工智能和圖像處理的迷人世界中,這些概念在使機(jī)器能夠像我們的眼睛一樣感知我們周圍的三維世界中起著關(guān)鍵作用。和我們一起探索立體視覺和深度感知背后的技術(shù),揭示計算機(jī)如何從二維圖像中獲得深度、距離和空間理解的秘密。
計算機(jī)視覺中的立體視覺和深度感知是什么?
立體視覺和深度感知是計算機(jī)視覺中的重要概念,旨在模仿人類從視覺信息中感知深度和三維結(jié)構(gòu)的能力。它們通常用于機(jī)器人技術(shù)、自動駕駛汽車和增強(qiáng)現(xiàn)實等應(yīng)用中。
立體視覺
立體視覺,也稱為立體視或雙目視覺,是一種通過捕獲和分析稍微分開放置的兩個或多個攝像頭的圖像來感知場景深度的技術(shù),模仿了人眼的工作方式。
立體視覺背后的基本原理是三角測量。當(dāng)兩個攝像頭(或“立體攝像頭”)從稍微不同的視點捕獲相同場景的圖像時,生成的圖像對稱為立體對,其中包含兩個圖像中相應(yīng)點的位置差異或差異。
通過分析這些差異,計算機(jī)視覺系統(tǒng)可以計算場景中物體的深度信息。靠近攝像頭的物體將具有較大的差異,而遠(yuǎn)離攝像頭的物體將具有較小的差異。
立體視覺算法通常涉及諸如特征匹配、差異映射和極線幾何等技術(shù),以計算深度圖或場景的3D表示。
深度感知
計算機(jī)視覺中的深度感知是指系統(tǒng)能夠從單個或多個2D圖像或視頻幀中理解和估計3D場景中物體的距離能力。
除了立體視覺外,深度感知可以使用其他方法實現(xiàn),包括:
單眼線索:這些是可以在單個攝像頭或圖像中感知的深度線索。例如,透視、紋理梯度、陰影和遮擋等示例。即使在沒有立體視覺的情況下,這些線索也可以幫助估算深度。
LiDAR(光探測與測距):LiDAR傳感器使用激光束來測量場景中物體的距離,提供點云形式的精確深度信息。這些信息可以與視覺數(shù)據(jù)融合,以獲得更準(zhǔn)確的深度感知。
結(jié)構(gòu)光:結(jié)構(gòu)光涉及將已知圖案投射到場景上,并分析該圖案在場景中的物體上的變形。這種變形可用于計算深度信息。
飛行時間(ToF)攝像頭:ToF攝像頭測量光線從物體反射并返回到攝像頭所需的時間。這些信息用于估算深度。
在計算機(jī)視覺應(yīng)用中,深度感知對于障礙物避免、物體識別、3D重建和場景理解等任務(wù)至關(guān)重要。
計算機(jī)視覺中的立體視覺和深度感知組件
立體攝像頭:立體視覺依賴于兩個或多個相機(jī)(立體攝像頭),這些相機(jī)相距已知的距離放置。這些相機(jī)從稍微不同的視點捕獲相同場景的圖像,模擬人眼感知深度的方式。
圖像捕獲:相機(jī)捕獲場景的圖像或視頻幀。這些圖像通常被稱為左圖像(來自左相機(jī))和右圖像(來自右相機(jī))。
校準(zhǔn):為了準(zhǔn)確計算深度信息,必須對立體攝像頭進(jìn)行校準(zhǔn)。這個過程涉及確定攝像頭參數(shù),如內(nèi)在矩陣、畸變系數(shù)和外在參數(shù)(攝像頭之間的旋轉(zhuǎn)和平移)。校準(zhǔn)確保來自兩個相機(jī)的圖像能夠正確進(jìn)行校正和匹配。
校正:校正是應(yīng)用于捕獲的圖像的幾何變換,以對齊極線上的相應(yīng)特征。這通過使差異更可預(yù)測來簡化立體匹配過程。
立體匹配:立體匹配是在左圖像和右圖像之間找到對應(yīng)點或匹配點的過程。用于計算每個像素的差異的像素值被稱為差異,表示圖像中特征的水平偏移。有各種立
體匹配算法可供選擇,包括塊匹配、半全局匹配和圖割,用于找到這些對應(yīng)點。
差異圖:差異圖是一幅灰度圖像,其中每個像素的強(qiáng)度值對應(yīng)于場景中該點的差異或深度。靠近相機(jī)的物體具有較大的差異,而遠(yuǎn)離相機(jī)的物體具有較小的差異。
深度圖:深度圖是通過使用已知的基線(相機(jī)之間的距離)和相機(jī)的焦距來從差異圖中導(dǎo)出的。它計算每個像素的實際世界單位(例如米)的深度,而不是差異。
可視化:深度和差異圖通??梢暬?,以提供場景的3D結(jié)構(gòu)的可讀人類表示。這些圖可以顯示為灰度圖像,也可以轉(zhuǎn)換為點云以進(jìn)行3D可視化。
一些硬件:除了攝像頭外,還可以使用深度感知攝像頭(例如Microsoft Kinect、Intel RealSense)或LiDAR(光探測與測距)傳感器等專用硬件來獲取深度信息。這些傳感器直接提供深度,無需立體匹配。
計算機(jī)視覺中的立體視覺和深度感知Python示例實現(xiàn)
import cv2 import numpy as np # Create two video capture objects for left and right cameras (adjust device IDs as needed) left_camera = cv2.VideoCapture(0) right_camera = cv2.VideoCapture(1) # Set camera resolution (adjust as needed) width = 640 height = 480 left_camera.set(cv2.CAP_PROP_FRAME_WIDTH, width) left_camera.set(cv2.CAP_PROP_FRAME_HEIGHT, height) right_camera.set(cv2.CAP_PROP_FRAME_WIDTH, width) right_camera.set(cv2.CAP_PROP_FRAME_HEIGHT, height) # Load stereo calibration data (you need to calibrate your stereo camera setup first) stereo_calibration_file = ‘stereo_calibration.yml’ calibration_data = cv2.FileStorage(stereo_calibration_file, cv2.FILE_STORAGE_READ) if not calibration_data.isOpened(): print(“Calibration file not found.”) exit() camera_matrix_left = calibration_data.getNode(‘cameraMatrixLeft’).mat() camera_matrix_right = calibration_data.getNode(‘cameraMatrixRight’).mat() distortion_coeff_left = calibration_data.getNode(‘distCoeffsLeft’).mat() distortion_coeff_right = calibration_data.getNode(‘distCoeffsRight’).mat() R = calibration_data.getNode(‘R’).mat() T = calibration_data.getNode(‘T’).mat() calibration_data.release() # Create stereo rectification maps R1, R2, P1, P2, Q, _, _ = cv2.stereoRectify( camera_matrix_left, distortion_coeff_left, camera_matrix_right, distortion_coeff_right, (width, height), R, T ) left_map1, left_map2 = cv2.initUndistortRectifyMap( camera_matrix_left, distortion_coeff_left, R1, P1, (width, height), cv2.CV_32FC1 ) right_map1, right_map2 = cv2.initUndistortRectifyMap( camera_matrix_right, distortion_coeff_right, R2, P2, (width, height), cv2.CV_32FC1 ) while True: # Capture frames from left and right cameras ret1, left_frame = left_camera.read() ret2, right_frame = right_camera.read() if not ret1 or not ret2: print(“Failed to capture frames.”) break # Undistort and rectify frames left_frame_rectified = cv2.remap(left_frame, left_map1, left_map2, interpolation=cv2.INTER_LINEAR) right_frame_rectified = cv2.remap(right_frame, right_map1, right_map2, interpolation=cv2.INTER_LINEAR) # Convert frames to grayscale left_gray = cv2.cvtColor(left_frame_rectified, cv2.COLOR_BGR2GRAY) right_gray = cv2.cvtColor(right_frame_rectified, cv2.COLOR_BGR2GRAY) # Perform stereo matching to calculate depth map (adjust parameters as needed) stereo = cv2.StereoBM_create(numDisparities=16, blockSize=15) disparity = stereo.compute(left_gray, right_gray) # Normalize the disparity map for visualization disparity_normalized = cv2.normalize(disparity, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U) # Display the disparity map cv2.imshow(‘Disparity Map’, disparity_normalized) if cv2.waitKey(1) & 0xFF == ord(‘q’): break # Release resources left_camera.release() right_camera.release() cv2.destroyAllWindows()
注意:對于立體攝像頭設(shè)置,需要進(jìn)行攝像頭校準(zhǔn),并保存校準(zhǔn)數(shù)據(jù)在.yml文件中,將路徑放入示例代碼中。
應(yīng)用
通過立體視覺和深度感知獲得的深度信息可以用于各種計算機(jī)視覺應(yīng)用,包括:
3D場景重建
物體檢測和跟蹤
機(jī)器人和車輛的自主導(dǎo)航
增強(qiáng)現(xiàn)實和虛擬現(xiàn)實
手勢識別
限制
以下是一些主要的限制:
依賴于相機(jī)校準(zhǔn):立體視覺系統(tǒng)需要對所使用的攝像機(jī)進(jìn)行精確的校準(zhǔn)。準(zhǔn)確的校準(zhǔn)對于確保深度信息的正確計算至關(guān)重要。校準(zhǔn)中的任何錯誤都可能導(dǎo)致深度感知不準(zhǔn)確。
有限的視場范圍:立體視覺系統(tǒng)的視場范圍有限,基于兩個攝像機(jī)之間的基線距離。這可能導(dǎo)致盲區(qū)或在兩個攝像機(jī)視場之外的對象的感知困難。
沒有紋理和特征的表面:立體匹配算法依賴于在左右圖像中找到對應(yīng)的特征。缺乏紋理或獨特特征的表面,如光滑的墻壁或均勻的背景,可能難以準(zhǔn)確匹配,導(dǎo)致深度估計錯誤。
遮擋:在場景中相互遮擋的對象可能會對立體視覺造成困難。當(dāng)一個對象部分遮擋另一個對象時,確定被遮擋區(qū)域的深度可能會有問題。
有限的范圍和分辨率:隨著距離攝像機(jī)的增加,使用立體視覺感知深度的準(zhǔn)確性會減小。此外,深度測量的分辨率隨著距離的增加而減小,使遠(yuǎn)處物體的細(xì)節(jié)難以感知。
對光照條件敏感:光照條件的變化,如環(huán)境光的變化或陰影,可能會影響立體視覺的準(zhǔn)確性。不一致的光照條件可能會使左右圖像之間的對應(yīng)關(guān)系難以找到。
計算資源:立體匹配算法可能需要大量計算資源,特別是在處理高分辨率圖像或?qū)崟r視頻流時。實時應(yīng)用可能需要強(qiáng)大的硬件來進(jìn)行高效處理。
成本和復(fù)雜性:設(shè)置帶有校準(zhǔn)攝像機(jī)的立體視覺系統(tǒng)可能會昂貴且耗時。硬件要求,包括攝像機(jī)和校準(zhǔn)設(shè)備,可能會成為某些應(yīng)用的障礙。
透明或反光物體的不準(zhǔn)確性:透明或高反射表面可能會導(dǎo)致立體視覺中的錯誤,因為這些材料可能不會以適合深度感知的方式反射光線。
動態(tài)場景:立體視覺假定在圖像捕捉期間場景是靜態(tài)的。在具有移動對象或攝像機(jī)運動的動態(tài)場景中,維護(hù)左右圖像之間的對應(yīng)關(guān)系可能會很具挑戰(zhàn)性,導(dǎo)致深度估計不準(zhǔn)確。
有限的戶外使用:立體視覺系統(tǒng)在明亮陽光下的戶外環(huán)境或缺乏紋理的場景中可能會遇到困難,如晴朗的天空。
總之,計算機(jī)視覺中的立體視覺和深度感知為機(jī)器與理解我們環(huán)境的三維豐富性互動打開了新的可能性。正如我們在本文中所探討的,這些技術(shù)是從機(jī)器人和自動駕駛車輛到增強(qiáng)現(xiàn)實和醫(yī)學(xué)成像等各種應(yīng)用的核心。
編輯:黃飛
-
圖像處理
+關(guān)注
關(guān)注
27文章
1327瀏覽量
57958 -
人工智能
+關(guān)注
關(guān)注
1806文章
48967瀏覽量
248638 -
立體視覺
+關(guān)注
關(guān)注
0文章
38瀏覽量
9929 -
計算機(jī)視覺
+關(guān)注
關(guān)注
9文章
1708瀏覽量
46726 -
python
+關(guān)注
關(guān)注
56文章
4826瀏覽量
86579
原文標(biāo)題:計算機(jī)視覺中的立體視覺和深度感知及示例
文章出處:【微信號:vision263com,微信公眾號:新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
如何通過立體視覺構(gòu)建小巧輕便的深度感知系統(tǒng)

雙目立體視覺原理大揭秘(二)
基于立體視覺的變形測量
雙目立體視覺的運用
匯總 |計算機(jī)視覺系統(tǒng)學(xué)習(xí)資料下載 精選資料分享
深度學(xué)習(xí)與傳統(tǒng)計算機(jī)視覺簡介
雙目立體視覺在嵌入式中有何應(yīng)用
圖像處理基本算法-立體視覺
計算機(jī)視覺與機(jī)器視覺區(qū)別
雙相機(jī)立體視覺和結(jié)構(gòu)光立體視覺原理及優(yōu)勢對比
使用雙目立體視覺實現(xiàn)CCD測距系統(tǒng)設(shè)計的資料說明

雙目立體計算機(jī)視覺的立體匹配研究綜述

雙目立體視覺深度測量步驟介紹
關(guān)于雙目立體視覺的三大基本算法及發(fā)展現(xiàn)狀

評論