2023年一年內使用過三款深度相機用於機械人基於視覺的目標識別和測距,分別是小覓d1000-ir-120、巨芯、intel realsense d435(i) (d435i相對於d435來說增加了imu功能模組),時間久了容易忘記技術細節,現予以回顧記錄備忘。
目標識別當然是基於傳統的opencv影象處理技術來實現或者使用深度學習網路模型來實現,對於簡單的識別(目標和背景都非常單一)並且執行環境是嵌入式環境硬體資源非常有限,可以考慮使用opencv來實現即可,對於少複雜的物體識別,尤其背景複製干擾多的還是得使用深度學習模型,甚至還得輔助以其他手段確認,例如紅外、超聲等(對於測量目標是剛體的並且不關注其形狀和不需要識記,並且成本可以接受的話,直接使用雷射測距當然是最好最可靠的途徑)。 有時受限於要識別的目標是非剛體非固定輪廓外形等特殊性質,例如煙火霧之類的東西,只有使用視覺識別輔助以紅外等技術途徑,這時可使用深度攝像頭拍攝影象交給深度學習網路模型識別出目標,並根據目標在影象中的位置,讀取對應的深度圖資料獲得目標的距離,這是大致的技術思路,具體的實現細節涉及商業秘密不便多說。
在此通過三篇文章只介紹這三款深度相機的使用,三款深度相機的彩色和深度圖的解析度都支援常用的1280x720(解析度太小的話都知道模糊不清識別效果肯定差,解析度太大的話在進行模型訓練前最好根據影象本身情況和要識別的目標的情況先做合適預處理,不然可能會有問題,訓練效果差),對於三款深度相機的測距範圍,相機各自官方給出的資料是:
小覓d1000-ir-120: 0.32-7 m
巨芯雙目: 0.7-100 m
intel realsense d435(i): 0.1-10 m
無意對任何一款相機做誇大或貶損,只就本人實際使用的效果來說,在無環境光等干擾因素、可見度適中的前提下,感覺intel realsense d435(i)大約在0.5-10m範圍內測距比較準確,巨芯雙目相機在1.5-100m範圍內測距算準確度可以接受,小覓d1000-ir-120在0.6-7m範圍內測距表現不大穩定,有時算準確有時測距值離實際值差距較大。
深度相機的測距原理其實很簡單,利用相似三角形的知識計算即可,還沒找到合適的數學畫圖軟體,先借用網上的一張圖:
上圖中的 d=xl-xr (l,r為上標)即為雙目相機測距原理中說的視差disparity,f為相機焦距,t為雙目相機的基線長,z為要測的目標的距離,利用相似三角形的邊長比例關係,有 (t-d)/(z-f)=t/z,化簡可得
z=tf/d
這裡d為何是xl-xr,可能一下看不明白吧,其實這裡的xl和xr不是長度(絕對值),而是目標物體在左右相機裡的兩個成像點pl和pr相對於各自座標系的x軸方向的座標值,從圖上可見pl落在左邊相機的座標系(ol為原點)的yz平面的右側,所以xl為正值,pr則落在右邊相機的座標系統(or為原點)的yz平面的左側,xr為負值,簡單地說,就是pl落在左邊相機成像的右半邊裡,pr落在右邊相機的成像的左半邊裡,如果把這兩張圖疊放到一起,兩點之間的視差d(pl和pr之間的距離)自然等於 xl -xr咯。
深度相機的測距原理其實很簡單吧,有時計算原理很簡單,但是用數學公式一表示就弄得複雜了,深度學習裡的一些知識點也是這樣,說原理其實不複雜,用數學公式一寫,就一長串多種符號,讓人第一次看到時有點懵以為多高大上的深奧理論。其實我們直接使用深度相機而不是普通雙目相機來測距的話,也不用理解這個原理,因為一般相機的內部計算晶元輸出深度圖資料時都給你算好了,這也是使用深度相機的好處,當然你自己也可以使用不帶計算晶元的普通雙目相機成像後來自己計算距離,計算是需要你自己用**實現,占用了你的主機板的資源,而是計算十分頻繁,肯定要影響整個系統的效能了。
在使用深度相機時,深度相機輸出彩色圖同時輸出與之相匹的深度圖,多數相機直接給出個深度圖上各座標點上的深度(距離)值,也有的只給出視差值d,需要你自己計算一下深度值,比如巨芯相機就是這樣。
後面用三篇文章分別介紹這三款相機的使用。
我的AI之路
緒論 本章以西瓜為例子,簡單的介紹了機器學習的一些相關的概念,為之後的學習打下基礎。模型評估與選擇 學習筆記 機器學習之特徵工程 學習筆記 sklearn資料集與估計器 學習筆記 分類演算法 k近鄰演算法 學習筆記 分類演算法 樸素貝葉斯演算法 學習筆記 分類模型的評估 學習筆記 模型的選擇與調優 ...
我的AI學習之路 1
其實有多種方式搭建ai環境,有簡單環境 windows python pycharm 還有anaconda模式 注意python的版本,是32位還是64位的,選擇64位,如果32位會出現很多想不到的錯誤提示 二 安裝 numpy包 pip3 install numpy 如果pip3版本低了,會的提示...
我的學習記錄36
2017.11.15李錦浩 第36天 今天完成了前天未完成的程式,由於時間原因沒能挑食完成,可能還存在著一部分編譯問題,需要進一步找尋bug。另外今天學習了關於類的定義和知識。附 職工統計表 pragma once include using namespace std struct node vo...