OnTrackablesUpdated is a callback registered w/ QCARBehaviour as a TrackerEventHandler.
This is called within QCARBehaviour's Update method as such..
// Updates the scene with new tracking data. Calls registered
// Get the current orientation of the surface:
ScreenOrientation surfaceOrientation = (ScreenOrientation)getSurfaceOrientation();
// Check if we need to update the video background configuration and projection matrix:
if (QCAR.IsRendererDirty() || mProjectionOrientation != surfaceOrientation)
// Bind a simple material to clear the OpenGL state
// QCARManager renders the camera image and updates the trackables
// Tell Unity that we may have changed the OpenGL state behind the scenes
// Update the camera clear flags
// Let the trackable event handlers know that all trackables have been updated
foreach (ITrackerEventHandler handler in mTrackerEventHandlers)
You'll notice that the OnTrackablesUpdated call occurs after the camera image has been updated. That's the critical aspect, it ensures that there is a complete Image frame available. So no, it's not mandatory to obtain the bytes in OnTrackablesUpdated, but it's probably the best approach.
If you'd like to trigger the Image capture interactively, you could set a flag on the event handler for this purpose - i.e. the Image is only obtained for when the flag is set.