Processando Imagens na ROS 2
Nesta atividade, vamos aprender a processar imagens na ROS 2. Para isso, vamos utilizar a biblioteca OpenCV.
No arquivo base_visao.py, você encontrará um código que se inscreve nó tópico de imagem da câmera do robô. Utilize este código como base para realizar as atividades do curso.
Baixe esse arquivo e coloque-os na em uma pasta de fácil acesso.
Explicação do Código
Essencialmente o código é o mesmo que já vimos em aulas anteriores, no código abaixo,
self.image_sub = self.create_subscription(
Image, # or CompressedImage
'/camera/image_raw', # or '/camera/image_raw/compressed'
self.image_callback,
QoSProfile(depth=10, reliability=ReliabilityPolicy.BEST_EFFORT))
-
Podemos escolher entre
Image
eCompressedImage
para receber a imagem. A diferença entre eles é queImage
é uma mensagem que contém a imagem em formato de matriz de pixels, enquantoCompressedImage
é uma mensagem que contém a imagem comprimida. -
Se você escolher
Image
, o tópico que você deve se inscrever é/camera/image_raw
. -
Se você escolher
CompressedImage
, o tópico que você deve se inscrever é/camera/image_raw/compressed
.
No método image_callback
, vamos processar imagem recebida.
def image_callback(self, msg):
if self.runnable:
cv_image = self.bridge.imgmsg_to_cv2(msg, "bgr8") # Use está linha se estiver usando `Image`
# cv_image = self.bridge.compressed_imgmsg_to_cv2(msg, "bgr8") # Use está linha se estiver usando `CompressedImage`
# Faça aqui o processamento da imagem
# ou chame uma classe ou função que faça isso
else:
print('Processamento de imagem pausado')
Neste método, a imagem recebida é convertida para um objeto do tipo numpy.ndarray
utilizando a função imgmsg_to_cv2
ou compressed_imgmsg_to_cv2
da biblioteca cv_bridge
. No __init__
do código, definimos a variável self.bridge
como CvBridge()
, essa biblioteca é uma ponte (bridge) entre a biblioteca OpenCV e a ROS, que trabalham com formatos de imagem diferentes.
Outro ponto importante é a variável self.runnable
, obtida do tópico /vision/image_flag
. Enquanto o valor dessa variável for True
, o processamento da imagem é feito, então, um outro nó pode publicar nesse tópico para pausar ou retomar o processamento da imagem. Isso é útil para economizar recursos do robô quando o processamento da imagem não é necessário, será útil para quando estivermos processando imagens usando Redes Neurais
ou Aruco Markers
.
Por ultimo, ainda no método image_callback
, a variável cv_image
contém a imagem recebida. Neste ponto, você pode fazer o processamento da imagem ou chamar uma função ou classe que faça isso para manter o código organizado.