- RealSenseTM互動開發(fā)實戰(zhàn)
- 王曰海 湯振宇 吳新天
- 1063字
- 2019-01-03 00:39:36
2.5 坐標系統(tǒng)
SDK使用兩種坐標系統(tǒng)定義:圖像坐標系和攝像頭坐標系。
1.圖像坐標系
像素的位置坐標指的是在彩色或深度圖片中像素所在的位置(x,y),其中x為0~w-1(w是圖像的寬度),y為0~h-1(h是圖像高度),如圖2-8所示。從攝像頭視圖來看,原點(0,0)在左上角,x軸指向右,y軸指向下。

圖2-8 圖像坐標系
2.攝像頭坐標系
攝像頭坐標系中的坐標是三維坐標(x,y,z),原點(0,0,0)在深度攝像頭的中心。如果沒有特別指定,則坐標單位默認為米。
對于前置攝像頭(攝像頭面向用戶),默認的坐標系統(tǒng)被定義為x軸指向右側(cè)(攝像頭視圖),y軸向上,z軸面朝用戶,這也被稱為“左手系”,如圖2-9所示。攝像頭坐標系的定義并沒有改變攝像頭的鏡像模式。

圖2-9 攝像頭坐標系
對于后置攝像頭(攝像頭朝著場景),默認的坐標系統(tǒng)是右手系統(tǒng):x坐標軸指向用戶的右側(cè),y軸向上,z軸朝向用戶,如圖2-10所示。參考系不改變攝像頭的鏡像模式。如無特殊規(guī)定,坐標的單位為米。

圖2-10 后置攝像頭默認坐標系
對于后置攝像頭的另一種坐標定義方法是OpenCV攝像頭坐標系。OpenCV攝像頭坐標系定義為x軸指向攝像頭的右側(cè),y軸朝下的場景,如圖2-11所示。

圖2-11 OpenCV攝像頭坐標系
3.配置坐標系
在SDK的會話初始化時,SDK設(shè)置坐標系為默認值。可以使用QueryCoordinateSystem函數(shù)來獲取當(dāng)前坐標系統(tǒng)設(shè)置。該函數(shù)返回一個包含前置和后置攝像頭的坐標系的位掩模。因此,如果需要對特定的攝像頭方向檢查坐標位掩模,可以參考例2-19。
例2-19 檢查后置攝像頭坐標系
//創(chuàng)建一個SenseManager實例 PXCMSenseManagersm=PXCMSenseManager.CreateInstance(); //得到坐標系設(shè)定 PXCMSession session=sm.QuerySession(); EnumSet<PXCMSession.CoordinateSystem>cs=session.QueryCoordinateSystem(); //檢查后置攝像頭坐標系 if (cs.contains(PXCMSession.CoordinateSystem.COORDINATE_SYSTEM_OPENCV)) { ...... } //清理 sm.close();
可以使用SetCoordinatesystem功能來改變坐標系統(tǒng)設(shè)置。每個SDK模塊在模塊的初始化過程中讀取坐標系設(shè)置。必須在SDK模塊或算法進行初始化時設(shè)置坐標系統(tǒng),以確保模塊工作在相同的坐標系統(tǒng)下。SenseManager在Enablexxx函數(shù)中初始化算法模塊,并在Init函數(shù)中進行I/O模塊的初始化。請參見例2-20中設(shè)置坐標系的相關(guān)操作。
例2-20 坐標系設(shè)置
//創(chuàng)建PXCMProjection實例 PXCMProjection projection=device.CreateProjection(); //獲取深度和彩色圖像尺寸 PXCMImage.ImageInfodinfo=depth.QueryInfo(); PXCMImage.ImageInfocinfo=color.QueryInfo(); //計算紅外圖 PXCMPointF32[] uvmap=new PXCMPointF32[dinfo.width*dinfo.height]; projection.QueryUVMap(depth, uvmap); //將深度點數(shù)組uv[]譯為彩色數(shù)組ij[] for (inti=0;i<uv.Length;i++) { ij[i].x=uvmap[(int)uv[i].y*dinfo.width+(int)uv[i].x].x*cinfo.width; ij[i].y=uvmap[(int)uv[i].y*dinfo.width+(int)uv[i].x].y*cinfo.height; } //清理 projection.close();
4.坐標映射
由于攝像頭在物理位置、鏡頭大小、視野方面的差異,彩色和深度圖像坐標系無法做到1:1映射,因此需要使用Projection函數(shù)來映射或投影坐標系。可以使用CreateProjection函數(shù)來獲取投影接口的實例。
Projection函數(shù)提供以下映射或投影:
- 彩色和深度圖像坐標之間的映射。
- 在彩色、深度圖像坐標和世界坐標之間的投影。
- 創(chuàng)建空間和大小對齊的彩色和深度圖像。
例2-21展示了如何使用紅外圖(UV map)映射深度和彩色坐標。
例2-21 映射深度和彩色坐標
//創(chuàng)建PXCMProjection實例 PXCMProjection projection=device.CreateProjection(); //獲取深度和顏色圖像尺寸 PXCMImage.ImageInfodinfo=depth.QueryInfo(); PXCMImage.ImageInfocinfo=color.QueryInfo(); //計算紅外圖 PXCMPointF32[] uvmap=new PXCMPointF32[dinfo.width*dinfo.height]; projection.QueryUVMap(depth, uvmap); //將深度點數(shù)組uv[]譯為顏色數(shù)組ij[] for (inti=0;i<uv.Length;i++) { ij[i].x=uvmap[(int)uv[i].y*dinfo.width+(int)uv[i].x].x*cinfo.width; ij[i].y=uvmap[(int)uv[i].y*dinfo.width+(int)uv[i].x].y*cinfo.height; } //清理 projection.close();
- 計算機網(wǎng)絡(luò)
- Expert C++
- 營銷數(shù)據(jù)科學(xué):用R和Python進行預(yù)測分析的建模技術(shù)
- Visual C++數(shù)字圖像處理技術(shù)詳解
- Mastering Google App Engine
- JavaScript應(yīng)用開發(fā)實踐指南
- Azure Serverless Computing Cookbook
- Mastering Apache Storm
- Android Development Tools for Eclipse
- Oracle 12c從入門到精通(視頻教學(xué)超值版)
- C語言程序設(shè)計教程
- Zend Framework 2 Cookbook
- Laravel 5.x Cookbook
- Learning Redis
- 程序員的算法趣題2