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