Home | History | Annotate | Download | only in src
      1 #ifdef HAVE_INTELPERC
      2 
      3 #include "cap_intelperc.hpp"
      4 
      5 namespace cv
      6 {
      7 
      8 ///////////////// IntelPerCStreamBase //////////////////
      9 
     10 IntelPerCStreamBase::IntelPerCStreamBase()
     11     : m_profileIdx(-1)
     12     , m_frameIdx(0)
     13     , m_timeStampStartNS(0)
     14 {
     15 }
     16 IntelPerCStreamBase::~IntelPerCStreamBase()
     17 {
     18 }
     19 
     20 bool IntelPerCStreamBase::isValid()
     21 {
     22     return (m_device.IsValid() && m_stream.IsValid());
     23 }
     24 bool IntelPerCStreamBase::grabFrame()
     25 {
     26     if (!m_stream.IsValid())
     27         return false;
     28     if (-1 == m_profileIdx)
     29     {
     30         if (!setProperty(CV_CAP_PROP_INTELPERC_PROFILE_IDX, 0))
     31             return false;
     32     }
     33     PXCSmartSP sp;
     34     m_pxcImage.ReleaseRef();
     35     if (PXC_STATUS_NO_ERROR > m_stream->ReadStreamAsync(&m_pxcImage, &sp))
     36         return false;
     37     if (PXC_STATUS_NO_ERROR > sp->Synchronize())
     38         return false;
     39     if (0 == m_timeStampStartNS)
     40         m_timeStampStartNS = m_pxcImage->QueryTimeStamp();
     41     m_timeStamp = (double)((m_pxcImage->QueryTimeStamp() - m_timeStampStartNS) / 10000);
     42     m_frameIdx++;
     43     return true;
     44 }
     45 int IntelPerCStreamBase::getProfileIDX() const
     46 {
     47     return m_profileIdx;
     48 }
     49 double IntelPerCStreamBase::getProperty(int propIdx) const
     50 {
     51     double ret = 0.0;
     52     switch (propIdx)
     53     {
     54     case CV_CAP_PROP_INTELPERC_PROFILE_COUNT:
     55         ret = (double)m_profiles.size();
     56         break;
     57     case CV_CAP_PROP_FRAME_WIDTH :
     58         if ((0 <= m_profileIdx) && (m_profileIdx < m_profiles.size()))
     59             ret = (double)m_profiles[m_profileIdx].imageInfo.width;
     60         break;
     61     case CV_CAP_PROP_FRAME_HEIGHT :
     62         if ((0 <= m_profileIdx) && (m_profileIdx < m_profiles.size()))
     63             ret = (double)m_profiles[m_profileIdx].imageInfo.height;
     64         break;
     65     case CV_CAP_PROP_FPS :
     66         if ((0 <= m_profileIdx) && (m_profileIdx < m_profiles.size()))
     67         {
     68             ret = ((double)m_profiles[m_profileIdx].frameRateMin.numerator / (double)m_profiles[m_profileIdx].frameRateMin.denominator
     69                     + (double)m_profiles[m_profileIdx].frameRateMax.numerator / (double)m_profiles[m_profileIdx].frameRateMax.denominator) / 2.0;
     70         }
     71         break;
     72     case CV_CAP_PROP_POS_FRAMES:
     73         ret  = (double)m_frameIdx;
     74         break;
     75     case CV_CAP_PROP_POS_MSEC:
     76         ret  = m_timeStamp;
     77         break;
     78     };
     79     return ret;
     80 }
     81 bool IntelPerCStreamBase::setProperty(int propIdx, double propVal)
     82 {
     83     bool isSet = false;
     84     switch (propIdx)
     85     {
     86     case CV_CAP_PROP_INTELPERC_PROFILE_IDX:
     87         {
     88             int propValInt = (int)propVal;
     89             if (0 > propValInt)
     90             {
     91                 m_profileIdx = propValInt;
     92                 isSet = true;
     93             }
     94             else if (propValInt < m_profiles.size())
     95             {
     96                 if (m_profileIdx != propValInt)
     97                 {
     98                     m_profileIdx = propValInt;
     99                     if (m_stream.IsValid())
    100                         m_stream->SetProfile(&m_profiles[m_profileIdx]);
    101                     m_frameIdx = 0;
    102                     m_timeStampStartNS = 0;
    103                 }
    104                 isSet = true;
    105             }
    106         }
    107         break;
    108     };
    109     return isSet;
    110 }
    111 bool IntelPerCStreamBase::initDevice(PXCSession *session)
    112 {
    113     if (NULL == session)
    114         return false;
    115 
    116     pxcStatus sts = PXC_STATUS_NO_ERROR;
    117     PXCSession::ImplDesc templat;
    118     memset(&templat,0,sizeof(templat));
    119     templat.group   = PXCSession::IMPL_GROUP_SENSOR;
    120     templat.subgroup= PXCSession::IMPL_SUBGROUP_VIDEO_CAPTURE;
    121 
    122     for (int modidx = 0; PXC_STATUS_NO_ERROR <= sts; modidx++)
    123     {
    124         PXCSession::ImplDesc desc;
    125         sts = session->QueryImpl(&templat, modidx, &desc);
    126         if (PXC_STATUS_NO_ERROR > sts)
    127             break;
    128 
    129         PXCSmartPtr<PXCCapture> capture;
    130         sts = session->CreateImpl<PXCCapture>(&desc, &capture);
    131         if (!capture.IsValid())
    132             continue;
    133 
    134         /* enumerate devices */
    135         for (int devidx = 0; PXC_STATUS_NO_ERROR <= sts; devidx++)
    136         {
    137             PXCSmartPtr<PXCCapture::Device> device;
    138             sts = capture->CreateDevice(devidx, &device);
    139             if (PXC_STATUS_NO_ERROR <= sts)
    140             {
    141                 m_device = device.ReleasePtr();
    142                 return true;
    143             }
    144         }
    145     }
    146     return false;
    147 }
    148 
    149 void IntelPerCStreamBase::initStreamImpl(PXCImage::ImageType type)
    150 {
    151     if (!m_device.IsValid())
    152         return;
    153 
    154     pxcStatus sts = PXC_STATUS_NO_ERROR;
    155     /* enumerate streams */
    156     for (int streamidx = 0; PXC_STATUS_NO_ERROR <= sts; streamidx++)
    157     {
    158         PXCCapture::Device::StreamInfo sinfo;
    159         sts = m_device->QueryStream(streamidx, &sinfo);
    160         if (PXC_STATUS_NO_ERROR > sts)
    161             break;
    162         if (PXCCapture::VideoStream::CUID != sinfo.cuid)
    163             continue;
    164         if (type != sinfo.imageType)
    165             continue;
    166 
    167         sts = m_device->CreateStream<PXCCapture::VideoStream>(streamidx, &m_stream);
    168         if (PXC_STATUS_NO_ERROR == sts)
    169             break;
    170         m_stream.ReleaseRef();
    171     }
    172 }
    173 bool IntelPerCStreamBase::validProfile(const PXCCapture::VideoStream::ProfileInfo& /*pinfo*/)
    174 {
    175     return true;
    176 }
    177 void IntelPerCStreamBase::enumProfiles()
    178 {
    179     m_profiles.clear();
    180     if (!m_stream.IsValid())
    181         return;
    182     pxcStatus sts = PXC_STATUS_NO_ERROR;
    183     for (int profidx = 0; PXC_STATUS_NO_ERROR <= sts; profidx++)
    184     {
    185         PXCCapture::VideoStream::ProfileInfo pinfo;
    186         sts = m_stream->QueryProfile(profidx, &pinfo);
    187         if (PXC_STATUS_NO_ERROR > sts)
    188             break;
    189         if (validProfile(pinfo))
    190             m_profiles.push_back(pinfo);
    191     }
    192 }
    193 
    194 ///////////////// IntelPerCStreamImage //////////////////
    195 
    196 IntelPerCStreamImage::IntelPerCStreamImage()
    197 {
    198 }
    199 IntelPerCStreamImage::~IntelPerCStreamImage()
    200 {
    201 }
    202 
    203 bool IntelPerCStreamImage::initStream(PXCSession *session)
    204 {
    205     if (!initDevice(session))
    206         return false;
    207     initStreamImpl(PXCImage::IMAGE_TYPE_COLOR);
    208     if (!m_stream.IsValid())
    209         return false;
    210     enumProfiles();
    211     return true;
    212 }
    213 double IntelPerCStreamImage::getProperty(int propIdx) const
    214 {
    215     switch (propIdx)
    216     {
    217     case CV_CAP_PROP_BRIGHTNESS:
    218         {
    219             if (!m_device.IsValid())
    220                 return 0.0;
    221             float fret = 0.0f;
    222             if (PXC_STATUS_NO_ERROR == m_device->QueryProperty(PXCCapture::Device::PROPERTY_COLOR_BRIGHTNESS, &fret))
    223                 return (double)fret;
    224             return 0.0;
    225         }
    226         break;
    227     case CV_CAP_PROP_CONTRAST:
    228         {
    229             if (!m_device.IsValid())
    230                 return 0.0;
    231             float fret = 0.0f;
    232             if (PXC_STATUS_NO_ERROR == m_device->QueryProperty(PXCCapture::Device::PROPERTY_COLOR_CONTRAST, &fret))
    233                 return (double)fret;
    234             return 0.0;
    235         }
    236         break;
    237     case CV_CAP_PROP_SATURATION:
    238         {
    239             if (!m_device.IsValid())
    240                 return 0.0;
    241             float fret = 0.0f;
    242             if (PXC_STATUS_NO_ERROR == m_device->QueryProperty(PXCCapture::Device::PROPERTY_COLOR_SATURATION, &fret))
    243                 return (double)fret;
    244             return 0.0;
    245         }
    246         break;
    247     case CV_CAP_PROP_HUE:
    248         {
    249             if (!m_device.IsValid())
    250                 return 0.0;
    251             float fret = 0.0f;
    252             if (PXC_STATUS_NO_ERROR == m_device->QueryProperty(PXCCapture::Device::PROPERTY_COLOR_HUE, &fret))
    253                 return (double)fret;
    254             return 0.0;
    255         }
    256         break;
    257     case CV_CAP_PROP_GAMMA:
    258         {
    259             if (!m_device.IsValid())
    260                 return 0.0;
    261             float fret = 0.0f;
    262             if (PXC_STATUS_NO_ERROR == m_device->QueryProperty(PXCCapture::Device::PROPERTY_COLOR_GAMMA, &fret))
    263                 return (double)fret;
    264             return 0.0;
    265         }
    266         break;
    267     case CV_CAP_PROP_SHARPNESS:
    268         {
    269             if (!m_device.IsValid())
    270                 return 0.0;
    271             float fret = 0.0f;
    272             if (PXC_STATUS_NO_ERROR == m_device->QueryProperty(PXCCapture::Device::PROPERTY_COLOR_SHARPNESS, &fret))
    273                 return (double)fret;
    274             return 0.0;
    275         }
    276         break;
    277     case CV_CAP_PROP_GAIN:
    278         {
    279             if (!m_device.IsValid())
    280                 return 0.0;
    281             float fret = 0.0f;
    282             if (PXC_STATUS_NO_ERROR == m_device->QueryProperty(PXCCapture::Device::PROPERTY_COLOR_GAIN, &fret))
    283                 return (double)fret;
    284             return 0.0;
    285         }
    286         break;
    287     case CV_CAP_PROP_BACKLIGHT:
    288         {
    289             if (!m_device.IsValid())
    290                 return 0.0;
    291             float fret = 0.0f;
    292             if (PXC_STATUS_NO_ERROR == m_device->QueryProperty(PXCCapture::Device::PROPERTY_COLOR_BACK_LIGHT_COMPENSATION, &fret))
    293                 return (double)fret;
    294             return 0.0;
    295         }
    296         break;
    297     case CV_CAP_PROP_EXPOSURE:
    298         {
    299             if (!m_device.IsValid())
    300                 return 0.0;
    301             float fret = 0.0f;
    302             if (PXC_STATUS_NO_ERROR == m_device->QueryProperty(PXCCapture::Device::PROPERTY_COLOR_EXPOSURE, &fret))
    303                 return (double)fret;
    304             return 0.0;
    305         }
    306         break;
    307     //Add image stream specific properties
    308     }
    309     return IntelPerCStreamBase::getProperty(propIdx);
    310 }
    311 bool IntelPerCStreamImage::setProperty(int propIdx, double propVal)
    312 {
    313     switch (propIdx)
    314     {
    315     case CV_CAP_PROP_BRIGHTNESS:
    316         {
    317             if (!m_device.IsValid())
    318                 return false;
    319             return (PXC_STATUS_NO_ERROR == m_device->SetProperty(PXCCapture::Device::PROPERTY_COLOR_BRIGHTNESS, (float)propVal));
    320         }
    321         break;
    322     case CV_CAP_PROP_CONTRAST:
    323         {
    324             if (!m_device.IsValid())
    325                 return false;
    326             return (PXC_STATUS_NO_ERROR == m_device->SetProperty(PXCCapture::Device::PROPERTY_COLOR_CONTRAST, (float)propVal));
    327         }
    328         break;
    329     case CV_CAP_PROP_SATURATION:
    330         {
    331             if (!m_device.IsValid())
    332                 return false;
    333             return (PXC_STATUS_NO_ERROR == m_device->SetProperty(PXCCapture::Device::PROPERTY_COLOR_SATURATION, (float)propVal));
    334         }
    335         break;
    336     case CV_CAP_PROP_HUE:
    337         {
    338             if (!m_device.IsValid())
    339                 return false;
    340             return (PXC_STATUS_NO_ERROR == m_device->SetProperty(PXCCapture::Device::PROPERTY_COLOR_HUE, (float)propVal));
    341         }
    342         break;
    343     case CV_CAP_PROP_GAMMA:
    344         {
    345             if (!m_device.IsValid())
    346                 return false;
    347             return (PXC_STATUS_NO_ERROR == m_device->SetProperty(PXCCapture::Device::PROPERTY_COLOR_GAMMA, (float)propVal));
    348         }
    349         break;
    350     case CV_CAP_PROP_SHARPNESS:
    351         {
    352             if (!m_device.IsValid())
    353                 return false;
    354             return (PXC_STATUS_NO_ERROR == m_device->SetProperty(PXCCapture::Device::PROPERTY_COLOR_SHARPNESS, (float)propVal));
    355         }
    356         break;
    357     case CV_CAP_PROP_GAIN:
    358         {
    359             if (!m_device.IsValid())
    360                 return false;
    361             return (PXC_STATUS_NO_ERROR == m_device->SetProperty(PXCCapture::Device::PROPERTY_COLOR_GAIN, (float)propVal));
    362         }
    363         break;
    364     case CV_CAP_PROP_BACKLIGHT:
    365         {
    366             if (!m_device.IsValid())
    367                 return false;
    368             return (PXC_STATUS_NO_ERROR == m_device->SetProperty(PXCCapture::Device::PROPERTY_COLOR_BACK_LIGHT_COMPENSATION, (float)propVal));
    369         }
    370         break;
    371     case CV_CAP_PROP_EXPOSURE:
    372         {
    373             if (!m_device.IsValid())
    374                 return false;
    375             return (PXC_STATUS_NO_ERROR == m_device->SetProperty(PXCCapture::Device::PROPERTY_COLOR_EXPOSURE, (float)propVal));
    376         }
    377         break;
    378     //Add image stream specific properties
    379     }
    380     return IntelPerCStreamBase::setProperty(propIdx, propVal);
    381 }
    382 bool IntelPerCStreamImage::retrieveAsOutputArray(cv::OutputArray image)
    383 {
    384     if (!m_pxcImage.IsValid())
    385         return false;
    386     PXCImage::ImageInfo info;
    387     m_pxcImage->QueryInfo(&info);
    388 
    389     PXCImage::ImageData data;
    390     m_pxcImage->AcquireAccess(PXCImage::ACCESS_READ, PXCImage::COLOR_FORMAT_RGB24, &data);
    391 
    392     if (PXCImage::SURFACE_TYPE_SYSTEM_MEMORY != data.type)
    393         return false;
    394 
    395     cv::Mat temp(info.height, info.width, CV_8UC3, data.planes[0], data.pitches[0]);
    396     temp.copyTo(image);
    397 
    398     m_pxcImage->ReleaseAccess(&data);
    399     return true;
    400 }
    401 
    402 ///////////////// IntelPerCStreamDepth //////////////////
    403 
    404 IntelPerCStreamDepth::IntelPerCStreamDepth()
    405 {
    406 }
    407 IntelPerCStreamDepth::~IntelPerCStreamDepth()
    408 {
    409 }
    410 
    411 bool IntelPerCStreamDepth::initStream(PXCSession *session)
    412 {
    413     if (!initDevice(session))
    414         return false;
    415     initStreamImpl(PXCImage::IMAGE_TYPE_DEPTH);
    416     if (!m_stream.IsValid())
    417         return false;
    418     enumProfiles();
    419     return true;
    420 }
    421 double IntelPerCStreamDepth::getProperty(int propIdx) const
    422 {
    423     switch (propIdx)
    424     {
    425     case CV_CAP_PROP_INTELPERC_DEPTH_LOW_CONFIDENCE_VALUE:
    426         {
    427             if (!m_device.IsValid())
    428                 return 0.0;
    429             float fret = 0.0f;
    430             if (PXC_STATUS_NO_ERROR == m_device->QueryProperty(PXCCapture::Device::PROPERTY_DEPTH_LOW_CONFIDENCE_VALUE, &fret))
    431                 return (double)fret;
    432             return 0.0;
    433         }
    434         break;
    435     case CV_CAP_PROP_INTELPERC_DEPTH_SATURATION_VALUE:
    436         {
    437             if (!m_device.IsValid())
    438                 return 0.0;
    439             float fret = 0.0f;
    440             if (PXC_STATUS_NO_ERROR == m_device->QueryProperty(PXCCapture::Device::PROPERTY_DEPTH_SATURATION_VALUE, &fret))
    441                 return (double)fret;
    442             return 0.0;
    443         }
    444         break;
    445     case CV_CAP_PROP_INTELPERC_DEPTH_CONFIDENCE_THRESHOLD:
    446         {
    447             if (!m_device.IsValid())
    448                 return 0.0;
    449             float fret = 0.0f;
    450             if (PXC_STATUS_NO_ERROR == m_device->QueryProperty(PXCCapture::Device::PROPERTY_DEPTH_CONFIDENCE_THRESHOLD, &fret))
    451                 return (double)fret;
    452             return 0.0;
    453         }
    454         break;
    455     case CV_CAP_PROP_INTELPERC_DEPTH_FOCAL_LENGTH_HORZ:
    456         {
    457             if (!m_device.IsValid())
    458                 return 0.0f;
    459             PXCPointF32 ptf;
    460             if (PXC_STATUS_NO_ERROR == m_device->QueryPropertyAsPoint(PXCCapture::Device::PROPERTY_DEPTH_FOCAL_LENGTH, &ptf))
    461                 return (double)ptf.x;
    462             return 0.0;
    463         }
    464         break;
    465     case CV_CAP_PROP_INTELPERC_DEPTH_FOCAL_LENGTH_VERT:
    466         {
    467             if (!m_device.IsValid())
    468                 return 0.0f;
    469             PXCPointF32 ptf;
    470             if (PXC_STATUS_NO_ERROR == m_device->QueryPropertyAsPoint(PXCCapture::Device::PROPERTY_DEPTH_FOCAL_LENGTH, &ptf))
    471                 return (double)ptf.y;
    472             return 0.0;
    473         }
    474         break;
    475         //Add depth stream sepcific properties
    476     }
    477     return IntelPerCStreamBase::getProperty(propIdx);
    478 }
    479 bool IntelPerCStreamDepth::setProperty(int propIdx, double propVal)
    480 {
    481     switch (propIdx)
    482     {
    483     case CV_CAP_PROP_INTELPERC_DEPTH_LOW_CONFIDENCE_VALUE:
    484         {
    485             if (!m_device.IsValid())
    486                 return false;
    487             return (PXC_STATUS_NO_ERROR == m_device->SetProperty(PXCCapture::Device::PROPERTY_DEPTH_LOW_CONFIDENCE_VALUE, (float)propVal));
    488         }
    489         break;
    490     case CV_CAP_PROP_INTELPERC_DEPTH_SATURATION_VALUE:
    491         {
    492             if (!m_device.IsValid())
    493                 return false;
    494             return (PXC_STATUS_NO_ERROR == m_device->SetProperty(PXCCapture::Device::PROPERTY_DEPTH_SATURATION_VALUE, (float)propVal));
    495         }
    496         break;
    497     case CV_CAP_PROP_INTELPERC_DEPTH_CONFIDENCE_THRESHOLD:
    498         {
    499             if (!m_device.IsValid())
    500                 return false;
    501             return (PXC_STATUS_NO_ERROR == m_device->SetProperty(PXCCapture::Device::PROPERTY_DEPTH_CONFIDENCE_THRESHOLD, (float)propVal));
    502         }
    503         break;
    504     //Add depth stream sepcific properties
    505     }
    506     return IntelPerCStreamBase::setProperty(propIdx, propVal);
    507 }
    508 bool IntelPerCStreamDepth::retrieveDepthAsOutputArray(cv::OutputArray image)
    509 {
    510     return retriveFrame(CV_16SC1, 0, image);
    511 }
    512 bool IntelPerCStreamDepth::retrieveIRAsOutputArray(cv::OutputArray image)
    513 {
    514     return retriveFrame(CV_16SC1, 1, image);
    515 }
    516 bool IntelPerCStreamDepth::retrieveUVAsOutputArray(cv::OutputArray image)
    517 {
    518     return retriveFrame(CV_32FC2, 2, image);
    519 }
    520 bool IntelPerCStreamDepth::validProfile(const PXCCapture::VideoStream::ProfileInfo& pinfo)
    521 {
    522     return (PXCImage::COLOR_FORMAT_DEPTH == pinfo.imageInfo.format);
    523 }
    524 bool IntelPerCStreamDepth::retriveFrame(int type, int planeIdx, cv::OutputArray frame)
    525 {
    526     if (!m_pxcImage.IsValid())
    527         return false;
    528     PXCImage::ImageInfo info;
    529     m_pxcImage->QueryInfo(&info);
    530 
    531     PXCImage::ImageData data;
    532     m_pxcImage->AcquireAccess(PXCImage::ACCESS_READ, &data);
    533 
    534     if (PXCImage::SURFACE_TYPE_SYSTEM_MEMORY != data.type)
    535         return false;
    536 
    537     cv::Mat temp(info.height, info.width, type, data.planes[planeIdx], data.pitches[planeIdx]);
    538     temp.copyTo(frame);
    539 
    540     m_pxcImage->ReleaseAccess(&data);
    541     return true;
    542 }
    543 
    544 ///////////////// VideoCapture_IntelPerC //////////////////
    545 
    546 VideoCapture_IntelPerC::VideoCapture_IntelPerC()
    547     : m_contextOpened(false)
    548 {
    549     pxcStatus sts = PXCSession_Create(&m_session);
    550     if (PXC_STATUS_NO_ERROR > sts)
    551         return;
    552     m_contextOpened = m_imageStream.initStream(m_session);
    553     m_contextOpened &= m_depthStream.initStream(m_session);
    554 }
    555 VideoCapture_IntelPerC::~VideoCapture_IntelPerC(){}
    556 
    557 double VideoCapture_IntelPerC::getProperty(int propIdx) const
    558 {
    559     double propValue = 0;
    560     int purePropIdx = propIdx & ~CV_CAP_INTELPERC_GENERATORS_MASK;
    561     if (CV_CAP_INTELPERC_IMAGE_GENERATOR == (propIdx & CV_CAP_INTELPERC_GENERATORS_MASK))
    562     {
    563         propValue = m_imageStream.getProperty(purePropIdx);
    564     }
    565     else if (CV_CAP_INTELPERC_DEPTH_GENERATOR == (propIdx & CV_CAP_INTELPERC_GENERATORS_MASK))
    566     {
    567         propValue = m_depthStream.getProperty(purePropIdx);
    568     }
    569     else
    570     {
    571         propValue = m_depthStream.getProperty(purePropIdx);
    572     }
    573     return propValue;
    574 }
    575 bool VideoCapture_IntelPerC::setProperty(int propIdx, double propVal)
    576 {
    577     bool isSet = false;
    578     int purePropIdx = propIdx & ~CV_CAP_INTELPERC_GENERATORS_MASK;
    579     if (CV_CAP_INTELPERC_IMAGE_GENERATOR == (propIdx & CV_CAP_INTELPERC_GENERATORS_MASK))
    580     {
    581         isSet = m_imageStream.setProperty(purePropIdx, propVal);
    582     }
    583     else if (CV_CAP_INTELPERC_DEPTH_GENERATOR == (propIdx & CV_CAP_INTELPERC_GENERATORS_MASK))
    584     {
    585         isSet = m_depthStream.setProperty(purePropIdx, propVal);
    586     }
    587     else
    588     {
    589         isSet = m_depthStream.setProperty(purePropIdx, propVal);
    590     }
    591     return isSet;
    592 }
    593 
    594 bool VideoCapture_IntelPerC::grabFrame()
    595 {
    596     if (!isOpened())
    597         return false;
    598 
    599     bool isGrabbed = false;
    600     if (m_depthStream.isValid())
    601         isGrabbed = m_depthStream.grabFrame();
    602     if ((m_imageStream.isValid()) && (-1 != m_imageStream.getProfileIDX()))
    603         isGrabbed &= m_imageStream.grabFrame();
    604 
    605     return isGrabbed;
    606 }
    607 bool VideoCapture_IntelPerC::retrieveFrame(int outputType, cv::OutputArray frame)
    608 {
    609     switch (outputType)
    610     {
    611     case CV_CAP_INTELPERC_DEPTH_MAP:
    612         return m_depthStream.retrieveDepthAsOutputArray(frame);
    613     case CV_CAP_INTELPERC_UVDEPTH_MAP:
    614         return m_depthStream.retrieveUVAsOutputArray(frame);
    615     case CV_CAP_INTELPERC_IR_MAP:
    616         return m_depthStream.retrieveIRAsOutputArray(frame);
    617     case CV_CAP_INTELPERC_IMAGE:
    618         return m_imageStream.retrieveAsOutputArray(frame);
    619     }
    620     return false;
    621 }
    622 int VideoCapture_IntelPerC::getCaptureDomain()
    623 {
    624     return CV_CAP_INTELPERC;
    625 }
    626 
    627 bool VideoCapture_IntelPerC::isOpened() const
    628 {
    629     return m_contextOpened;
    630 }
    631 
    632 }
    633 
    634 #endif //HAVE_INTELPERC
    635