電腦視覺中的立體視覺和深度感知及範例

WBOY
發布: 2023-11-21 08:21:38
轉載
1198 人瀏覽過

在人工智慧和影像處理的迷人世界中,這些概念在使機器能夠像我們的眼睛一樣感知我們周圍的三維世界中起著關鍵作用。和我們一起探索立體視覺和深度感知背後的技術,揭示電腦如何從二維圖像中獲得深度、距離和空間理解的秘密。

電腦視覺中的立體視覺和深度感知及範例

立體視覺和深度感知在電腦視覺中具體指的是什麼?

立體視覺和深度感知是電腦視覺領域中的重要概念,其目的是模仿人類從視覺訊息中感知深度和三維結構的能力。這些概念通常被應用於機器人技術、自動駕駛汽車和擴增實境等領域

立體視覺

立體視覺,也稱為立體視或雙眼視覺,是一種透過捕捉和分析稍微分開放置的兩個或多個攝影機的影像來感知場景深度的技術,模仿了人眼的工作方式。

立體視覺背後的基本原理是三角測量。當兩個攝影機(或「立體攝影機」)從稍微不同的視點捕捉相同場景的影像時,產生的影像對稱為立體對,其中包含兩個影像中對應點的位置差異或差異。

透過分析這些差異,電腦視覺系統可以計算場景中物體的深度資訊。靠近相機的物體將具有較大的差異,而遠離攝影機的物體將具有較小的差異。

立體視覺演算法通常包括特徵匹配、差異映射和極線幾何等技術,用於計算深度圖或場景的3D表示

深度感知

在電腦視覺中,深度感知是指系統能夠從單一或多個2D影像或視訊影格中理解並估計3D場景中物體的距離能力

實現深度感知的方法不僅限於立體視覺,還可以採用其他途徑,包括:

  • 單眼線索:這些是可以在單一相機或影像中感知的深度線索。例如,透視、紋理梯度、陰影和遮蔽等範例。即使在沒有立體視覺的情況下,這些線索也可以幫助估算深度。
  • LiDAR(光探測與測距):LiDAR感測器使用雷射光束來測量場景中物體的距離,提供點雲形式的精確深度資訊。這些資訊可以與視覺數據融合,以獲得更準確的深度感知。
  • 結構光:結構光涉及將已知圖案投射到場景上,並分析該圖案在場景中的物體上的變形。這種變形可用於計算深度資訊。
  • 飛行時間(ToF)相機:ToF相機測量光線從物體反射並返回相機所需的時間。這些資訊用於估算深度。

在電腦視覺應用中,深度感知對於避免障礙物、辨識物件、進行3D重建和理解場景等任務至關重要

#電腦視覺中的立體視覺和深度感知組件

  • 立體攝影機:立體視覺依賴於兩個或多個相機(立體相機),這些相機相距已知的距離放置。這些相機從稍微不同的視點捕捉相同場景的影像,模擬人眼感知深度的方式。
  • 影像擷取:相機擷取場景的影像或影片畫面。這些影像通常被稱為左影像(來自左相機)和右影像(來自右相機)。
  • 校準:為了準確計算深度訊息,必須對立體攝影機進行校準。這個過程涉及確定攝影機參數,如內在矩陣、畸變係數和外在參數(攝影機之間的旋轉和平移)。校準確保來自兩台相機的影像能夠正確進行校正和匹配。
  • 校正:校正是套用於擷取的影像的幾何變換,以對齊極線上的對應特徵。這透過使差異更可預測來簡化立體匹配過程。
  • 立體匹配:立體匹配是在左側影像和右影像之間找到對應點或匹配點的過程。用於計算每個像素的差異的像素值稱為差異,表示影像中特徵的水平偏移。有各種立體匹配演算法可供選擇,包括區塊匹配、半全域匹配和圖割,用於找到這些對應點。

  • 差異圖:差異圖是一幅灰階影像,其中每個像素的強度值對應於場景中該點的差異或深度。靠近相機的物體具有較大的差異,而遠離相機的物體具有較小的差異。
  • 深度圖:深度圖是透過使用已知的基線(相機之間的距離)和相機的焦距來從差異圖中導出的。它計算每個像素的實際世界單位(例如米)的深度,而不是差異。
  • 視覺化:深度和差異圖通常被視覺化,以提供場景的3D結構的可讀人類表示。這些圖可以顯示為灰階影像,也可以轉換為點雲以進行3D視覺化。
  • 一些硬體:除了相機外,還可以使用深度感知相機(例如Microsoft Kinect、Intel RealSense)或LiDAR(光偵測與測距)感測器等專用硬體來取得深度資訊。這些感測器直接提供深度,無需立體匹配。

電腦視覺中的立體視覺和深度感知Python範例實作:

import cv2import 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 = 640height = 480left_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 mapsR1, 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 camerasret1, 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 framesleft_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 grayscaleleft_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 visualizationdisparity_normalized = cv2.normalize(disparity, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)# Display the disparity mapcv2.imshow(‘Disparity Map’, disparity_normalized)if cv2.waitKey(1) & 0xFF == ord(‘q’):break# Release resourcesleft_camera.release()right_camera.release()cv2.destroyAllWindows()
登入後複製

注意:對於立體攝影機設置,需要進行攝影機校準,並儲存校準資料在.yml檔案中,將路徑放入範例程式碼中。

應用程式

利用深度資訊進行目標檢測和跟踪,實現更精確的定位和識別。 利用深度資訊進行虛擬實境和擴增實境應用,使用戶能夠與虛擬環境進行更真實的互動。 利用深度資訊進行人臉辨識和表情分析,提高人臉辨識的準確性和穩健性。 利用深度資訊進行三維重建和建模,產生真實感覺的三維場景。 利用深度資訊進行姿態估計與行為分析,以實現更精確的動作辨識與行為理解。 利用深度資訊進行自動駕駛和機器人導航,提高智慧交通和自動化領域的安全性和效率

  • #3D場景重建
  • 物件偵測與追蹤
  • 機器人和車輛的自主導航
  • 擴增實境與虛擬實境
  • 手勢辨識

限制

##以下是一些重要的限制:

    依賴相機校準:立體視覺系統需要對所使用的攝影機進行精確的校準。準確的校準對於確保深度資訊的正確計算至關重要。校準中的任何錯誤都可能導致深度感知不準確。
  • 有限的視野範圍:立體視覺系統的視野範圍有限,基於兩個攝影機之間的基線距離。這可能導致盲點或在兩個攝影機視場之外的物體的感知困難。
  • 沒有紋理和特徵的表面:立體匹配演算法依賴在左右影像中找到對應的特徵。缺乏紋理或獨特特徵的表面,如光滑的牆壁或均勻的背景,可能難以準確匹配,導致深度估計錯誤。
  • 遮擋:在場景中相互遮蔽的物件可能會對立體視覺造成困難。當一個物件部分遮蔽另一個物件時,確定被遮蔽區域的深度可能會有問題。
  • 有限的範圍和解析度:隨著距離攝影機的增加,使用立體視覺感知深度的準確性會減少。此外,深度測量的分辨率隨著距離的增加而減小,使遠處物體的細節難以感知。
  • 對光照條件敏感:光照條件的變化,如環境光的變化或陰影,可能會影響立體視覺的準確性。不一致的光照條件可能會使左右影像之間的對應關係難以找到。
  • 運算資源:立體匹配演算法可能需要大量運算資源,特別是在處理高解析度影像或即時視訊串流時。即時應用可能需要強大的硬體來進行高效處理。
  • 成本和複雜性:設置帶有校準攝影機的立體視覺系統可能會昂貴且耗時。硬體需求,包括攝影機和校準設備,可能會成為某些應用的障礙。
  • 透明或反光物體的不準確性:透明或高反射表面可能會導致立體視覺中的錯誤,因為這些材料可能不會以適合深度感知的方式反射光線。
  • 動態場景:立體視覺假定在影像捕捉期間場景是靜態的。在具有移動物件或攝影機運動的動態場景中,維護左右影像之間的對應關係可能會很具有挑戰性,導致深度估計不準確。
  • 有限的戶外使用:立體視覺系統在明亮陽光下的戶外環境或缺乏紋理的場景中可能會遇到困難,例如晴朗的天空。

總而言之,電腦視覺中的立體視覺和深度感知為機器與理解我們環境的三維豐富性互動開啟了新的可能性。正如我們在本文中所討論的,這些技術是各種應用的核心,包括機器人和自動駕駛車輛,擴增實境和醫學成像等領域

以上是電腦視覺中的立體視覺和深度感知及範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:51cto.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!