Calibração da câmera Intel RealSense d435 usando OpenCV2 e ROS

Olá pessoal!


Quero compartilhar minha experiência com a câmera Intel RealSense, modelo d435 . Como você sabe, muitos algoritmos de visão de máquina requerem calibração preliminar da câmera . Aconteceu que em nosso projeto usamos o ROS para criar componentes individuais de um sistema inteligente automatizado. No entanto, tendo estudado a Internet em russo, não encontrei nenhum tutorial sensato sobre esse assunto. Esta publicação pretende preencher essa lacuna.


Pré-requisito de software


Como o ROS funciona em sistemas Unix, assumirei que temos o sistema Ubuntu 16.04 disponível. Não descreverei os detalhes detalhados da instalação, apenas fornecerei links para os tutoriais correspondentes.



sudo apt-get install python-opencv 


Instalando drivers RealSense


  1. Primeiro de tudo, você precisa instalar drivers para a câmera.
  2. O pacote ROS para a câmera está aqui . No momento da publicação, a versão mais recente era 2.0.3. Para instalar o pacote, você precisa baixar o código-fonte e descompactá-lo no diretório inicial do ROS. Em seguida, precisaremos instalá-lo:

 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 

Testando a câmera


Depois de instalar a câmera, precisamos garantir que os drivers funcionem como deveriam. Para fazer isso, conectamos a câmera via USB e executamos a demonstração:


 roslaunch realsense2_camera demo_pointcloud.launch 

Este comando abrirá a visualização ROS, na qual é possível ver a nuvem de pontos registrados no tópico /camera/depth/color/points :


rviz


Calibração da câmera


Abaixo está uma versão adaptada do tutorial do 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]) 

Para que esse script funcione, precisamos de pelo menos 10 imagens do tabuleiro de xadrez recebidas de nossa câmera. Para isso, podemos usar, por exemplo, o pacote image_view ROS ou qualquer outro programa que possa tirar capturas de tela de uma câmera USB. As imagens capturadas devem ser colocadas em qualquer pasta. Exemplo de imagem:


Mesa de xadrez


Depois de executar o script, os resultados da calibração serão salvos em um arquivo
calibration.npy . Esses dados podem ser usados ​​com o seguinte script:


 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] 

Conclusão


Conseguimos calibrar com sucesso a câmera RealSense d435 usando OpenCV2 e ROS. Os resultados da calibração podem ser usados ​​em aplicativos como objetos de rastreamento, marcadores aruco, algoritmos de realidade aumentada e muitos outros. No próximo artigo, gostaria de elaborar sobre o rastreamento de marcadores aruco.

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


All Articles