官术网_书友最值得收藏!

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();
主站蜘蛛池模板: 蓝山县| 新闻| 乌鲁木齐县| 治县。| 金沙县| 襄城县| 长兴县| 乌审旗| 澄城县| 凭祥市| 平远县| 建始县| 桐庐县| 石台县| 太仆寺旗| 龙江县| 莱州市| 郸城县| 合阳县| 峨眉山市| 定州市| 中阳县| 长岭县| 普兰店市| 定西市| 千阳县| 扎赉特旗| 通海县| 衡东县| 磐石市| 惠东县| 新干县| 白水县| 宝应县| 正宁县| 东丽区| 娱乐| 贵溪市| 潞西市| 晋江市| 旬邑县|