LogoLogo
WebsiteSupportDownloadsForumsQuick LinksContact Us
v3.0
v3.0
  • OptiTrack Documentation
  • WHAT'S NEW
    • What's New in Motive 3.0
    • Unreal Engine: OptiTrack InCamera VFX
  • QUICK START GUIDES
    • Quick Start Guide: Getting Started
    • Quick Start Guide: Prime Color Camera Setup
    • Quick Start Guide: Precision Capture
    • Quick Start Guide: Tutorial Videos
    • Quick Start Guide: Active Marker Tracking
    • Quick Start Guide: Outdoor Tracking Setup
  • HARDWARE
    • Cameras
      • Ethernet Cameras
        • PrimeX 41
        • PrimeX 22
        • PrimeX 13
        • PrimeX 13W
        • SlimX 13
        • Prime Color
      • USB Cameras
        • Slim 3U
        • Flex 13
        • Flex 3
        • Duo 3
        • Trio 3
        • Adjusting Global Origin for Tracking Bars
    • Prepare Setup Area
    • Camera Mount Structures
    • Camera Placement
    • Ethernet Camera Network Setup
      • General Overview and Specs
      • Windows 10 Network Settings
      • Cabling and Load Balancing
      • NETGEAR ProSafe GSM7228S: Disabling the Broadcast Storm Control
      • White/Blacklisting Cameras
    • USB Camera System Setup
    • Aiming and Focusing
    • Camera Status Indicators
  • MOTIVE
    • Installation and Activation
    • Motive Basics
    • Calibration
      • Continuous Calibration
      • Calibration Squares
    • Markers
    • Assets
      • Gizmo Tool: Translate, Rotate, and Scale
    • Rigid Body Tracking
      • Aligning Rigid Body Pivot Point with a Replicated 3D Model
    • Skeleton Tracking
    • Data Recording
      • Data Types
    • Labeling
    • Data Editing
    • Data Export
      • Data Export: BVH
      • Data Export: C3D
      • Data Export: CSV
      • Data Export: FBX
      • Data Export: TRC
    • Data Streaming
    • Camera Video Types
    • Audio Recording
    • Motive HotKeys
    • Measurement Probe Kit Guide
    • Motive Batch Processor
    • Reconstruction and 2D Mode
  • MOTIVE UI PANES
    • Settings
      • Settings: General
      • Settings: Assets
      • Settings: Live Pipeline
      • Settings: Streaming
      • Settings: Views
      • Settings: Mouse and Keyboard
      • Settings: Audio
    • Assets Pane
    • Builder Pane
    • Constraints Pane
      • Constraints XML Files
    • Calibration Pane
    • Data Pane
    • Devices Pane
    • Edit Tools Pane
    • Graph View Pane
    • Info Pane
    • Labels Pane
    • Log Pane
    • Probe Pane
    • Properties Pane
      • Properties Pane: Camera
      • Properties Pane: Force Plates
      • Properties Pane: NI-DAQ
      • Properties Pane: OptiHub2
      • Properties Pane: Rigid Body
      • Properties Pane: Skeleton
      • Properties Pane: Take
      • Properties Pane: eSync2
    • Status Panel
    • Toolbar/Command Bar
    • Control Deck
    • Viewport
  • PLUGINS
    • OptiTrack Unreal Engine Plugin
      • Unreal Engine: OptiTrack Live Link Plugin
        • UE5.1 Live Link Retarget External Workaround
      • Unreal Engine: OptiTrack Streaming Client Plugin
      • Unreal Engine: HMD Setup
      • Unreal Engine: MotionBuilder Workflow
      • Unreal Engine VCS Inputs
    • OptiTrack Unity Plugin
      • Unity: HMD Setup
    • OptiTrack OpenVR Driver
    • Autodesk Maya
      • Autodesk Maya: OptiTrack Insight VCS Plugin
    • Autodesk MotionBuilder
      • Autodesk MotionBuilder Plugin
      • Autodesk MotionBuilder: OptiTrack Skeleton Plugin
      • Autodesk MotionBuilder: OptiTrack Optical Plugin
      • Autodesk MotionBuilder: OptiTrack Insight VCS Plugin
      • Autodesk MotionBuilder: Timecode Data
    • OptiTrack Peripheral API
    • External Plugins
      • Houdini 19 Integration
  • ACTIVE COMPONENTS
    • Active Components Hardware
      • Active Puck
      • CinePuck
      • BaseStation
      • Information for Assembling the Active Tags
      • Manus Glove Setup
    • Configuration
      • Active Batch Programmer
      • Active Hardware Configuration: PuTTY
      • Active Component Firmware Compatibility
    • Active Marker Tracking
      • Active Finger Marker Set
      • Active Marker Tracking: IMU Setup
  • SYNCHRONIZATION
    • Synchronization Hardware
      • External Device Sync Guide: eSync 2
      • External Device Sync Guide: OptiHub2
    • Synchronization Setup
    • OptiTrack Timecode
  • VIRTUAL PRODUCTION
    • Unreal Engine: OptiTrack InCamera VFX
    • Entertainment Marker Sets
    • PrimeX 41
  • MOVEMENT SCIENCES
    • Movement Sciences Hardware
      • General Motive Force Plate Setup
      • AMTI Force Plate Setup
      • Bertec Force Plate Setup
      • Kistler Force Plate Setup
      • Delsys EMG Setup
      • NI-DAQ Setup
      • Multiple Device Setup
    • Movement Sciences Marker Sets
      • Biomechanics Marker Sets
      • Biomech (57)
      • Rizzoli Marker Sets
    • For Visual3D Users
    • Prime Color Camera Setup
      • Prime Color Setup: Required Components
      • Prime Color Setup: Hardware Setup
      • Prime Color Camera Setup: Camera Settings
      • Prime Color Camera Setup: Prime Color FS Calibration
      • Prime Color Setup: Data Recording / Export
      • Prime Color Camera Setup: FAQ / Troubleshooting
      • Prime Color Camera Setup: Windows 10 Network Settings
  • VIRTUAL REALITY
    • VR Plugins
      • VR Unreal Engine
        • OptiTrack Unreal Engine Plugin
        • Unreal Engine: OptiTrack Live Link Plugin
          • UE5.1 Live Link Retarget External Workaround
        • Unreal Engine: OptiTrack Streaming Client Plugin
        • Unreal Engine VCS Inputs
      • VR Unity
        • OptiTrack Unity Plugin
      • VR OpenVR
        • OptiTrack OpenVR Driver
    • VR HMD Setup
      • Unreal Engine: HMD Setup
      • Unity: HMD Setup
      • Manually Calibrating the HMD Pivot Point
      • Sync Configuration with an HTC Vive System
    • SlimX 13
    • Active Marker Tracking
      • Active Finger Marker Set
      • Active Marker Tracking: IMU Setup
    • Synchronization Hardware
      • External Device Sync Guide: eSync 2
      • External Device Sync Guide: OptiHub2
  • ANIMATION
    • Autodesk Maya
      • Autodesk Maya: OptiTrack Insight VCS Plugin
    • Autodesk MotionBuilder
      • Autodesk MotionBuilder Plugin
      • Autodesk MotionBuilder: OptiTrack Skeleton Plugin
      • Autodesk MotionBuilder: OptiTrack Optical Plugin
      • Autodesk MotionBuilder: OptiTrack Insight VCS Plugin
      • Autodesk MotionBuilder: Timecode Data
  • ROBOTICS
    • PrimeX 22
    • Outdoor Tracking Setup
  • DEVELOPER TOOLS
    • Developer Tools Overview
    • NatNet SDK
      • NatNet 4.0
      • NatNet: Class/Function Reference
      • NatNet: Creating a Managed (C sharp) Client Application
      • NatNet: Creating a Native (C++) Client Application
      • NatNet: Data Types
      • NatNet: Matlab Wrapper
      • NatNet: Migration to NatNet 3.0 libraries
      • NatNet: RebroadcastMotiveData Sample
      • NatNet: Remote Requests/Commands
      • NatNet: Sample Projects
      • NatNet: Unicast Data Subscription Commands
      • Latency Measurements
    • Motive API
      • Motive API: Quick Start Guide
      • Motive API Overview
      • Motive API: Function Reference
      • Motive API Camera Calibration
    • Camera SDK
  • SKELETON MARKER SETS
    • Full Body
      • Baseline (41)
      • Core (50)
      • Biomech (57)
      • Conventional (39)
    • Full Body + Fingers
      • Baseline + Passive Fingers (49)
      • Baseline + Active Fingers (57)
      • Core + Passive Fingers (54)
      • Core + Active Fingers (62)
    • Upper
      • Baseline Upper (25)
      • Conventional Upper (27)
    • Lower
      • Baseline Lower (20)
      • Helen Hayes Lower (19)
      • Conventional Lower (16)
    • Hand and Fingers
      • Left/Right Hand (4) Active
      • Left/Right Hand (10) Active + Passive
      • Active Finger Marker Set
    • Glove Device Setup
      • Manus Glove Setup
      • StretchSense Glove Setup
    • Rizzoli Marker Sets
    • Entertainment Marker Sets
    • Rigid Body Skeleton Marker Set
  • GENERAL TROUBLESHOOTING
    • Network Troubleshooting
    • Authenticating Cameras Without an Internet Connection
    • Troubleshooting Q&A
    • Running Motive on High DPI Displays
    • Firewall Settings
Powered by GitBook
On this page
  • Sample Code
  • Masking
  • Wanding
  • Ground Plane

Was this helpful?

Export as PDF
  1. DEVELOPER TOOLS
  2. Motive API

Motive API Camera Calibration

PreviousMotive API: Function ReferenceNextCamera SDK

Last updated 2 years ago

Was this helpful?

This page provides a sample and instructions on how to use Motive API functions to calibrate a camera system.

Sample Code


The following sample code demonstrates calibration process using the Motive API. For details on specific functions, please refer to the page.

Masking

Auto-Masking

Auto-Masking is done directly by calling the TT_AutoMaskAllCameras function. When this is called, Motive will sample for a short amount of time and apply a mask to the camera imagers where light was detected.

<source> //== To auto-mask, call TT_AutoMaskAllCameras().

TT_AutoMaskAllCameras(); printf( "============\nCamera masking started\n============\n" ); </source>

Camera Mask

This function returns memory block of the mask. One bit per a pixel of the mask. Masking pixels are rasterized from left to right and from top to bottom of the camera's view.

Clear Masks

This function can clear existing masks from the 2D camera view. It returns true when it successfully removes pixel masks. Otherwise, masking is always additive through the API.

Set Camera Mask

The TT_SetCameraMask can be used to replace the existing camera mask for any camera. A mask is an array of bytes, one byte per mask pixel block. Returns true when masks are applied.

Wanding

//== NaturalPoint Motive API Calibration Sample Application ==

include <windows.h>
include <conio.h>
include <stdio.h>
include <stdlib.h>
include <math.h>
include <string>
include "NPTrackingTools.h"
// Local function prototypes void CheckResult( NPRESULT result );

std::string CalibrationStateString( TT_CameraCalibrationStates state ) {
switch( state )
   {
       case TT_CameraCalibration_Initialized:   return "Init    ";
       case TT_CameraCalibration_Sampling:      return "Sampling";
       case TT_CameraCalibration_Solving:       return "Solving ";
       case TT_CameraCalibration_Complete:      return "Complete";
       case TT_CameraCalibration_Uninitialized: break;
       default: break;
   }
   return "Unknown ";
}
// Main application int main( int argc, char* argv[] ) {
  printf( "== NaturalPoint Motive API Calibration Sample Application =======---\n" );
   printf( "== (C) NaturalPoint, Inc.\n\n" );
    printf( "Initializing NaturalPoint Devices\n" );
   
   if( TT_Initialize() != NPRESULT_SUCCESS )
   {
       printf( "Unable to license Motive API\n" );
       return 1;
   }
   // Do an update to pick up any recently-arrived cameras.
   TT_Update();
    // List all detected cameras.
   printf( "Cameras:\n" );
   for( int i = 0; i < TT_CameraCount(); i++)
   {
       printf( "\t%s\n", TT_CameraName(i) );
   }
   printf("\n");
   //== lets set our wand settings ==--
   cCameraCalibrationSettings settings;
   settings.WandLength       = 0.250;  // wand length        = 250mm
   settings.WandCenterOffset = 0.0875; // wand center offset = 87.5mm
    if( TT_SetCalibrationSettings( settings ) != NPRESULT_SUCCESS )
   {
       printf( "Unable to set camera calibration settings.\n\n" );
   }
     if( TT_CalibrationSettings( settings ) == NPRESULT_SUCCESS )
   {
       //== fetch & print default wand settings ==--
        printf( "Wand Length        = %.1fmm\n", settings.WandLength * 1000 );
       printf( "Wand Center Offset = %.1fmm\n", settings.WandCenterOffset * 1000 );
   }
   else
   {
       printf( "Unable to fetch camera calibration settings.\n\n" );
   }
   printf( "\n" );
   printf( "Press 1: Start Wanding\n" );
   printf( "Press 2: Start Calculation\n" );
   printf( "Press 3: Apply Calibration\n" );
   printf( "Press 4: Reset\n" );
   printf( "\n" );
  int frameCounter = 0;
   
   bool done = false;
   while( !done )
   {
       if( _kbhit() )
       {
           char c = _getch();
         if( c == '1' )
           {
               printf( "Start Wanding: " );
               if( TT_StartCalibrationWanding() )
               {
                   printf( "Success\n" );
               }
               else
               {
                   printf( "Failed\n" );
               }
           }
           if( c == '2' )
           {
               printf( "Start Solving: " );
               if( TT_CameraCalibrationSolve() )
               {
                   printf( "Success\n" );
               }
               else
               {
                   printf( "Failed\n" );
               }
           }
           if( c == '3' )
           {
               printf( "Apply Calibration: " );
               if( TT_CameraCalibrationApplyResult() )
               {
                   printf( "Success\n" );
               }
               else
               {
                   printf( "Failed\n" );
               }
               }
           if( c == '4' )
           {
               printf( "Reset Calibration: " );
               if( TT_CameraCalibrationReset() )
               {
                   printf( "Success\n" );
               }
               else
               {
                   printf( "Failed\n" );
               }
           }
       }
       if( TT_Update() == NPRESULT_SUCCESS )
       {
           frameCounter++;
       if( (frameCounter%100) == 0 )
           {
 //== every 100 frames print ongoing sample and calibration state information ==--
   printf( "Frame[%5d] Markers[%3d] Calibration State[%s] ", frameCounter, TT_FrameMarkerCount(), CalibrationStateString( TT_CalibrationState()).c_str() );
       if( TT_CalibrationState() == TT_CameraCalibration_Sampling )
               {
                   for( int index = 0; index < TT_CameraCount(); index++ )
                   {
                       printf( "%d ", TT_CameraCalibrationSamples( index ) );
                   }
                   printf( "\n\nWand Location\n" );
                   printf( "-----------------------\n" );
                   float points[ 6 ];
                   for( int index = 0; index < TT_CameraCount(); index++ )
                   {
                       bool wandPresent = TT_CameraWandLocation( index, points );
                       printf( "Camera #%d: ", index );
                       if( wandPresent )
                       {
                           printf( "[Present    ] " );
                           for( int pointIndex = 0; pointIndex < 6; pointIndex += 2 )
                           {
                               printf( "%.1f,%.1f ", points[ pointIndex ], points[ pointIndex + 1 ] );
                           }
                       }
                       else
                       {
                           printf( "[Not Present] " );
                       }
                       printf( "\n" );
                   }
                   printf( "\n" );
               }
               printf( "\n" );
           }
       }
       Sleep(2);
   }
   printf( "Shutting down NaturalPoint Motive API\n" );
   CheckResult( TT_Shutdown() );
   printf( "Complete\n" );
   while( !_kbhit() )
   {
       Sleep(20);
   }
   return 0;
 }
 
 void CheckResult( NPRESULT result ) //== CheckResult function will display errors and ---

                                     //== exit application after a key is pressed =====---
{

   if( result!= NPRESULT_SUCCESS)
   {
       // Treat all errors as failure conditions.
       printf( "Error: %s\n\n(Press any key to continue)\n", TT_GetResultString(result) );
       Sleep(20);
       exit(1);
   }
} 

Ground Plane

Setting ground plane is done directly by calling the TT_SetGroundPlane function. When this is called, camera system will search for 3-markers that resemble a calibration square and uses the inputted vertical offset value to configure the ground plane.

//== To apply ground plane, call TT_SetGroundPlane(). Specify the vertical offset from the marker centers in meters.
TTAPI bool TT_SetGroundPlane( float verticalOffset ); 
Motive API: Function Reference