Étalonnage de la caméra Intel RealSense d435 à l'aide d'OpenCV2 et de ROS

Bonjour à tous!


Je veux partager mon expérience avec la caméra Intel RealSense, modèle d435 . Comme vous le savez, de nombreux algorithmes de vision industrielle nécessitent un étalonnage préalable de la caméra . Il se trouve que sur notre projet, nous utilisons ROS pour construire des composants individuels d'un système intelligent automatisé. Cependant, après avoir étudié Internet en russe, je n'ai trouvé aucun tutoriel judicieux sur ce sujet. Cette publication vise à combler cette lacune.


Prérequis logiciel


Étant donné que ROS fonctionne sur les systèmes Unix, je suppose que nous avons le système Ubuntu 16.04 disponible. Je ne décrirai pas les détails d'installation détaillés, je ne donnerai que des liens vers les tutoriels correspondants.



sudo apt-get install python-opencv 


Installation des pilotes RealSense


  1. Tout d'abord, vous devez installer les pilotes de la caméra.
  2. Le package ROS pour la caméra est ici . Au moment de la publication, la dernière version était la 2.0.3. Pour installer le package, vous devez télécharger le code source et le décompresser dans le répertoire personnel de ROS. Ensuite, nous devrons l'installer:

 catkin_make clean catkin_make -DCATKIN_ENABLE_TESTING=False -DCMAKE_BUILD_TYPE=Release catkin_make install echo "source path_to_workspace/devel/setup.bash" >> ~/.bashrc source ~/.bashrc 

Test de la caméra


Après avoir installé la caméra, nous devons nous assurer que les pilotes fonctionnent comme ils le devraient. Pour ce faire, nous connectons la caméra via USB et exécutons la démo:


 roslaunch realsense2_camera demo_pointcloud.launch 

Cette commande ouvrira la visualisation ROS, sur laquelle vous pourrez voir le nuage de points enregistré dans le sujet /camera/depth/color/points :


rviz


Calibrage de la caméra


Vous trouverez ci-dessous une version adaptée du tutoriel d'OpenCV .


 import numpy as np import cv2 import glob #    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) #     8x6 objp = np.zeros((6*8,3), np.float32) objp[:,:2] = np.mgrid[0:8,0:6].T.reshape(-1,2) #         objpoints = [] # 3d     imgpoints = [] # 2d     images = glob.glob('/__/*.png') for fname in images: img = cv2.imread(fname) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #     ret, corners = cv2.findChessboardCorners(gray, (8,6),None) #    ,         if ret == True: objpoints.append(objp) corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria) imgpoints.append(corners2) #       img = cv2.drawChessboardCorners(img, (8,6), corners2,ret) cv2.imshow('img',img) cv2.waitKey(500) cv2.destroyAllWindows() #     ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None) np.save('/path_to_images/calibration', [mtx, dist, rvecs, tvecs]) 

Pour que ce script fonctionne, nous avons besoin d'au moins 10 images d'échiquier reçues de notre caméra. Pour cela, nous pouvons utiliser, par exemple, le package image_view ROS ou tout autre programme pouvant prendre des captures d'écran d'une caméra USB. Les images capturées doivent être placées dans n'importe quel dossier. Exemple d'image:


Table d'échecs


Après avoir exécuté le script, les résultats de l'étalonnage seront enregistrés dans un fichier
calibration.npy . Ces données peuvent ensuite être utilisées avec le script suivant:


 calibration_data = np.load('path_to_images/calibration.npy') mtx = calibration_data[0] dist = calibration_data[1] rvecs = calibration_data[2] tvecs = calibration_data[3] 

Conclusion


Nous avons pu calibrer avec succès la caméra RealSense d435 en utilisant OpenCV2 et ROS. Les résultats de l'étalonnage peuvent être utilisés dans des applications telles que le suivi d'objets, les marqueurs aruco, les algorithmes de réalité augmentée et bien d'autres. Dans le prochain article, je voudrais développer le suivi des marqueurs aruco.

Source: https://habr.com/ru/post/fr412953/


All Articles