Esempio n. 1
0
	void OpenNIRecorder::start( uint64_t nodeTypeFlags, std::string& filename )
	{
		XnStatus result;

		// Create recorder
		result = mRecorder.Create( *mDevice->getContext() );	//->CreateAnyProductionTree( XN_NODE_TYPE_RECORDER, NULL, mRecorder, &mErrors );
		CHECK_RC( result, "[Recorder]  Create recorder" );
		//CHECK_RC_ERR( result, "Create recorder", mErrors );

		result = mRecorder.SetDestination(XN_RECORD_MEDIUM_FILE, filename.c_str() );
		CHECK_RC( result, "[Recorder]  Set destination" );



		ImageGenerator* image = NULL;
		IRGenerator* ir = NULL;
		DepthGenerator* depth = NULL;
		if( nodeTypeFlags & NODE_TYPE_IMAGE )
		{
			image = mDevice->getImageGenerator();
			mRecorder.AddNodeToRecording( *image );	//, XN_CODEC_JPEG );
		}
		if( nodeTypeFlags & NODE_TYPE_IR )
		{
			ir = mDevice->getIRGenerator();
			mRecorder.AddNodeToRecording( *ir );	//, XN_CODEC_JPEG );
		}
		if( nodeTypeFlags & NODE_TYPE_DEPTH )
		{
			depth = mDevice->getDepthGenerator();
			mRecorder.AddNodeToRecording( *depth );	//, XN_CODEC_16Z_EMB_TABLES );
		}
		if( nodeTypeFlags & NODE_TYPE_USER )
		{
		}

		// Check for frame synchronization
		if( depth->IsCapabilitySupported( XN_CAPABILITY_FRAME_SYNC ) ) 
		{
			if( (mNodeFlags&NODE_TYPE_DEPTH) && (mNodeFlags&NODE_TYPE_IMAGE) )
			{
				if( depth->GetFrameSyncCap().CanFrameSyncWith( *image ) ) 
				{
					result = depth->GetFrameSyncCap().FrameSyncWith( *image );
					CHECK_RC( result, "Enable frame sync");
				}
			}
			else if( (mNodeFlags&NODE_TYPE_DEPTH) && (mNodeFlags&NODE_TYPE_IR) )
			{
				if( depth->GetFrameSyncCap().CanFrameSyncWith( *ir ) ) 
				{
					result = depth->GetFrameSyncCap().FrameSyncWith( *ir );
					CHECK_RC( result, "Enable frame sync");
				}
			}
		}


		// If everything is ok, set to record.
		mIsRecording = true;
		mIsPaused = false;
	}
Esempio n. 2
0
int Init()
{
	mostRecentRGB = 0;
	XnStatus rc;

	//Make sure our image types are the same as the OpenNI image types.
	assert(sizeof(XnRGB24Pixel) == sizeof(ColorPixel));
	assert(sizeof(XnDepthPixel) == sizeof(DepthPixel));
	assert(sizeof(XnStatus) == sizeof(int));

	// Load OpenNI xml settings
	char filePath[255];
	int length = Util::Helpers::GetExeDirectory(filePath, sizeof(filePath));
	filePath[length] = '\\';
	strcpy(&filePath[length+1], SAMPLE_XML_PATH);

	EnumerationErrors errors;
	rc = deviceContext.InitFromXmlFile(filePath, &errors);
	if (rc == XN_STATUS_NO_NODE_PRESENT)
	{
		//One reason would be if Microsoft SDK is installed beside PrimeSense.  Device manager should say PrimeSense instead of Microsoft Kinect.
		
		//XnChar strError[1024];
		//errors.ToString(strError, 1024);
		//LOGE("%s\n", strError);
		return -1;
	}
	else if (rc != XN_STATUS_OK)
	{
		fprintf(stderr, "%s\n", xnGetStatusString(rc));
		/*LOGE("Open failed: %s\n", xnGetStatusString(rc));*/
		return (rc);
	}

	// Retrieve colour and depth nodes
	rc = deviceContext.FindExistingNode(XN_NODE_TYPE_IMAGE, colorImageGenerator);
	rc = deviceContext.FindExistingNode(XN_NODE_TYPE_DEPTH, depthImageGenerator);

	// Set mirror mode to off
	SetMirrorMode(false);

	// Get a frame to perform checks on it
	ImageMetaData colorImageMetaData;
	DepthMetaData depthImageMetaData;
	depthImageGenerator.GetMetaData(depthImageMetaData);
	colorImageGenerator.GetMetaData(colorImageMetaData);

	//// Hybrid mode isn't supported in this sample
	//if (colorImageMetaData.FullXRes() != depthImageMetaData.FullXRes() || colorImageMetaData.FullYRes() != depthImageMetaData.FullYRes())
	//{
	//	/*LOGE("The device depth and image resolution must be equal!\n");*/
	//	return 1;
	//}

	// RGB is the only image format supported.
	if (colorImageMetaData.PixelFormat() != XN_PIXEL_FORMAT_RGB24)
	{
		/*LOGE("The device image format must be RGB24\n");*/
		return 1;
	}
	
	// Need to make sure the automatic alignment of colour and depth images is supported.
	XnBool isSupported = depthImageGenerator.IsCapabilitySupported("AlternativeViewPoint");
	if(!isSupported)
	{
		/*LOGE("Cannot set AlternativeViewPoint!\n");*/
		return 1;
	}

	
	// Set it to VGA maps at 30 FPS
	/*XnMapOutputMode mapMode;
	mapMode.nXRes = XN_VGA_X_RES;
	mapMode.nYRes = XN_VGA_Y_RES;
	mapMode.nFPS = 60;
	rc = g_depth.SetMapOutputMode(mapMode);
	if(rc)
	{
		LOGE("Failed to set depth map mode: %s\n", xnGetStatusString(rc));
		return 1;
	}
	mapMode.nFPS = 30;
	rc = g_image.SetMapOutputMode(mapMode);
	if(rc)
	{
		LOGE("Failed to set image map mode: %s\n", xnGetStatusString(rc));
		return 1;
	}*/


	// Set automatic alignment of the colour and depth images.
	rc = depthImageGenerator.GetAlternativeViewPointCap().SetViewPoint(colorImageGenerator);
	if(rc)
	{
		/*LOGE("Failed to set depth map mode: %s\n", xnGetStatusString(rc));*/
		return 1;
	}

	// Sync the two cameras so both frames arrive at the same time
	if(depthImageGenerator.IsCapabilitySupported("FrameSync"))
	{
		depthImageGenerator.GetFrameSyncCap().FrameSyncWith(colorImageGenerator);
	}

	return XN_STATUS_OK;
}