void ProcessFeature() { IHandTracker handTracker = null; Int16[] depthPixelData = null; Byte[] colorPixelData = null; Log.DebugFormat("Start processing {0}...", inputFile); int frameCount = replayer.GetFramesCount(); for (float i = 0; i < frameCount; i += sampleRate) { int index = (int)Math.Round(i); if (index >= frameCount) { break; } var skeletonFrame = replayer.GetSkeletonFrame(index); var depthFrame = replayer.GetDepthFrame(index); var colorFrame = replayer.GetColorFrame(index); if (handTracker == null) { handTracker = (IHandTracker)Activator.CreateInstance(handTrackerType, new Object[] { depthFrame.Width, depthFrame.Height, GetKinectParams(), bufferSize }); } if (featureProcessor == null) { featureProcessor = (IFeatureProcessor)Activator.CreateInstance( featureProcessorType, new Object[] { sampleRate }); } if (depthPixelData == null) { depthPixelData = new Int16[depthFrame.PixelDataLength]; } if (colorPixelData == null) { colorPixelData = new Byte[colorFrame.PixelDataLength]; } depthFrame.CopyPixelDataTo(depthPixelData); colorFrame.CopyPixelDataTo(colorPixelData); var skeleton = SkeletonUtil.FirstTrackedSkeleton(skeletonFrame.Skeletons); var result = handTracker.Update(depthPixelData, colorPixelData, skeleton); Option <Array> feature = featureProcessor.Compute(result); if (feature.IsSome) { if (replayerType == typeof(KinectAllFramesReplay)) { frameList.Add(depthFrame.GetFrameNumber()); } else { int curIndex = (int)Math.Round(i - sampleRate * (bufferSize - 1)); frameList.Add(curIndex); } featureList.Add(feature.Value); } } Log.DebugFormat("Finished processing {0}.", inputFile); }