TD5 - Stéréo et tracking
L'article Generalized Perspective Projection de Robert Kooima décrit le calcul de la matrice de projection dans le cas du rendu stéréo avec suivi de l'observateur. Vous allez utiliser le TD précédent pour estimer la distance de l'observateur à l'écran (profondeur) en supposant que la direction de vue reste orthogonale. Le calcul de la profondeur ne peut néanmoins pas se faire en se basant uniquement sur l'image 2D : une information supplémentaire est nécessaire, le rapport entre la taille réelle du marqueur et sa taille après projection dans l'image. Pour cela, nous avons besoin des paramètres intrinsèques de la caméra.
1. Calibration de la caméra
Lisez tout d'abord la partie théorique du tutoriel OpenCV sur la calibration. Créez un nouveau projet intitulé camera_calibration avec TinderBox en utilisant le template PS3Eye. Choisissez la plate-forme x64, puis ajoutez le block OpenCV3 (en installation relative). Téléchargez le code fourni et copiez-le dans le dossier src du projet précédemment généré. Compilez la solution 'camera_calibration.sln' et exécutez-la pour déterminer la matrice des paramètres intrinsèques et les cœfficients de distorsion de la caméra. Conservez bien le fichier camera.yml obtenu.
2. Calcul de la profondeur
Chargez dans votre code de suivi d'un marqueur coloré les paramètres intrinsèques précédemment estimés. Placez le fichier 'camera.yml' dans le répertoire assets du projet ; utilisez la fonction loadAsset pour y accéder et la classe cv::FileStorage pour récupérer la matrice caméra.
Proposez un schéma représentant la scène et les différents éléments nécessaires au calcul de la profondeur. Modifiez ensuite le code de votre tracker pour convertir la position du centre de la boîte englobante dans l'image (en pixels) en positions 3D (en mm) dans le repère de la caméra PSEye.
3. Client / Serveur VRPN
Pour faire communiquer vos deux applications nous allons utiliser VRPN (Virtual Reality Peripheral Network). Il s'agit une bibliothèque de classes permettant de représenter un ensemble de dispositifs d'interaction et de créer un système client-serveur. Ce système permet de s'abstraire d'un dispositif d'interaction précis en en définissant trois grands types :
- Tracker : position et / ou orientation (3 à 6 dimensions),
- Analog : capteurs sur un ou plusieurs axes, avec valeurs continues,
- Button : capteurs à valeur binaire 0 / 1.
Téléchargez l'archive vrpn.zip contenant les fichiers d'entête et les bibliothèques pré-compilées pour Visual Studio 2015 (x64). Ajoutez-les dans les propritétés des vos projets de tracking et de rendu stéréo anaglyphe.
Créez une connexion VRPN vrpn_Connection et un serveur vrpn_Tracker_Server dans votre code de tracking (doc). Le port UDP utilisé par défaut par VRPN semble bloqué sous Windows, utilisez explicitement le port 3884 lorsque vous créez la connection. Envoyez la position précédemment calculée au vrpn_Tracker_Server avec la méthode report_pose.
Connectez-vous au serveur VRPN depuis l’application de rendu stéréo à l'aide d'un objet vrpn_Tracker_Remote (doc). Utilisez comme nom de tracker Tracker@localhost:3884 pour utiliser le bon port UDP. Récupérez et affichez dans la console la position 3D du tracker. Pour pouvoir placer la caméra virtuelle à cette position, il faut donc exprimer la scène 3D dans le repère de la PSEye. En vous inspirant de l'article de Robert Kooima, modifiez le calcul de la matrice de projection (qui incluera également la matrice de vue). Vous aurez besoin des dimensions physiques de l'écran et de sa position par rapport à la PSEye. Vous devrez aussi appliquer une mise à l'échelle et une translation de la scène 3D pour l'adapter aux dimensions physiques.