Community
cancel
Showing results for 
Search instead for 
Did you mean: 
Gaofeng_L_
Beginner
61 Views

QueryStreamProfileSet returns PXC__STATUS ITEM UNAVAILAB

Hi, Guys,

     I'm using the F200 and visual studio 2012 to develop object tracking algorithm. But I have problem when I try to obtain the image data. When I use the QueryStreamProfileSet function to get a ProfileSet, it always returns PXC_STATUS_ITEM_UNAVAILABLE.

     I'm sure that my SDK and the camera works well. Because when I use the demo provided by SDK, I can get the image show. But now I don't want to use the PXCSenseManager and I want to get the image and processing it using OpenCV. My code are attached (I learned this code from the other forum and it works for R200 camera). Also, I can find my camera by IUID and the available stream type is COLOR, DEPTH, and IR. But when I call the QueryStreamProfileSet function, it always returns PXC_STATUS_ITEM_UNAVAILABLE.

    Could someone help me check what's wrong? Did I miss some crucial steps?

 

#include <windows.h>
#include "iostream"
#include "resource.h"
#include "pxcdefs.h"
#include <cv.h>
#include <highgui.h>

using namespace std;
using namespace cv;

pxcStatus retStatus; //函数的返回状态
PXCSession *Session = PXCSession::CreateInstance();
pxcUID f200_iuid = 1129862729;
#define F200_IUID f200_iuid;//需要测试才能知道这个值是多少

/**
**查找设备,获取并初始化指定摄像头的Device接口
**/
PXCCapture::Device* ImplSeek(pxcUID iuid){
	cout<<"Destination IUID:"<<iuid<<endl;
	PXCCapture *Capture;
	PXCCapture::Device *rsDevice = NULL;
	for(uint_fast8_t idx = 0; idx < UINT_FAST8_MAX; idx += 1){
		PXCSession::ImplDesc Impl = {};
		Impl.group = PXCSession::IMPL_GROUP_SENSOR;
		Impl.subgroup = PXCSession::IMPL_SUBGROUP_VIDEO_CAPTURE;
		retStatus = Session->QueryImpl(&Impl, idx, &Impl);
		if(retStatus < PXC_STATUS_NO_ERROR)
			continue;
		cout<<"-------------------------------------------"<<endl;
		wcout<<"DCM:"<<Impl.friendlyName<<endl;
		cout<<"***IUID is:"<<Impl.iuid<<endl;
		retStatus = Session->CreateImpl(&Impl, &Capture);
		if(retStatus < PXC_STATUS_NO_ERROR)
			continue;
		PXCCapture::DeviceInfo dinfo = { 0 };
		retStatus = Capture->QueryDeviceInfo(idx, &dinfo);
		if(retStatus < PXC_STATUS_NO_ERROR){
			cout<<"Detail Information:Fail to query device"<<endl;
			continue;
		}
		wcout<<"Details:"<<endl;
		wcout<<"Name:"<<dinfo.name<<", DCM index:"<<dinfo.didx<<endl;
		wcout<<"Available Stream Type: ";
		if(dinfo.streams & PXCCapture::STREAM_TYPE_COLOR)
			cout<<"COLOR";
		if(dinfo.streams & PXCCapture::STREAM_TYPE_DEPTH)
			cout<<", DEPTH";
		if(dinfo.streams & PXCCapture::STREAM_TYPE_IR)
			cout<<", IR";
		if(dinfo.streams & PXCCapture::STREAM_TYPE_LEFT)
			cout<<", LEFT";
		if(dinfo.streams & PXCCapture::STREAM_TYPE_RIGHT)
			cout<<", RIGHT.";
		cout<<endl;
		wcout<<"---firmware version:V---"<<dinfo.firmware[0]<<"."<<dinfo.firmware[1]<<"."<<dinfo.firmware[2]<<"."<<dinfo.firmware[3]<<endl;//顺便检查一下是否要升级
		wcout<<"---serial: -----"<<dinfo.serial<<endl; //
		wcout<<"---did:----"<<dinfo.did<<endl;
		if(Impl.iuid != iuid){
			cout<<"The IUID of this device is not matched"<<endl;
			continue;
		}
		cout<<"================================================"<<endl;
		wcout<<"Bingo! Find the matched device:"<<Capture->DeviceModelToString(dinfo.model)<<".  "<<endl;
		rsDevice = Capture->CreateDevice(idx);//connected to the device
		if(rsDevice == NULL){
				cout<<"rsDevice is NULL"<<endl;
				continue;
		}
		return rsDevice;
	}
	if(rsDevice == NULL){
		cout<<"\nNo matched device"<<endl;
	}
	return NULL;
}

/**
**Initial Stream Type
**/
void StreamInit(int Profile_idx, PXCCapture::Device *dstDevice, bool Dualeye){
	PXCCapture::Device::StreamProfileSet ProfileSet = {};
	if(Dualeye){
		PXCCapture::StreamType scope = PXCCapture::STREAM_TYPE_COLOR | PXCCapture::STREAM_TYPE_DEPTH | PXCCapture::STREAM_TYPE_LEFT | PXCCapture::STREAM_TYPE_RIGHT;
		retStatus = dstDevice->QueryStreamProfileSet(scope, Profile_idx, &ProfileSet);
		if(retStatus == PXC_STATUS_ITEM_UNAVAILABLE){
				cout<<"Item not find"<<endl;
				exit(0);
		}
		ProfileSet.color.options = ProfileSet.depth.options = ProfileSet.right.options = ProfileSet.left.options = PXCCapture::Device::STREAM_OPTION_STRONG_STREAM_SYNC;
	}else{
		PXCCapture::StreamType scope = PXCCapture::STREAM_TYPE_COLOR | PXCCapture::STREAM_TYPE_DEPTH | PXCCapture::STREAM_TYPE_IR;
        dstDevice->QueryStreamProfileSet(scope, Profile_idx, &ProfileSet);
        ProfileSet.color.options = ProfileSet.depth.options = ProfileSet.ir.options = PXCCapture::Device::STREAM_OPTION_STRONG_STREAM_SYNC;
	}

	if(dstDevice->IsStreamProfileSetValid(&ProfileSet)){
		dstDevice->SetStreamProfileSet(&ProfileSet);
		cout<<"Ready"<<endl;
	}else{
		cout<<"Bad ProfileSet"<<endl;
	}
}

struct Frames{
	Mat Color;//RGB image matrix
	Mat Depth;//depth image matrix
	Mat IR;//IR image matrix
	Mat IR_;
};

Frames Update(PXCCapture::Device *Device, bool Dualeye = true, PXCCapture::StreamType scope = PXCCapture::STREAM_TYPE_COLOR | PXCCapture::STREAM_TYPE_DEPTH){
	PXCCapture::Sample FrameSamples;
	PXCImage::ImageData color8, depth16, _ir, biol16, bior16;
	retStatus = Device->ReadStreams(scope, &FrameSamples);
	if(retStatus < PXC_STATUS_NO_ERROR){
		cout<<"ReadStreams Error"<<endl;
		exit(0);
	}
	Frames frames;
	if(Dualeye){
		#pragma region dualeye
		if(scope & PXCCapture::STREAM_TYPE_COLOR){
			FrameSamples.color->AcquireAccess(PXCImage::ACCESS_READ, PXCImage::PIXEL_FORMAT_RGB24,PXCImage::ROTATION_0_DEGREE, PXCImage::OPTION_ANY, &color8);
			Mat Color(Size(320,240), CV_8UC3, color8.planes[0]);
			frames.Color = Color;
			FrameSamples.color->ReleaseAccess(&color8);
		}
		if(scope & PXCCapture::STREAM_TYPE_DEPTH){
			FrameSamples.depth->AcquireAccess(PXCImage::ACCESS_READ, PXCImage::PIXEL_FORMAT_DEPTH,PXCImage::ROTATION_0_DEGREE, PXCImage::OPTION_ANY, &depth16);
			Mat Depth(Size(320,240), CV_16UC1, depth16.planes[0]);
			frames.Depth = Depth;
			FrameSamples.depth->ReleaseAccess(&depth16);
		}
		if (scope & PXCCapture::STREAM_TYPE_LEFT)
        {
            FrameSamples.left->AcquireAccess(PXCImage::ACCESS_READ, PXCImage::PIXEL_FORMAT_Y16, PXCImage::ROTATION_0_DEGREE, PXCImage::OPTION_ANY, &biol16);
            Mat StroL(Size(320, 240), CV_16UC1, biol16.planes[0]); 
			frames.IR = StroL;
            FrameSamples.left->ReleaseAccess(&biol16);
        }
        if (scope & PXCCapture::STREAM_TYPE_RIGHT)
        {
            FrameSamples.right->AcquireAccess(PXCImage::ACCESS_READ, PXCImage::PIXEL_FORMAT_Y16, PXCImage::ROTATION_0_DEGREE, PXCImage::OPTION_ANY, &bior16);
            Mat StroR(Size(320, 240), CV_16UC1, bior16.planes[0]); 
			frames.IR_ = StroR;
            FrameSamples.right->ReleaseAccess(&bior16);
        }
		#pragma endregion
	}
	else
    {
        #pragma region _
        if (scope & PXCCapture::STREAM_TYPE_COLOR)
        {
            FrameSamples.color->AcquireAccess(PXCImage::ACCESS_READ, PXCImage::PIXEL_FORMAT_RGB24, PXCImage::ROTATION_0_DEGREE, PXCImage::OPTION_ANY, &color8);
            Mat Color(Size(640, 480), CV_8UC3, color8.planes[0]); frames.Color = Color;
            FrameSamples.color->ReleaseAccess(&color8);
        }
        if (scope & PXCCapture::STREAM_TYPE_DEPTH)
        {
            FrameSamples.depth->AcquireAccess(PXCImage::ACCESS_READ, PXCImage::PIXEL_FORMAT_DEPTH, PXCImage::ROTATION_0_DEGREE, PXCImage::OPTION_ANY, &depth16);
            Mat Depth(Size(640, 480), CV_16UC1, depth16.planes[0]); frames.Depth = Depth;
            FrameSamples.depth->ReleaseAccess(&depth16);
        }
        if (scope & PXCCapture::STREAM_TYPE_IR)
        {
            FrameSamples.ir->AcquireAccess(PXCImage::ACCESS_READ, PXCImage::PIXEL_FORMAT_Y16, PXCImage::ROTATION_0_DEGREE, PXCImage::OPTION_ANY, &_ir);
            Mat _IR(Size(640, 480), CV_16UC1, _ir.planes[0]); frames.IR = _IR;
            FrameSamples.left->ReleaseAccess(&_ir);
        }
        #pragma endregion
    }
    FrameSamples.ReleaseImages(); 
	return(frames);
}

int main(){

	PXCCapture::Device *F200_Device;

	F200_Device = ImplSeek(f200_iuid);
	StreamInit(6, F200_Device, true);
	cout<<"Streaming..."<<endl;

	for(;;){
		Frames F200_rgbd = Update(F200_Device);
		Mat Depth8 = F200_rgbd.Depth.clone();
		(Depth8 /= 15).convertTo(Depth8, CV_8UC1, 1, 20);

		//show
		imshow("Depth8", Depth8);
		imshow("Color",F200_rgbd.Color);
		waitKey(1);
	}

	return 0;
}

 

0 Kudos
0 Replies
Reply