亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

基于C++實現kinect+opencv 獲取深度及彩色數據

2020-05-23 14:11:43
字體:
來源:轉載
供稿:網友
本文的主要思想是Kinect SDK 讀取彩色、深度、骨骼信息并用OpenCV顯示,非常的實用,有需要的小伙伴可以參考下
 

開發環境 vs2010+OPENCV2.4.10

首先,下載最新的Kinect 2 SDK  http://www.microsoft.com/en-us/kinectforwindows/develop/downloads-docs.aspx

下載之后不要插入Kinect,最好也不用插入除了鍵盤鼠標以外的其它USB設備,然后安裝SDK,安裝完成之后插入Kinect,會有安裝新設備的提示。安裝完成之后可以去“開始”那里找到兩個新安裝的軟件,一個是可以顯示Kinect深度圖,另外一個軟件展示SDK中的各種例子程序。

進入SDK的安裝目錄,可以找到sample這個文件夾,里面是四種語言編寫的例子,其中native是C++的,managed是C#的,還有另外兩種語言不熟悉,我就熟悉C++,反正只是試試的,就用C++了。

opencv+kinect .cpp

#include <opencv2/opencv.hpp> #include<iostream>//windows的頭文件,必須要,不然NuiApi.h用不了#include <Windows.h>//Kinect for windows 的頭文件#include "NuiApi.h" using namespace std;using namespace cv; #include <d3d11.h>  //最遠距離(mm)const int MAX_DISTANCE = 3500;//最近距離(mm)const int MIN_DISTANCE = 200; const LONG m_depthWidth = 640;const LONG m_depthHeight = 480;const LONG m_colorWidth = 640;const LONG m_colorHeight = 480;const LONG cBytesPerPixel = 4; int main(){  //彩色圖像  Mat image_rgb;  //深度圖像  Mat image_depth;   //創建一個MAT  image_rgb.create(480,640,CV_8UC3);  image_depth.create(480,640,CV_8UC1);   //一個KINECT實例指針  INuiSensor* m_pNuiSensor = NULL;   if (m_pNuiSensor != NULL)  {    return 0;  }   //記錄當前連接KINECT的數量(為多連接做準備)  int iSensorCount;  //獲得當前KINECT的數量  HRESULT hr = NuiGetSensorCount(&iSensorCount);    //按照序列初始化KINETC實例,這里就連接了一個KINECT,所以沒有用到循環  hr = NuiCreateSensorByIndex(iSensorCount - 1, &m_pNuiSensor);  //初始化,讓其可以接收彩色和深度數據流  hr = m_pNuiSensor->NuiInitialize(NUI_INITIALIZE_FLAG_USES_COLOR | NUI_INITIALIZE_FLAG_USES_DEPTH);   //判斷是否出錯  if (FAILED(hr))  {    cout<<"NuiInitialize failed"<<endl;    return hr;  }   //彩色圖像獲取下一幀事件  HANDLE nextColorFrameEvent = CreateEvent(NULL, TRUE, FALSE, NULL);  //彩色圖像事件句柄  HANDLE colorStreamHandle = NULL;  //深度圖像獲取下一幀事件  HANDLE nextDepthFrameEvent = CreateEvent(NULL, TRUE, FALSE, NULL);  //深度圖像事件句柄  HANDLE depthStreamHandle = NULL;   //實例打開數據流,這里NUI_IMAGE_TYPE_COLOR表示彩色圖像  hr = m_pNuiSensor->NuiImageStreamOpen(NUI_IMAGE_TYPE_COLOR, NUI_IMAGE_RESOLUTION_640x480, 0,2,nextColorFrameEvent,&colorStreamHandle);   if( FAILED( hr ) )//判斷是否提取正確  {    cout<<"Could not open color image stream video"<<endl;    m_pNuiSensor->NuiShutdown();    return hr;  }   //實例打開數據流,這里NUI_IMAGE_TYPE_DEPTH表示深度圖像  hr = m_pNuiSensor->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;    m_pNuiSensor->NuiShutdown();    return hr;  }     cv::namedWindow("depth", CV_WINDOW_AUTOSIZE);  moveWindow("depth",300,600);  cv::namedWindow("colorImage",CV_WINDOW_AUTOSIZE);  moveWindow("colorImage",0,200);   while (1)  {    NUI_IMAGE_FRAME pImageFrame_rgb;    NUI_IMAGE_FRAME pImageFrame_depth;     //無限等待新的彩色數據,等到后返回    if (WaitForSingleObject(nextColorFrameEvent, 0) == 0)    {      //從剛才打開數據流的流句柄中得到該幀數據,讀取到的數據地址存于pImageFrame      hr = m_pNuiSensor->NuiImageStreamGetNextFrame(colorStreamHandle, 0, &pImageFrame_rgb);      if (FAILED(hr))      {        cout<<"Could not get color image"<<endl;        m_pNuiSensor->NuiShutdown();        return -1;      }       INuiFrameTexture *pTexture = pImageFrame_rgb.pFrameTexture;      NUI_LOCKED_RECT lockedRect;       //提取數據幀到LockedRect,它包括兩個數據對象:pitch每行字節數,pBits第一個字節地址      //并鎖定數據,這樣當我們讀數據的時候,kinect就不會去修改它        pTexture->LockRect(0, &lockedRect, NULL, 0);      //確認獲得的數據是否有效      if (lockedRect.Pitch != 0)      {        //將數據轉換為OpenCV的Mat格式        for (int i = 0; i < image_rgb.rows; i++)        {          //第i行的指針          uchar *prt = image_rgb.ptr(i);           //每個字節代表一個顏色信息,直接使用uchar          uchar *pBuffer = (uchar*)(lockedRect.pBits) + i * lockedRect.Pitch;           for (int j = 0; j < image_rgb.cols; j++)          {              prt[3 * j] = pBuffer[4 * j];//內部數據是4個字節,0-1-2是BGR,第4個現在未使用            prt[3 * j + 1] = pBuffer[4 * j + 1];            prt[3 * j + 2] = pBuffer[4 * j + 2];          }        }         imshow("colorImage",image_rgb);        //解除鎖定        pTexture->UnlockRect(0);        //釋放幀        m_pNuiSensor->NuiImageStreamReleaseFrame(colorStreamHandle, &pImageFrame_rgb );      }      else      {        cout<<"Buffer length of received texture is bogus/r/n"<<endl;      }       BOOL nearMode;      INuiFrameTexture* pColorToDepthTexture;         //深度圖像的處理      if (WaitForSingleObject(nextDepthFrameEvent, INFINITE) == 0)      {         hr = m_pNuiSensor->NuiImageStreamGetNextFrame(depthStreamHandle, 0 , &pImageFrame_depth);         if (FAILED(hr))        {          cout<<"Could not get color image"<<endl;          NuiShutdown();          return -1;        }         hr = m_pNuiSensor->NuiImageFrameGetDepthImagePixelFrameTexture(           depthStreamHandle, &pImageFrame_depth, &nearMode, &pColorToDepthTexture);         INuiFrameTexture *pTexture = pImageFrame_depth.pFrameTexture;        NUI_LOCKED_RECT lockedRect;        NUI_LOCKED_RECT ColorToDepthLockRect;          pTexture->LockRect(0, &lockedRect, NULL, 0);        pColorToDepthTexture->LockRect(0,&ColorToDepthLockRect,NULL,0);          //歸一化        for (int i = 0; i < image_depth.rows; i++)        {          uchar *prt = image_depth.ptr<uchar>(i);           uchar* pBuffer = (uchar*)(lockedRect.pBits) + i * lockedRect.Pitch;          //這里需要轉換,因為每個深度數據是2個字節,應將BYTE轉成USHORT          USHORT *pBufferRun = (USHORT*)pBuffer;           for (int j = 0; j < image_depth.cols; j++)          {            //先向,將數據歸一化處理,對深度距離在300mm-3500mm范圍內的像素,映射到【0—255】內,            //超出范圍的,都去做是邊緣像素            if (pBufferRun[j] << 3 > MAX_DISTANCE) prt[j] = 255;            else if(pBufferRun[j] << 3 < MIN_DISTANCE) prt[j] = 0;            else prt[j] = (BYTE)(256 * (pBufferRun[j] << 3)/ MAX_DISTANCE);          }        }        imshow("depth", image_depth);           //接下來是對齊部分,將前景摳出來         //存放深度點的參數        NUI_DEPTH_IMAGE_POINT* depthPoints = new NUI_DEPTH_IMAGE_POINT[640 * 480];        if (ColorToDepthLockRect.Pitch != 0)         {           HRESULT hrState = S_OK;                      //一個能在不同空間坐標轉變的類(包括:深度,彩色,骨骼)          INuiCoordinateMapper* pMapper;            //設置KINECT實例的空間坐標系          hrState = m_pNuiSensor->NuiGetCoordinateMapper(&pMapper);            if (FAILED(hrState))           {             return hrState;           }            //重要的一步:從顏色空間映射到深度空間。參數說明:          //【參數1】:彩色圖像的類型          //【參數2】:彩色圖像的分辨率          //【參數3】:深度圖像的分辨率          //【參數4】:深度圖像的個數          //【參數5】:深度像素點數          //【參數6】:取內存的大小,個數。類型為NUI_DEPTH_IMAGE_PIXEL          //【參數7】:存放映射結果點的參數          hrState = pMapper->MapColorFrameToDepthFrame(NUI_IMAGE_TYPE_COLOR, NUI_IMAGE_RESOLUTION_640x480, NUI_IMAGE_RESOLUTION_640x480,             640 * 480, (NUI_DEPTH_IMAGE_PIXEL*)ColorToDepthLockRect.pBits,640 * 480, depthPoints);            if (FAILED(hrState))           {             return hrState;           }             //顯示的圖像          Mat show;          show.create(480,640,CV_8UC3);          show = 0;           for (int i = 0; i < image_rgb.rows; i++)          {            for (int j = 0; j < image_rgb.cols; j++)            {              uchar *prt_rgb = image_rgb.ptr(i);              uchar *prt_show = show.ptr(i);              //在內存中偏移量              long index = i * 640 + j;               //從保存了映射坐標的數組中獲取點              NUI_DEPTH_IMAGE_POINT depthPointAtIndex = depthPoints[index];                //邊界判斷              if (depthPointAtIndex.x >= 0 && depthPointAtIndex.x < image_depth.cols &&                depthPointAtIndex.y >=0 && depthPointAtIndex.y < image_depth.rows)              {                //深度判斷,在MIN_DISTANCE與MAX_DISTANCE之間的當成前景,顯示出來                //這個使用也很重要,當使用真正的深度像素點再在深度圖像中獲取深度值來判斷的時候,會出錯                if (depthPointAtIndex.depth >= MIN_DISTANCE && depthPointAtIndex.depth <= MAX_DISTANCE)                {                  prt_show[3 * j]   = prt_rgb[j * 3];                  prt_show[3 * j + 1] = prt_rgb[j * 3 + 1];                  prt_show[3 * j + 2] = prt_rgb[j * 3 + 2];                }              }            }          }          imshow("show", show);        }         delete []depthPoints;                 pTexture->UnlockRect(0);        m_pNuiSensor->NuiImageStreamReleaseFrame(depthStreamHandle, &pImageFrame_depth);      }       else      {        cout<<"Buffer length of received texture is bogus/r/n"<<endl;      }    }     if (cvWaitKey(20) == 27)      break;  }  return 0;}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
午夜精品久久久久久久久久久久| 亚洲最新av网址| 国产精品自拍偷拍视频| 91美女片黄在线观看游戏| 国产精品r级在线| 亚洲国产精品久久91精品| 国产亚洲a∨片在线观看| 国产精品mp4| 国产精品爽爽ⅴa在线观看| 中文字幕亚洲国产| 欧洲亚洲免费在线| 亚洲视屏在线播放| 6080yy精品一区二区三区| 国模极品一区二区三区| 久久电影一区二区| 亚洲国产99精品国自产| 久久久久久久久久国产| 亚洲精品91美女久久久久久久| 亚洲激情在线观看视频免费| 中文字幕国产日韩| 精品日韩视频在线观看| 欧美丰满少妇xxxxx| 国产精品久久一| 亲子乱一区二区三区电影| 精品性高朝久久久久久久| 午夜精品一区二区三区在线播放| 日韩日本欧美亚洲| 97国产suv精品一区二区62| 欧美日韩激情视频8区| 亚洲国产中文字幕久久网| 国产精品久久一区主播| 国产精品一区二区三区免费视频| 日韩中文字幕在线| 欧美另类极品videosbest最新版本| 亚洲精品福利在线| 久久国产色av| 国产日韩欧美在线观看| 久久久久久91| 岛国精品视频在线播放| 欧美日韩国产精品一区二区不卡中文| 日韩av电影在线播放| 色婷婷综合久久久久中文字幕1| 午夜美女久久久久爽久久| 色哟哟网站入口亚洲精品| 欧美日韩性生活视频| 日韩av123| 亚洲精品在线不卡| 成人h片在线播放免费网站| 92国产精品视频| 亚洲人成自拍网站| 亚洲免费视频一区二区| 庆余年2免费日韩剧观看大牛| 在线成人中文字幕| 深夜福利91大全| 欧美色图在线视频| 国产成人精品日本亚洲| 精品高清一区二区三区| 国产丝袜视频一区| 亚洲精品久久久久久下一站| 精品调教chinesegay| 日韩精品久久久久| 91嫩草在线视频| 97精品欧美一区二区三区| 免费99精品国产自在在线| 欧美激情va永久在线播放| 久久亚洲电影天堂| 尤物精品国产第一福利三区| 色777狠狠综合秋免鲁丝| 色中色综合影院手机版在线观看| 欧美视频第一页| 国产美女高潮久久白浆| 91地址最新发布| 欧美性精品220| 日本午夜人人精品| 国产色综合天天综合网| 欧美有码在线视频| 色系列之999| 亚洲国产成人精品一区二区| 久久在线精品视频| 精品一区二区三区三区| 国产精品吹潮在线观看| 国模gogo一区二区大胆私拍| 精品成人在线视频| 欧美极品少妇xxxxx| 成人两性免费视频| 亚洲欧美日本伦理| 91日韩在线播放| 久99九色视频在线观看| 国内精品在线一区| 欧美在线免费观看| 成人激情电影一区二区| 久久精品在线视频| 亚洲自拍中文字幕| 国产免费一区视频观看免费| 亚洲精品ady| 一区二区三区 在线观看视| 欧美人与性动交| 欧美激情欧美狂野欧美精品| 亚洲人成毛片在线播放| 国产精品极品美女粉嫩高清在线| 日韩成人中文字幕在线观看| 亚洲毛片一区二区| 久久琪琪电影院| 性色av一区二区咪爱| 亚洲第一区在线观看| 国产日韩换脸av一区在线观看| 欧美丝袜一区二区三区| 日韩av网站电影| 久久久久在线观看| 欧美一区二区三区四区在线| 亚洲人午夜精品免费| 日本精品久久久| 国产精品嫩草影院久久久| 日韩三级影视基地| 欧美色视频日本高清在线观看| 精品中文字幕在线观看| xxxx性欧美| 日韩在线欧美在线国产在线| 久久精品夜夜夜夜夜久久| 国产日韩精品在线播放| 第一福利永久视频精品| 亚洲天堂成人在线| 亚洲欧洲成视频免费观看| 2021久久精品国产99国产精品| 午夜精品99久久免费| 成人淫片在线看| 久久777国产线看观看精品| 亚洲福利视频久久| 亚洲色图校园春色| 青草热久免费精品视频| 欧美精品免费播放| 最新日韩中文字幕| 久久免费精品日本久久中文字幕| 久久久久久国产三级电影| 欧美丝袜美女中出在线| 成人a在线视频| 日韩专区中文字幕| 亚洲精品第一国产综合精品| 欧美日韩免费看| 久久久久久一区二区三区| 色综合91久久精品中文字幕| 2018国产精品视频| 国产一区深夜福利| 成人啪啪免费看| 午夜精品一区二区三区在线视频| 在线视频亚洲欧美| 亚洲欧美中文字幕| 中文.日本.精品| 日本一本a高清免费不卡| 九九热精品视频在线播放| 这里只有精品久久| 91在线观看免费高清| 亚洲精品视频免费| 亚洲字幕在线观看| 久久久精品在线观看| 久久天天躁夜夜躁狠狠躁2022| 欧美性jizz18性欧美| 日韩av综合中文字幕| 国产精品久久久久久久电影| 国产欧美精品日韩精品| 精品视频9999| 亚洲欧美国产精品专区久久| 欧洲永久精品大片ww免费漫画| 91精品国产99|