public void InitialiseImage(ImageL16 imgIn)
        {
            lock (Lock)
            {
                if (imgIn == null || !imgIn.HasAllocatedImage)
                {
                    Image       = null;
                    Initialised = false;
                    return;
                }
                imgIn.ImageUpdate           += new EventHandler(imgIn_ImageUpdate);
                imgIn.ImageAttributesUpdate += new EventHandler <ImageAttributesChangedEventArgs>(imgIn_ImageAttributesUpdate);

                Allocate(imgIn.ImageAttributes);
            }
        }
		public void InitialiseImage(ImageL16 imgIn)
		{
			lock (Lock)
			{
				if (imgIn == null || !imgIn.HasAllocatedImage)
				{
					Image = null;
					Initialised = false;
					return;
				}
				imgIn.ImageUpdate += new EventHandler(imgIn_ImageUpdate);
				imgIn.ImageAttributesUpdate += new EventHandler<ImageAttributesChangedEventArgs>(imgIn_ImageAttributesUpdate);

				Allocate(imgIn.ImageAttributes);
			}
		}
        //called when data for any output pin is requested
        public void Evaluate(int SpreadMax)
        {
            if (FPinInInput[0] != FInput)
            {
                FInput              = FPinInInput[0];
                FInput.ImageUpdate += new EventHandler(FImage_ImageUpdate);
                FOutput             = new ImageL16();
                FThresholded        = new Image <Gray, ushort>(new Size(FInput.Width, FInput.Height));
            }

            lock (FLock)
            {
                FHold      = FPinInHold[0];
                FThreshold = (int)FPinInThreshold[0];
            }
        }
		//called when data for any output pin is requested
		public void Evaluate(int SpreadMax)
		{
			if (FPinInInput[0] != FInput)
			{
				FInput = FPinInInput[0];
				FInput.ImageUpdate += new EventHandler(FImage_ImageUpdate);
				FOutput = new ImageL16();
				FThresholded = new Image<Gray, ushort>(new Size(FInput.Width, FInput.Height));
			}

			lock (FLock)
			{
				FHold = FPinInHold[0];
				FThreshold = (int) FPinInThreshold[0];
			}

		}
		//called when data for any output pin is requested
		public void Evaluate(int SpreadMax)
		{
			if (FPinInContext[0] != FContext)
			{
				FContext = FPinInContext[0];
			}

			if (FContext == null)
			{
				FRunning = false;
				return;
			}

			if (FContext.running && !FRunning && FContext.context != null)
			{
				try
				{
					FImageGenerator = FContext.context.FindExistingNode(global::OpenNI.NodeType.Image) as ImageGenerator;
					FDepthGenerator = FContext.context.FindExistingNode(global::OpenNI.NodeType.Depth) as DepthGenerator;
					FDepthGenerator.AlternativeViewpointCapability.SetViewpoint(FImageGenerator);

					FImageRGB = new ImageRGB();
					FImageDepth = new ImageL16();
					FImageWorld = new ImageRGB32F();

					Size size = new Size(640, 480);
					FImageRGBBuffer = new Image<Bgr, byte>(size);
					FImageDepthBuffer = new Image<Gray,ushort>(size);
					FImageWorldBuffer = new Image<Rgb, float>(size);

					FPinOutRGB[0] = FImageRGB;
					FPinOutDepth[0] = FImageDepth;
					FPinOutWorld[0] = FImageWorld;

					FThread = new Thread(fnThread);
					FRunning = true;
					FThread.Start();
					FPinOutStatus[0] = "OK";
				}
				catch (StatusException e)
				{
					FRunning = false;
					FPinOutStatus[0] = e.Message;
				}
			}


		}