目錄
1.1 成像原理簡(jiǎn)介
1.1.1 結(jié)構(gòu)光
1.1.2 雙目視覺(jué)
1.1.3 光飛行時(shí)間TOF?
2.使用手冊(cè)
參考網(wǎng)址
2.1 產(chǎn)品集成設(shè)計(jì)
2.2 SDK介紹與使用
2.3 常用API介紹
OPENNI API
2 OpenNI類(OpenNI.h)
1.1 成像原理簡(jiǎn)介
1.1.1 結(jié)構(gòu)光
結(jié)構(gòu)光,英文叫做 Structured light,通常采用特定波長(zhǎng)的不可見(jiàn)的紅外激光作為光源,它發(fā)射出來(lái)的光經(jīng)過(guò)
一定的編碼投影在物體上,通過(guò)一定算法來(lái)計(jì)算返回的編碼圖案的畸變來(lái)得到物體的位置和深度信息。根
據(jù)編碼圖案不同一般有條紋結(jié)構(gòu)光---enshape ,編碼結(jié)構(gòu)光---Mantis Vision, Realsense(F200), 散斑結(jié)構(gòu)光
---apple(primesense), 奧比中光。下圖是一個(gè)典型的結(jié)構(gòu)光相機(jī)的示意圖:
結(jié)構(gòu)光(散斑)的優(yōu)點(diǎn)主要有:
1)方案成熟,相機(jī)基線可以做的比較小,方便小型化。
2)資源消耗較低,單幀 IR 圖就可計(jì)算出深度圖,功耗低。
3)主動(dòng)光源,夜晚也可使用。
4)在一定范圍內(nèi)精度高,分辨率高,分辨率可達(dá) 1280x1024,幀率可達(dá) 60FPS。
散斑結(jié)構(gòu)光的缺點(diǎn)與結(jié)構(gòu)光類似:
1)容易受環(huán)境光干擾,室外體驗(yàn)差。
2)隨檢測(cè)距離增加,精度會(huì)變差。
1.1.2 雙目視覺(jué)
雙目相機(jī)的主要優(yōu)點(diǎn)有:
1)硬件要求低,成本也低。普通 CMOS 相機(jī)即可。
2)室內(nèi)外都適用。只要光線合適,不要太昏暗。
但是雙目的缺點(diǎn)也是非常明顯:
1)對(duì)環(huán)境光照非常敏感。光線變化導(dǎo)致圖像偏差大,進(jìn)而會(huì)導(dǎo)致匹配失敗或精度低
2)不適用單調(diào)缺乏紋理的場(chǎng)景。雙目視覺(jué)根據(jù)視覺(jué)特征進(jìn)行圖像匹配,沒(méi)有特征會(huì)導(dǎo)致匹配失敗。
3)計(jì)算復(fù)雜度高。該方法是純視覺(jué)的方法,對(duì)算法要求高,計(jì)算量較大。
4)基線限制了測(cè)量范圍。測(cè)量范圍和基線(兩個(gè)攝像頭間距)成正比,導(dǎo)致無(wú)法小型化。
1.1.3 光飛行時(shí)間TOF
TOF 的優(yōu)點(diǎn)主要有:
1)檢測(cè)距離遠(yuǎn)。在激光能量夠的情況下可達(dá)幾十米。
2)受環(huán)境光干擾比較小。
但是 TOF 也有一些顯而易見(jiàn)的問(wèn)題:
1)對(duì)設(shè)備要求高,特別是時(shí)間測(cè)量模塊。
2)資源消耗大。 該方案在檢測(cè)相位偏移時(shí)需要多次采樣積分,運(yùn)算量大。
3)邊緣精度低。
4)限于資源消耗和濾波,幀率和分辨率都沒(méi)辦法做到較高。目前消費(fèi)類最大也就 VGA。
雙目具有良好的戶外表現(xiàn),但不適用紋理變化不明顯的場(chǎng)合,如白墻;
TOF在遠(yuǎn)距離的精度更佳,但目前受限于圖像分辨率低、功耗大;
結(jié)構(gòu)光綜合表現(xiàn)目前來(lái)看,在三種3D傳感技術(shù)中最優(yōu),但是戶外強(qiáng)光干擾明顯和遠(yuǎn)距離處精度差
奧比中光推出了940nm波段的二代產(chǎn)品P1、Deeyea和雙目結(jié)構(gòu)光結(jié)合的產(chǎn)品蒼龍一 號(hào),盡可能改善結(jié)構(gòu)光的固有缺陷。
2.使用手冊(cè)
參考網(wǎng)址
https://developer.orbbec.com.cn/develop_details.html?id=1 很全
https://developer.orbbec.com.cn/technical_library.html?id=68 代碼實(shí)例
https://developer.orbbec.com.cn/technical_library.html?id=70 API
SDK支持
https://developer.orbbec.com.cn/download.html?id=75&menushow=1
官網(wǎng)教程
https://developer.orbbec.com.cn/technical_library.html?id=22
應(yīng)用例程
https://developer.orbbec.com.cn/develop_details.html?id=3
2.1 產(chǎn)品集成設(shè)計(jì)
深度圖
不同于RGB圖像,深度圖中每個(gè)像素點(diǎn)保存的是視場(chǎng)范圍內(nèi)物體距離相機(jī)平面的深度值數(shù)據(jù)。深
度原始數(shù)據(jù)通常為16-bit unsigned int類型,單位可通過(guò)SDK指定,通常為1mm,即深度圖中每個(gè)
像素點(diǎn)保存著16-bit無(wú)符號(hào)整型數(shù)據(jù),單位為1mm。
為了將深度數(shù)據(jù)可視化的顯示出來(lái),通常將其轉(zhuǎn)換為灰度圖顯示,如下圖所示,不同灰度級(jí)表示
不同的深度值大小。
2.2 SDK介紹與使用
奧比中光提供的OpenNI2.3系列SDK基于OpenNI2開(kāi)發(fā),OpenNI2(開(kāi)放自然交互)是一個(gè)多
語(yǔ)言、跨平臺(tái)的框架,它定義了應(yīng)用程序、中間件和3D傳感設(shè)備之間的接口。
windows上位機(jī)使用前需先安裝對(duì)應(yīng)的驅(qū)動(dòng),具體步驟為:
1.雙擊【SensorDriver_V4.3.0.17.exe】進(jìn)行驅(qū)動(dòng)安裝
2.解壓OrbbecViewer上位機(jī)安裝包
3.進(jìn)入解壓后文件夾,雙擊【OrbbecViewer.exe】運(yùn)行上位機(jī)
Windows工程環(huán)境配置
1)適用范圍
本公司SDK適用X86/X64 Windows7及以上平臺(tái)
2)開(kāi)發(fā)平臺(tái)搭建
推薦的Windows開(kāi)發(fā)平臺(tái)為Visual Studio 2013或以上版本。對(duì)于Visual Studio平臺(tái),可通過(guò)以
下步驟搭建開(kāi)發(fā)環(huán)境:
? 新建或打開(kāi)C++工程
? 選擇“項(xiàng)目——屬性”,將\SDK\windows\Include目錄添加到頭文件依賴路徑下,注意屬性
配置(x86/x64)與運(yùn)行時(shí)一致
在“鏈接器——輸入”目錄下新增OpenNI.lib項(xiàng),完成環(huán)境配置,可以開(kāi)始編輯自己的代碼
了。
? 注意編譯運(yùn)行工程時(shí),把x64-release或者x86-release文件夾里面OpenNI文件夾以及ini和dll
文件拷貝到exe文件所在目錄下,否則會(huì)閃退或報(bào)錯(cuò)。
2.3 常用API介紹
https://zhuanlan.zhihu.com/p/608879068
-
OPENNI API
主要包含4個(gè)大類:
(1)openni::OpenNI
提供了一個(gè)靜態(tài)的API進(jìn)入點(diǎn)。提供訪問(wèn)設(shè)備,設(shè)備相關(guān)事件,版本和錯(cuò)誤信息。首先確保連接了設(shè)備。
(2)openni::Device
提供與連接到系統(tǒng)的單個(gè)傳感器設(shè)備的接口。需要在創(chuàng)建OpenNI之前先初始化它。提供了對(duì)流的訪問(wèn)權(quán)限。
(3)openni::VideoStream
從一個(gè)設(shè)備(Device)里提取一個(gè)視頻流,需要獲取視頻幀引用(VideoFrameRefs)。
(4)openni::VideoFrameRef
從相關(guān)元數(shù)據(jù)中提取單個(gè)視頻。從特定流獲取。
除了這些主要類之外,還提供了各種支持類和結(jié)構(gòu)來(lái)保存特定類型的數(shù)據(jù)。提供了一個(gè)用于將OpenNI視頻流存儲(chǔ)到文件中的記錄器類。還有一些為OpenNI和Stream類可以生成的事件提供的監(jiān)聽(tīng)器類。視頻流可以使用兩種基本方法之一來(lái)讀?。夯谘h(huán)的和基于事件的。這兩種方法將在本指南的后面詳細(xì)介紹
(5) PlaybackControl 類
有些操作只有在處理已記錄的文件時(shí)才可能執(zhí)行。這些操作包括在流中查找、確定錄音的長(zhǎng)度、循環(huán)錄音以及改變播放速度。這個(gè)功能已經(jīng)被播放控制類封裝了。
2 OpenNI類(OpenNI.h)
-
2.1 對(duì)設(shè)備的基本訪問(wèn)
(1)OpenNI::initialize() 初始化所有可用的傳感器驅(qū)動(dòng)程序,并掃描系統(tǒng)中可用的設(shè)備
(2)OpenNI::enumerateDevices() 返回已連接到系統(tǒng)的所有可用設(shè)備的列表文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-850928.html
(3) OpenNI::shutdown() 關(guān)閉所有驅(qū)動(dòng)程序并正確地清理文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-850928.html
//1.初始化
Status rc = OpenNI::initialize();
if (rc != STATUS_OK)
{
printf("Initialize failed\n%s\n", OpenNI::getExtendedError());
return 1;
}
// 2.設(shè)備對(duì)象
Device device;
rc = device.open(ANY_DEVICE);
if (rc != STATUS_OK)
{
printf("Couldn't open device\n%s\n", OpenNI::getExtendedError());
return 2;
}
// 3.視頻流對(duì)象
VideoStream depth;
if (device.getSensorInfo(SENSOR_DEPTH) != NULL)
{
rc = depth.create(device, SENSOR_DEPTH);
if (rc != STATUS_OK)
{
printf("Couldn't create depth stream\n%s\n", OpenNI::getExtendedError());
return 3;
}
}
rc = depth.start();
if (rc != STATUS_OK)
{
printf("Couldn't start the depth stream\n%s\n", OpenNI::getExtendedError());
return 4;
}
// 4.循環(huán)讀取一幀,getData
int changedStreamDummy;
VideoStream* pStream = &depth;
VideoFrameRef frame; // 先定義再聲明,最后使用
const int maxFramesToProcess = 100;
//Sentinel to count the number of frames that we've processed
int count = 0;
//The frame processing loop
do {
rc = OpenNI::waitForAnyStream(&pStream, 1, &changedStreamDummy, TIMEOUT_FOREVER);
if (rc != STATUS_OK)
{
printf("Wait failed! (timeout is %d ms)\n%s\n", TIMEOUT_FOREVER, OpenNI::getExtendedError());
continue;
}
rc = depth.readFrame(&frame);
if (rc != STATUS_OK)
{
printf("Read failed!\n%s\n", OpenNI::getExtendedError());
continue;
}
if (frame.getVideoMode().getPixelFormat() != PIXEL_FORMAT_DEPTH_1_MM && frame.getVideoMode().getPixelFormat() != PIXEL_FORMAT_DEPTH_100_UM)
{
printf("Unexpected frame format\n");
continue;
}
DepthPixel* pDepth = (DepthPixel*)frame.getData(); //轉(zhuǎn)換幀數(shù)據(jù)為DepthPixel類型的指針
printf("[%08llu] %8d\n ", (long long)frame.getTimestamp(), pDepth[0]);
int middleIndex = (frame.getHeight() + 1) * frame.getWidth() / 2;
printf("[%08llu] %8d\n %8d\n %8d\n", (long long)frame.getTimestamp(), pDepth[middleIndex], frame.getHeight(), frame.getWidth());
count++;
} while (count < maxFramesToProcess);
// 釋放資源
depth.stop();
depth.destroy();
device.close();
OpenNI::shutdown();
std::cout << "hit enter to exit program" << std::endl;
system("pause");
到了這里,關(guān)于奧比中光Astra SDK相機(jī)SDK openni&&相機(jī)成像原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!