Guest User

Kinect2Manager.cpp

a guest
Dec 13th, 2016
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.23 KB | None | 0 0
  1. #include "Kinect2Manager.h"
  2.  
  3. using namespace std;
  4.  
  5. // Safe release for interfaces
  6. template<class Interface>
  7. inline void SafeRelease(Interface *& pInterfaceToRelease)
  8. {
  9.     if (pInterfaceToRelease != NULL)
  10.     {
  11.         pInterfaceToRelease->Release();
  12.         pInterfaceToRelease = NULL;
  13.     }
  14. }
  15.  
  16. // Kinect2Manager constructor
  17. Kinect2Manager::Kinect2Manager()
  18. {
  19.  
  20. }
  21.  
  22. // Kinect2Manager destructor
  23. Kinect2Manager::~Kinect2Manager()
  24. {  
  25.     SafeRelease(multisourceFrameReader);
  26.     disconnect();
  27. }
  28.  
  29. // getLastError
  30. string Kinect2Manager::getLastError() {
  31.     return lastErrorMessage;
  32. }
  33.  
  34. // isAvailable
  35. bool Kinect2Manager::isAvailable() {
  36.     // Try to query sensor availability
  37.     // TODO: discriminate between sensor unavailability and query error
  38.     HRESULT res = S_OK;
  39.     BOOLEAN available;
  40.     do {
  41.         res = kinect->get_IsAvailable(&available);
  42.     } while (res != S_OK);
  43.     return available;
  44. }
  45.  
  46. // isAcquiring
  47. bool Kinect2Manager::isAcquiring() {
  48.     // Try to query sensor acquisition status
  49.     // TODO: discriminate between sensor acquisition status and query error
  50.     HRESULT res;
  51.     BOOLEAN open;
  52.     res = kinect->get_IsOpen(&open);
  53.     if (res != S_OK) {
  54.         // Query error
  55.         lastErrorMessage = "Unable to query kinect2 sensor acquisitions status!";
  56.         return false;
  57.     }
  58.     else
  59.         return open;
  60. }
  61.  
  62. // getID
  63. string Kinect2Manager::getID() {
  64.     // Try to query sensor unique ID
  65.     HRESULT res;
  66.     WCHAR id[50];
  67.     res = kinect->get_UniqueKinectId(50, id);
  68.     if (res != S_OK) {
  69.         // Query error
  70.         lastErrorMessage = "Unable to query kinect2 sensor ID!";
  71.         return "";
  72.     }
  73.     else {
  74.         wstring wid(id);
  75.         string sid;
  76.         sid.assign(wid.begin(), wid.end());
  77.         return sid;
  78.     }
  79. }
  80.  
  81. // connect
  82. bool Kinect2Manager::connect() {
  83.     // Try to connect to the first plugged kinect
  84.     HRESULT res;
  85.     // Get default kinect
  86.     res = GetDefaultKinectSensor(&kinect);
  87.     if (res != S_OK) {
  88.         // Connection error
  89.         lastErrorMessage = "Unable to get default kinect2 sensor!";
  90.         return false;
  91.     }
  92.     // Else default kinect has been found; open it
  93.     res = kinect->Open();
  94.     if (res != S_OK) {
  95.         lastErrorMessage = "Unable to start acquisition!";
  96.         return false;
  97.     }
  98.  
  99.     // Get depth camera intrinsic parameters matrix
  100.     res = kinect->get_CoordinateMapper(&coordinateMapper);
  101.     if (res != S_OK) {
  102.         lastErrorMessage = "Unable to get coordinate mapper!";
  103.         return false;
  104.     }
  105.  
  106.     do {
  107.         res = coordinateMapper->GetDepthCameraIntrinsics(&cameraIntrinsics);
  108.         if (res != S_OK) {
  109.             lastErrorMessage = "Unable to get depth camera intrinsics!";
  110.             return false;
  111.         }
  112.     } while (cameraIntrinsics.FocalLengthX == 0);
  113.  
  114.     return true;
  115. }
  116.  
  117. // disconnect
  118. bool Kinect2Manager::disconnect() {
  119.     HRESULT res;
  120.     if (kinect) {
  121.         res = kinect->Close();
  122.         if (res != S_OK) {
  123.             lastErrorMessage = "Error disconnecting from Kinect2!";        
  124.         }
  125.     }
  126.  
  127.     SafeRelease(kinect);
  128.  
  129.     return res == S_OK;
  130. }
  131.  
  132.  
  133. // startAcquisition
  134. bool Kinect2Manager::startAcquisition() {
  135.     HRESULT res;
  136.  
  137.     // Open streams
  138.     hEvents = reinterpret_cast<HANDLE>(hFrameWaitable);
  139.  
  140.     int frameSourceTypes = FrameSourceTypes_None;
  141.     if (acquireColor)
  142.         frameSourceTypes |= FrameSourceTypes_Color;
  143.     if (acquireDepth)
  144.         frameSourceTypes |= FrameSourceTypes_Depth;
  145.     if (acquireInfrared)
  146.         frameSourceTypes |= FrameSourceTypes_Infrared;
  147.     if (acquireLongExposureInfrared)
  148.         frameSourceTypes |= FrameSourceTypes_LongExposureInfrared;
  149.  
  150.     res = kinect->OpenMultiSourceFrameReader(frameSourceTypes, &multisourceFrameReader);
  151.     if (res != S_OK) {
  152.         lastErrorMessage = "Unable to open input stream!";
  153.         return false;
  154.     }
  155.  
  156.     res = multisourceFrameReader->SubscribeMultiSourceFrameArrived(&hFrameWaitable);
  157.     if (res != S_OK) {
  158.         lastErrorMessage = "Unable to register waitable handle!";
  159.         return false;
  160.     }  
  161.  
  162.     return true;
  163. }
  164.  
  165. // stopAcquisition
  166. bool Kinect2Manager::stopAcquisition() {
  167.     HRESULT res;
  168.     res = kinect->Close();
  169.     if (res != S_OK) {
  170.         lastErrorMessage = "Unable to stop acquisition!";
  171.         return false;
  172.     }
  173.    
  174.     return true;
  175. }
  176.  
  177. // grabSingleFrame
  178. bool Kinect2Manager::grabSingleFrame(unsigned short* depthData, unsigned char* colorData) {
  179.     IFrameDescription *depthFrameDescription;
  180.     IFrameDescription *colorFrameDescription;
  181.     IMultiSourceFrameReference *frameReference;
  182.     IColorFrameReference* colorFrameReference;
  183.     IColorFrame* colorFrame;
  184.     IMultiSourceFrame* frame;
  185.     IDepthFrame *depthFrame;
  186.     IDepthFrameReference *depthFrameReference;
  187.     //IDepthFrameArrivedEventArgs *args;
  188.     IMultiSourceFrameArrivedEventArgs* frameArgs;
  189.     HRESULT res = S_OK;
  190.     lastErrorMessage = "";
  191.  
  192.     // Wait for frame ready
  193.     WaitForSingleObject(hEvents, INFINITE);
  194.     //WaitForMultipleObjects(1, &hEvents, true, INFINITE);
  195.     res = multisourceFrameReader->GetMultiSourceFrameArrivedEventData(hFrameWaitable, &frameArgs);
  196.     if (res == S_OK) {
  197.         // Grab multi source frame reference
  198.         res = frameArgs->get_FrameReference(&frameReference);
  199.         if (res == S_OK) {
  200.             // Grab multi source frame
  201.             res = frameReference->AcquireFrame(&frame);
  202.             if (res == S_OK) {
  203.                 if (acquireDepth) {
  204.                     //res = depthFrameReader->GetFrameArrivedEventData(hFrameWaitable, &args);
  205.                     //if (res == S_OK) {
  206.                     //args->get_FrameReference(&depthFrameReference);
  207.                     frame->get_DepthFrameReference(&depthFrameReference);
  208.                     if (res == S_OK) {
  209.                         res = depthFrameReference->AcquireFrame(&depthFrame);
  210.                         //res = depthFrameReader->AcquireLatestFrame(&depthFrame);
  211.                         if (res == S_OK) {
  212.                             // Control frame validity
  213.                             res = depthFrame->get_FrameDescription(&depthFrameDescription);
  214.                             if (res == S_OK) {
  215.                                 int width, height;
  216.                                 res = depthFrameDescription->get_Width(&width);
  217.                                 if (res != S_OK)
  218.                                     lastErrorMessage = "Unable to retrieve depth frame width!";
  219.                                 res = depthFrameDescription->get_Height(&height);
  220.                                 if (res != S_OK)
  221.                                     lastErrorMessage = "Unable to retrieve depth frame height!";
  222.                                 if (res == S_OK) {
  223.                                     // Frame valid; copy depth to buffer
  224.                                     res = depthFrame->CopyFrameDataToArray(512 * 424, depthData);
  225.                                     if (res != S_OK)
  226.                                         lastErrorMessage = "Unable to copy depth data to the buffer!";
  227.                                 }
  228.                                 else
  229.                                     lastErrorMessage = "Received invalid depth frame!";
  230.  
  231.                                 SafeRelease(depthFrameDescription);
  232.                             }
  233.                             else
  234.                                 lastErrorMessage = "Unable to retrieve depth frame description!";
  235.  
  236.                             SafeRelease(depthFrame);
  237.                         }
  238.                         else
  239.                             lastErrorMessage = "Unable to get depth map from frame!";
  240.                     }
  241.                     else
  242.                         lastErrorMessage = "Unable to get depth frame reference!";
  243.  
  244.                     SafeRelease(depthFrameReference);
  245.                     //}
  246.                     //else
  247.                     //lastErrorMessage = "Unable to manage frame arrived event!";
  248.                 } // End acquire depth
  249.  
  250.                 if (acquireColor) {
  251.                     //res = depthFrameReader->GetFrameArrivedEventData(hFrameWaitable, &args);
  252.                     //if (res == S_OK) {
  253.                     //args->get_FrameReference(&depthFrameReference);
  254.                     frame->get_ColorFrameReference(&colorFrameReference);
  255.                     if (res == S_OK) {
  256.                         res = colorFrameReference->AcquireFrame(&colorFrame);
  257.                         //res = depthFrameReader->AcquireLatestFrame(&depthFrame);
  258.                         if (res == S_OK) {
  259.                             // Control frame validity
  260.                             res = colorFrame->get_FrameDescription(&colorFrameDescription);
  261.                             if (res == S_OK) {
  262.                                 int width, height;
  263.                                 res = colorFrameDescription->get_Width(&width);
  264.                                 if (res != S_OK)
  265.                                     lastErrorMessage = "Unable to retrieve color frame width!";
  266.                                 res = colorFrameDescription->get_Height(&height);
  267.                                 if (res != S_OK)
  268.                                     lastErrorMessage = "Unable to retrieve color frame height!";
  269.                                 if (res == S_OK) {
  270.                                     // Frame valid; copy color data to buffer
  271.                                     res = colorFrame->CopyConvertedFrameDataToArray(1920 * 1080*4, colorData, ColorImageFormat_Bgra);              
  272.                                     if (res != S_OK)
  273.                                         lastErrorMessage = "Unable to copy color data to the buffer!";
  274.                                 }
  275.                                 else
  276.                                     lastErrorMessage = "Received invalid color frame!";
  277.  
  278.                                 SafeRelease(colorFrameDescription);
  279.                             }
  280.                             else
  281.                                 lastErrorMessage = "Unable to retrieve color frame description!";
  282.  
  283.                             SafeRelease(colorFrame);
  284.                         }
  285.                         else
  286.                             lastErrorMessage = "Unable to get color image from frame!";
  287.                     }
  288.                     else
  289.                         lastErrorMessage = "Unable to get color frame reference!";
  290.  
  291.                     SafeRelease(colorFrameReference);
  292.                     //}
  293.                     //else
  294.                     //lastErrorMessage = "Unable to manage frame arrived event!";
  295.                 } // End acquire depth
  296.             }
  297.             else
  298.                 lastErrorMessage = "Error grabbing multi source frame!";       
  299.         }
  300.         else
  301.             lastErrorMessage = "Error grabbing multi source frame reference!";
  302.         SafeRelease(frameReference);           
  303.     }
  304.     else
  305.         lastErrorMessage = "Error reading arrived frame event!";   
  306.  
  307.     SafeRelease(frameArgs);
  308.  
  309.     return res == S_OK;
  310. }
  311.  
  312. // getDepthIntrinsics
  313. CameraIntrinsics Kinect2Manager::getDepthIntrinsics() {
  314.     return cameraIntrinsics;
  315. };
  316.  
  317. // acquireDepthData
  318. void Kinect2Manager::acquireDepthData(bool flag) {
  319.     acquireDepth = flag;
  320. }
  321.  
  322. // acquireColorData
  323. void Kinect2Manager::acquireColorData(bool flag) {
  324.     acquireColor = flag;
  325. }
  326.  
  327. // acquireInfraredData
  328. void Kinect2Manager::acquireInfraredData(bool flag) {
  329.     acquireInfrared = flag;
  330. }
  331.  
  332. // acquireLongExposureInfraredData
  333. void Kinect2Manager::acquireLongExposureInfraredData(bool flag) {
  334.     acquireLongExposureInfrared = flag;
  335. }
Add Comment
Please, Sign In to add comment