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

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

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

2020-01-26 14:47:58
字體:
來源:轉載
供稿:網友

開發環境 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
国产69精品久久久久久| 国产一区二区日韩精品欧美精品| 国产精品96久久久久久| 亚洲国产精品久久精品怡红院| 日韩高清电影免费观看完整| 日韩免费av片在线观看| 日韩av影院在线观看| 欧美另类99xxxxx| 日本韩国欧美精品大片卡二| 久久免费视频网站| 亚洲精品美女网站| 久久99精品久久久久久琪琪| 成人av资源在线播放| 日韩av电影在线免费播放| 亚洲欧美制服中文字幕| 韩国视频理论视频久久| 亚洲欧美日韩国产成人| 日韩美女av在线免费观看| 亚洲专区在线视频| 亚洲欧美变态国产另类| 欧美日韩人人澡狠狠躁视频| 亚洲久久久久久久久久久| 欧美高清第一页| 亚洲精品v天堂中文字幕| 欧美乱大交xxxxx另类电影| 国产日韩在线精品av| 亚洲精选中文字幕| 亚洲精品电影网在线观看| 国产视频欧美视频| 欧美电影在线观看完整版| 久久99国产精品久久久久久久久| 日韩免费电影在线观看| 亚洲新声在线观看| 久久好看免费视频| 亚洲精品一区av在线播放| 国产精品狼人色视频一区| 久热国产精品视频| 欧美在线视频导航| 91久久久在线| 亚洲香蕉成人av网站在线观看| 亚洲欧美一区二区三区在线| 国产一区二区日韩| 成人国产亚洲精品a区天堂华泰| 亚洲天堂日韩电影| 8x海外华人永久免费日韩内陆视频| 国产精品一区二区三区成人| 国产精品久久久av久久久| 国产精品视频男人的天堂| 久久久久久国产三级电影| 久久久久久免费精品| 久久天天躁狠狠躁夜夜躁| 日韩精品在线免费观看| 久久精视频免费在线久久完整在线看| 96pao国产成视频永久免费| 欧洲美女7788成人免费视频| 国产精品成人播放| 国产一区二区在线播放| 欧美在线视频a| 亚洲精品视频中文字幕| 91在线视频一区| 欧美夫妻性生活视频| 精品视频久久久久久| 国产精品美女在线| 亚洲加勒比久久88色综合| 亚洲精品电影网站| 国内精品久久久久影院 日本资源| 国产日本欧美一区二区三区在线| 亚洲999一在线观看www| 欧美激情视频网站| 久久久精品网站| 亚洲深夜福利在线| 亚洲综合在线做性| 国产不卡一区二区在线播放| 日本精品久久久| 久久99国产综合精品女同| 欧美在线一区二区视频| 国产日韩av在线| 欧日韩不卡在线视频| 国产自产女人91一区在线观看| 日韩av在线直播| 亚洲第一区第二区| 成人av番号网| 国产精品久久久久久久久久三级| 九九精品在线视频| 亚洲xxxx视频| 国产日韩一区在线| 精品国产美女在线| 日韩av电影国产| 欧美成人精品在线视频| 亚洲色无码播放| 久久影视电视剧免费网站| 亚洲免费一级电影| 国产精品自拍网| 亚洲精品永久免费精品| 久久久久久久一区二区| 欧美最猛性xxxxx亚洲精品| 亚洲成人精品视频在线观看| 色偷偷888欧美精品久久久| 亚洲一区二区三区sesese| 亚洲xxx大片| 国产一区二区三区毛片| 国产精品女人久久久久久| 色无极影院亚洲| 亚洲成人精品av| 亚洲欧美国产另类| 久久99精品久久久久久琪琪| 欧美在线精品免播放器视频| 精品久久久精品| 欧美影院在线播放| 精品久久久免费| 亚洲精品黄网在线观看| 欧美在线一区二区三区四| 国产精品福利在线| 国产伦精品一区二区三区精品视频| 欧美日韩另类视频| 亚洲精品黄网在线观看| 欧美日韩黄色大片| 69久久夜色精品国产69| 国产一区二区丝袜| 欧美成人亚洲成人日韩成人| 国产在线视频不卡| 日韩毛片在线观看| 亚洲网址你懂得| 日韩av在线免费观看一区| 青青草精品毛片| 欧美乱大交xxxxx| 午夜精品99久久免费| 国产欧美精品久久久| 青青a在线精品免费观看| 91精品综合久久久久久五月天| 久久精品视频99| www.色综合| 亚洲欧美国产视频| 亚洲xxx大片| 欧美第一淫aaasss性| 国产日韩欧美自拍| 亚洲精品日韩久久久| 亚洲激情视频网站| 亚洲精品欧美一区二区三区| 精品国产精品三级精品av网址| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久久久久久网站| 欧美激情在线一区| 国产精品成久久久久三级| 亚洲欧美在线播放| 国产综合久久久久久| 欧美日本高清一区| 日韩精品视频在线| 欧美性精品220| 亚洲性av在线| 成人黄色av播放免费| 日本亚洲欧美成人| 亚洲视频电影图片偷拍一区| 国产精品v片在线观看不卡| 高清一区二区三区日本久| 国产午夜精品美女视频明星a级| 日韩欧美国产中文字幕| 欧美孕妇孕交黑巨大网站| 欧美一级淫片丝袜脚交| 亚洲欧美中文日韩在线v日本| 久久精品精品电影网| 久久久电影免费观看完整版| 国产亚洲精品成人av久久ww| 日本精品中文字幕|