Accurate dating of image capture

Hi @XBo,

as promised my example:

I used the new .NET wrappers that I already linked you above.
You can just open it in LINQPad to test it.
You will need to reference the Stemmer.Cvb.dll.

void Main()
{
	using (Device device = DeviceFactory.Open("GenICam.vin"))
	{
		var cameraQuartzTicks = GetCameraQuartzTicks(device);
		device.Stream.Start();
		// Call this whenever your timedrift gets too big.
		var syncTuple = SyncTimes(device);
		// Some kind of loop around this block
		for (int numTestWaitCalls = 0; numTestWaitCalls < 10; numTestWaitCalls++)
		{
			using (var image = device.Stream.Wait())
			{
				var newImageTimestamp = (long)image.RawTimestamp;
				long passedTicks = newImageTimestamp - syncTuple.Item2;
				var passedTime = CalculatePassedTimeFrom(passedTicks, cameraQuartzTicks);
                                var timeImageWasTaken = syncTuple.Item1.Add(passedTime);
				Console.WriteLine("Image was taken at " + (timeImageWasTaken).ToString("hh:MM:ss,mm"));
			}
		}
	}
}

private TimeSpan CalculatePassedTimeFrom(long passedTicks, long cameraQuartzTicks)
{
	return TimeSpan.FromSeconds(passedTicks / cameraQuartzTicks);
}

private Tuple<DateTime, long> SyncTimes(Device device)
{
	DateTime startTime = DateTime.Now;
	LatchTicks(device);
        DateTime endTime = DateTime.Now;
	var timeStampTickValue = GetTimeStampTickValue(device);	
	var passedTimeSpan = (endTime - startTime);
	var timeOfLatch = new DateTime(startTime.Ticks + (passedTimeSpan.Ticks / 2));
	Console.WriteLine(timeOfLatch.ToString("hh:MM:ss,mm"));
	return new Tuple<DateTime, long>(timeOfLatch, timeStampTickValue);
}

private void LatchTicks(Device device)
{
	using (var nodemap = device.NodeMaps[NodeMapNames.Device])
	{
		var latchNode = nodemap["GevTimestampControlLatch"] as CommandNode;
		latchNode.Execute();
	}
}

private long GetTimeStampTickValue(Device device)
{
	using (var nodemap = device.NodeMaps[NodeMapNames.Device])
	{
		var timeStampTickValue = nodemap["GevTimestampValue"] as IntegerNode;
		return timeStampTickValue.Value;
	}
}

private long GetCameraQuartzTicks(Device device)
{
	using (var nodemap = device.NodeMaps[NodeMapNames.Device])
	{
		var quartzFrequency = nodemap["GevTimestampTickFrequency"] as IntegerNode;
		return quartzFrequency.Value;
	}
}

Hope it helps!

Regards
Chris

4 Likes