日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Kinect学习(四):提取深度数据

發布時間:2025/3/21 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Kinect学习(四):提取深度数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

前面試著提取了Kinect的彩色數據:Kinect學習(三):獲取RGB顏色數據。這次,要試著提取深度數據。

Depth Map(深度圖)是包含與視點的場景對象的表面的距離有關的信息的圖像或圖像通道。其中,Depth Map 類似于灰度圖像,只是它的每個像素值是傳感器距離物體的實際距離。通常RGB圖像和Depth圖像是配準的,因而像素點之間具有一對一的對應關系。

代碼

先上代碼。

#include <Windows.h> #include <iostream> #include <NuiApi.h> #include <opencv2/opencv.hpp>using namespace std; using namespace cv;int main(int argc, char *argv[]) {cv::Mat img;// 深度圖,使用灰度值來表示深度數據,越遠灰度越小則越暗img.create(480, 640, CV_8UC1);// 1、初始化NUI,使用深度數據HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_DEPTH);if (FAILED(hr)){cout << "NuiIntialize failed" << endl;return hr;}// 2、定義事件句柄// 創建讀取下一幀的信號事件句柄,用來控制Kinect是否可以開始讀取下一幀數據HANDLE nextDepthFrameEvent = CreateEvent(NULL, TRUE, FALSE, NULL);HANDLE depthStreamHandle = NULL; // 用來保存圖像數據流的句柄,用于提取數據// 3、打開Kinect設備的深度圖數據通道,使用depthStreamHandle保存該數據流的句柄,以便于后續讀取hr = NuiImageStreamOpen(NUI_IMAGE_TYPE_DEPTH, NUI_IMAGE_RESOLUTION_640x480, 0, 2, nextDepthFrameEvent, &depthStreamHandle);if (FAILED(hr)){cout << "Could not open color image stream video" << endl;NuiShutdown();return hr;}cv::namedWindow("depthImage", CV_WINDOW_AUTOSIZE);// 4、開始讀取深度數據while (1){const NUI_IMAGE_FRAME * pImageFrame = NULL;// 4.1、無限等待新的數據,等到后就返回if (WaitForSingleObject(nextDepthFrameEvent, INFINITE) == 0){// 4.2、從剛才打開數據流的流句柄中得到該幀的數據,讀取到的數據地址存在pImageFramehr = NuiImageStreamGetNextFrame(depthStreamHandle, 0, &pImageFrame);if (FAILED(hr)){cout << "Could not get depth image" << endl;NuiShutdown();return hr;}INuiFrameTexture * pTexture = pImageFrame->pFrameTexture;NUI_LOCKED_RECT LockedRect;// 4.3、提取數據幀到LockedRect,它包括了兩個數據對象:pitch每行字節數,pBits第一個字節地址//并鎖定數據,這樣當我們讀數據的時候,kinect就不會去修改它 pTexture->LockRect(0, &LockedRect, NULL, 0);// 4.4、確認得到的數據是否有效if (LockedRect.Pitch != 0){//4.5、將數據轉換為OpenCV的Mat格式 for (int i = 0;i < img.rows;i++){uchar * ptr = img.ptr<uchar>(i);//深度圖像數據含有兩種格式,這里像素的低12位表示一個深度值,高4位未使用; //注意這里需要轉換,因為每個數據是2個字節,存儲的同上面的顏色信息不一樣,uchar *pBufferRun = (uchar*)(LockedRect.pBits) + i * LockedRect.Pitch;USHORT * pBuffer = (USHORT*)pBufferRun;for (int j = 0;j < img.cols;j++){// ptr[j] = 255 - (uchar)(255 * pBuffer[j] / 0x0fff); //直接將數據歸一化處理ptr[j] = (uchar)(255 * pBuffer[j] / 0x0fff); //直接將數據歸一化處理}}cv::imshow("depthImage", img);}else{cout << "Buffer length of received texture is bogus\r\n" << endl;}// 5、這幀已經處理完了,將其解鎖,更新下一幀數據pTexture->UnlockRect(0);// 6、釋放這一陣數據,準備接受下一幀NuiImageStreamReleaseFrame(depthStreamHandle, pImageFrame);}if (cv::waitKey(20) == 27){break;}}// 7、關閉NUI連接NuiShutdown();return 0; }

運行結果

說明

基本的程序流程都與獲取彩色圖像數據的流程一樣,下面主要介紹不同點,類似的地方就不詳細說明了。

  • 初始化NUI接口;
  • 定義事件句柄;
  • 打開Kinect設備的數據流(深度數據);
  • 等待數據更新,若更新完成則進行下一步;
  • 從數據流中拿出圖像數據;
  • 提取數據幀并鎖定數據;
  • 將數據轉換為OpenCV的Mat格式。
  • 1、初始化NUI接口

    // 1、初始化NUI,使用深度數據 HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_DEPTH); if (FAILED(hr)) {cout << "NuiIntialize failed" << endl;return hr; }

    對NUI接口初始化,注意初始化的參數是NUI_INITIALIZE_FLAG_USES_DEPTH,代表要使用深度數據。

    2、定義事件句柄

    // 2、定義事件句柄 // 創建讀取下一幀的信號事件句柄,用來控制Kinect是否可以開始讀取下一幀數據 HANDLE nextDepthFrameEvent= CreateEvent(NULL, TRUE, FALSE, NULL);

    創建事件句柄,nextDepthFrameEvent對應信號事件,在打開Kinect設備的數據流之后,如果有信號(數據),則WaitForSingleObject(nextDepthFrameEvent, INFINITE)返回0。

    3、打開Kinect設備的數據流(深度數據)

    // 3、打開Kinect設備的深度圖數據通道,使用depthStreamHandle保存該數據流的句柄,以便于后續讀取 hr = NuiImageStreamOpen(NUI_IMAGE_TYPE_DEPTH, NUI_IMAGE_RESOLUTION_640x480, 0, 2, nextDepthFrameEvent, &depthStreamHandle); if (FAILED(hr)) {cout << "Could not open color image stream video" << endl;NuiShutdown();return hr; }

    打開深度圖的數據流,注意是:NUI_IMAGE_TYPE_DEPTH。

    4、等待數據更新,若更新完成則進行下一步

    // 4.1、無限等待新的數據,等到后就返回 if (WaitForSingleObject(nextDepthFrameEvent, INFINITE) == 0) { ... }

    訪問前面定義的信號事件:nextDepthFrameEvent,如果有數據則程序往后走,沒有數據,等待。

    5、從數據流中拿出圖像數據

    // 4.2、從剛才打開數據流的流句柄中得到該幀的數據,讀取到的數據地址存在pImageFrame hr = NuiImageStreamGetNextFrame(depthStreamHandle, 0, &pImageFrame); if (FAILED(hr)) {cout << "Could not get depth image" << endl;NuiShutdown();return hr; }

    從數據流depthStreamHandle中取出深度圖數據,保存在pImageFrame中。

    6、提取數據幀并鎖定數據

    INuiFrameTexture * pTexture = pImageFrame->pFrameTexture; NUI_LOCKED_RECT LockedRect;// 4.3、提取數據幀到LockedRect,它包括了兩個數據對象:pitch每行字節數,pBits第一個字節地址 //并鎖定數據,這樣當我們讀數據的時候,kinect就不會去修改它 pTexture->LockRect(0, &LockedRect, NULL, 0);

    INuiFrameTexture是一個保存圖像幀數據的對象,主要要用到他的下面兩個共有方法:

    • LockRect:給緩沖區上鎖;
    • UnlockRect:給緩沖區解鎖;

    因為圖像幀是保存在緩沖區的,如果不上鎖的話,緩沖區中還有的圖像可能會導致Kinect修改要取出的圖像。
    提取數據幀到LockedRect后,它包含兩個數據對象:pitch,每行字節數;pBits,第一個字節地址。

    7、將數據轉換為OpenCV的Mat格式。

    //4.5、將數據轉換為OpenCV的Mat格式 for (int i = 0;i < img.rows;i++) {uchar * ptr = img.ptr<uchar>(i);//深度圖像數據含有兩種格式,這里像素的低12位表示一個深度值,高4位未使用; //注意這里需要轉換,因為每個數據是2個字節,存儲的同上面的顏色信息不一樣,uchar *pBufferRun = (uchar*)(LockedRect.pBits) + i * LockedRect.Pitch; USHORT * pBuffer = (USHORT*)pBufferRun;for (int j = 0;j < img.cols;j++){// ptr[j] = 255 - (uchar)(255 * pBuffer[j] / 0x0fff); //直接將數據歸一化處理ptr[j] = (uchar)(255 * pBuffer[j] / 0x0fff); //直接將數據歸一化處理} }

    把LockedRect中的數據取出來,保存為OpenCV支持的Mat格式。
    深度數據是用16位數據的前12位表示,這里賦值時直接做了歸一化,調整到了0-255。

    參考資料

  • https://blog.csdn.net/timebomb/article/details/7169372
  • https://blog.csdn.net/zouxy09/article/details/8146719
  • https://blog.csdn.net/jningwei/article/details/73609127
  • 總結

    以上是生活随笔為你收集整理的Kinect学习(四):提取深度数据的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲精品性 | 欧美丰满老妇性猛交 | 姐姐你真棒插曲快来救救我电影 | 黑鬼巨鞭白妞冒白浆 | 天天射日 | 欧美黑人性受xxxx精品 | 777精品| 欧美一区二区三区免费 | 国产精品va在线 | 国产www在线观看 | www在线看| 久热精品在线观看视频 | 中文字幕日韩精品亚洲一区小树林 | 免费一级肉体全黄毛片 | 中文字幕第七页 | 蜜臀视频在线观看 | 日韩1024| 国内9l自拍 | 美女的胸给男人玩视频 | 日本特级黄色录像 | 国产精品夜夜躁视频 | 国产女人在线 | 中国在线观看片免费 | 欧美性tv | 97色涩| 夜夜操天天操 | 日本不卡专区 | 欧美人在线 | 久久澡 | 精品久久a| 天天舔日日操 | 国产成人91精品 | www狠狠 | 亚洲av永久无码精品一百度影院 | 国产午夜精品久久久久 | 综合在线观看 | 亚洲丝袜一区 | 久久国产加勒比精品无码 | 五月天激情视频 | 最新中文字幕在线 | 久久精品国产亚洲av嫖农村妇女 | 91黑丝美女 | www亚洲视频 | www日本高清视频 | 日韩欧美网址 | 国产成年人视频网站 | 床戏高潮做进去大尺度视频网站 | 伊人伊人| 91久久久久久久久久久 | 色综合av综合无码综合网站 | 成人短视频在线播放 | 亚洲欧洲精品一区二区 | 国产精品美女主播 | 日韩网| 国产免费不卡视频 | 黄色午夜视频 | 最新中文字幕av专区 | 免费a网站| 欧美人与性禽动交精品 | av美国 | 91丝袜国产在线播放 | 亚洲婷婷久久综合 | 少妇xxxxxx| 少妇愉情理伦片bd | 99成人国产精品视频 | 影音先锋一区 | 亚洲yy | 成人无遮挡 | 米奇7777狠狠狠狠视频 | 久久精品999 | 污视频网站免费 | 亚洲视频欧美 | 亚洲一区二区精品视频 | 亚洲黄色小说网 | 久久黄色影院 | 日日夜夜干 | 黄色一级大片免费看 | 久草资源在线视频 | 色哟哟欧美精品 | 献给魔王伊伏洛基亚吧动漫在线观看 | 青娱乐在线视频免费观看 | 日本一级片在线观看 | 欧美日韩一区二区在线 | 台湾佬综合网 | 91久久精品夜夜躁日日躁欧美 | 小萝莉末成年一区二区 | 99精品在线观看视频 | 插插操操| 亚洲久热 | 开心春色激情网 | 日本一区二区三区视频在线观看 | 国产特级片 | 一本一道久久综合 | 亚洲一区a | 婷婷成人综合网 | 无码专区久久综合久中文字幕 | 黑人巨大精品欧美一区二区免费 | 久草视频在线资源站 | 91久久影院|