Extras
This section describes additional functions of the VIRNECT Track Framework.
Get Framework Log Messages
The Track framework provides three methods in the LOG namespace to retrieve log messages:
#include <VARAPI/TrackingFramework/Log.hpp>
-
Latest log message
To retrieve the latest log message as a string, simply call the following method:// Retrieve the latest log message const std::string lastLogMessage = VIRNECT::LOG::getLastLogMessage();
-
All log messages
To retrieve a vector containing all log messages call:// Retrieve all log messages const std::vector<std::string> allLogMessages = VIRNECT::LOG::getAllLogMessages();
-
Register a callback function
To automatically invoke a custom method on a logging event, you can register a callback function:// Register callback function for logging VIRNECT::LOG::registerLogCallbackFunction(logCallback);
Example declaration for such a callback function:
/** * @brief Callback function that will be invoked when Track logs a message * @param message Log message * @param level Log level */ void logCallback(const std::string& message, VIRNECT::LOG::LogLevel level) { std::cout << message << std::endl; }
Get Target Meta Information
Meta information about targets, like their type or physical size, can be retrieved by calling the following method:
// Get target meta information
const std::unordered_map<std::string, VIRNECT::TargetInformation> targets = trackingFramework.getTargetInformation();
// Log target meta information
for (const auto& [targetName, target] : targets)
{
std::cout << targetName << std::endl;
std::cout << VIRNECT::TargetTypeNames[static_cast<int32_t>(target.mType)] << std::endl;
std::cout << "Size:" << std::endl;
std::cout << "X: [ " << target.mDimensions.mMin.x << ", " << target.mDimensions.mMax.x << " ]" << std::endl;
std::cout << "Y: [ " << target.mDimensions.mMin.y << ", " << target.mDimensions.mMax.y << " ]" << std::endl;
std::cout << "Z: [ " << target.mDimensions.mMin.z << ", " << target.mDimensions.mMax.z << " ]" << std::endl;
}
Modify Trackable Targets at Runtime
By modifying the target meta information, you can activate and deactivate the tracking for each individual target during runtime.
To do so, set the mIgnore
property of the target information accordingly.
// Get target meta information
std::unordered_map<std::string, VIRNECT::TargetInformation> targets = trackingFramework.getTargetInformation();
// Deactivate tracking for target "VARIMG_000"
targets["VARIMG_000"].mIgnore = true;
// Set target meta information
trackingFramework.setTargetInformation(targets);
Changing any other property of the target meta information will have no effect on the framework.
Get 3D Model data
In case a CAD model is used as a target, the 3D mesh information of this model can be loaded from the framework:
// Get 3D mesh information
VIRNECT::CADModel cadModel = trackingFramework.getCADModel();
The returned VIRNECT::CADModel
contains the vertex data and vertex IDs, which can be used for visualization of the tracked model.
Retrieve Image from Image Source
You can retrieve a shallow copy of the latest processed image as a VIRNECT::ImageRGB
for visualization purposes.
// Get last processed image
VIRNECT::ImageRGB image = trackingFramework.getLastProcessedImage();
Use a Custom Image Source
The process
function can also be called with a parameter of type VIRNECT::ImageRGB
.
Instantiate an object of type VIRNECT::ImageRGB
, set all parameters and fill the buffer.
Note that the resolution must match the specified camera calibration.
Use this object as an input for the Track framework process
function:
// Instantiate image object
VIRNECT::ImageRGB image;
// Fill image
image.mWidth = 640;
image.mHeight = 480;
image.mStride = sizeof(byte) * image.mChannels * image.mWidth;
std::memcpy(image.mBuffer, source.buffer, std::sizeof(source.buffer))
// Use Image
bool success = trackingFramework.process(image);
Calibration Reader Tool
The Calibration Reader Tool allows convenient readout of calibration data from a JSON file.
The format of the JSON file must follow the format specified here.
Since the calibration format can reflect multiple cameras with multiple resolutions the desired camera ID and resolution can be specified as optional parameters in the readCalibrationFile
function. Note that the resolution must be within the list of supported resolutions which is also defined in commons.hpp as VIRNECT::SupportedResolutions
.
#include <VARAPI/TrackingFramework/Tools.hpp>
// Instantiate camera calibration object
VIRNECT::CameraCalibration cameraCalibration;
// Use the calibration reader tool to load camera calibration from JSON file
// with optional parameters for camera ID and resolution
VIRNECT::TOOLS::readCalibrationFile(calibrationPath, cameraCalibration, "cam0", {640, 480});
// Set camera calibration
trackingFramework.setCameraCalibration(cameraCalibration);
Record Image Sequence
Track provides convenient methods to record the camera input stream as an image sequence:
#include <VARAPI/TrackingFramework/Tools.hpp>
// Start recording
VIRNECT::TOOLS::RECORDER::startRecording("../FolderPath", usePGMFormat);
// Process framework
while(recording)
{
trackingFramework.process();
}
// Retrieve recording state
VIRNECT::TOOLS::RECORDER::isRecording();
// Stop recording
VIRNECT::TOOLS::RECORDER::stopRecording();
To use the recording functionality the framework needs to be set up and running.
Once the recording is enabled via the startRecording
method, each call of the process
Method will record one frame.
Supported file formats are JPG
& PGM
.
A recorded file sequence can be used as an Image Source for the Track framework.
Use the map recorder
To record a Map target, the map recording mode needs to be enabled before the initialization of the framework.
To initialize the recording, one image target needs to be set as well.
Once the recording is finished, the map can be saved by calling saveMapTarget
.
// Enable map recording
trackingFramework.enableMapTargetGeneration(true, "mapTargetName", targetDataPath);
// Set Image target for initialization
trackingFramework.setTargetNames(["ImageTargetName"])
// Initialize framework
trackingFramework.initialize();
while(processing){
...
if(userInteraction){
// Save target with name "mapTargetName" to targetDataPath
trackingFramework.saveMapTarget();
}
}
Get 3D Map points
To visualize Map targets, the tracked 3D points can be loaded from the framework. To reduce the amount of data retrieved with this command, the version of the Map should be checked beforehand. When the Map data updates internally, the version number will be increased.
// Save latest retrieved version
uint64_t lastRetrievedVersion = 0;
while(processing){
...
// Check MAP data version
uint64_t currentVersion = trackingFramework.getMapVersion(targetName)
if( currentVersion > lastRetrievedVersion){
// Update version
lastRetrievedVersion = currentVersion;
// Retrieve tracked MAP points
std::vector<Vec3<double>> trackedPoints = trackingFramework.getMapPoints(targetName);
// Visualize points
...
}
}