Realidade aumentada com ArUcos e Python
Nesse post iremos explorar os ArUcos: uma poderosa ferramenta para a realidade aumentada e como possível estudo de caso como aplicar esses marcadores para auxiliar na manutenção de motores DC
Introdução:
A tecnologia de realidade aumentada tem desempenhado um papel cada vez mais importante em diversas áreas, oferecendo novas possibilidades de interação entre o mundo virtual e o mundo real. Uma das ferramentas fundamentais para habilitar a realidade aumentada é a detecção e rastreamento de marcadores, e nesse contexto, os ArUcos têm se destacado. Neste artigo, exploraremos o conceito de ArUcos, suas aplicações em diferentes áreas e, em particular, como podem ser utilizados na manutenção de motores para obtenção de dados e na visualização de agendamentos de manutenção preventiva e preditiva.
o que são ArUcos?
Os ArUcos, que significam "Augmented Reality Markers" (Marcadores de Realidade Aumentada), são marcadores impressos em 2D que possuem padrões de código visualmente distintos. Esses marcadores desempenham um papel fundamental na detecção e rastreamento de objetos físicos em sistemas de realidade aumentada.
Cada marcador ArUco possui um identificador único, que é um código embutido em seu padrão visual. Esse código único permite associar informações virtuais específicas a um objeto físico correspondente. O sistema de realidade aumentada utiliza esse código para identificar e rastrear o marcador, determinando sua posição e orientação no espaço tridimensional.
Os marcadores ArUcos são compostos por um padrão quadrado ou retangular preto e branco, que é impresso em papel ou qualquer outra superfície adequada. A combinação de quadrados pretos e brancos forma um padrão visual codificado, que pode ser facilmente reconhecido pelos algoritmos de visão computacional usados na realidade aumentada.
A principal vantagem dos ArUcos é a sua capacidade de fornecer uma referência visual estável e reconhecível para o sistema de realidade aumentada. Isso permite que os dispositivos ou aplicativos de realidade aumentada possam rastrear e posicionar corretamente objetos virtuais sobre o mundo físico, criando uma sobreposição precisa entre os dois. Além disso, os ArUcos são projetados para serem facilmente detectados e rastreados em tempo real, mesmo em ambientes desafiadores ou com pouca iluminação. Isso os torna ideais para aplicações práticas, onde a precisão e a confiabilidade são essenciais.
Os ArUcos são amplamente utilizados em uma variedade de aplicações, como jogos, publicidade, medicina, arquitetura, manufatura e muito mais. Eles oferecem uma solução acessível e eficiente para a integração da realidade aumentada em diferentes setores e permitem a criação de experiências imersivas e interativas para os usuários.
De maneira geral podemos resumir que os ArUcos são marcadores de realidade aumentada que possuem padrões visuais codificados e únicos. Eles desempenham um papel crucial na detecção, rastreamento e sobreposição de objetos virtuais no mundo físico, permitindo uma integração eficiente da realidade aumentada em diversas aplicações.
Caso de uso: Dados de motores
Agora, vamos nos concentrar em duas aplicações específicas relacionadas à manutenção de motores.
Obtenção de dados dos motores com ArUcos e realidade aumentada: A manutenção de motores é uma tarefa essencial para garantir seu funcionamento adequado e prevenir falhas. Os ArUcos podem ser utilizados para facilitar a coleta de dados e informações relevantes dos motores por meio da realidade aumentada.
Primeiramente, podem-se colocar marcadores ArUcos em pontos estratégicos dos motores, como em diferentes componentes ou partes críticas. Em seguida, usando um dispositivo de realidade aumentada, como um tablet ou smartphone, é possível escanear esses marcadores e visualizar informações virtuais sobre cada componente.
Essas informações podem incluir dados técnicos, status de funcionamento, histórico de manutenção, instruções de reparo e até mesmo visualizações em 3D das partes do motor. Os ArUcos permitem que o dispositivo de realidade aumentada identifique e posicione corretamente as informações virtuais sobre o motor físico, tornando a experiência do usuário mais imersiva e informativa.
Visualização de agendamento de manutenção preventiva e preditiva: Além de obter dados dos motores, os ArUcos também podem ser usados para visualizar o agendamento de manutenção preventiva e preditiva. Nesse caso, os marcadores ArUcos podem ser aplicados em um calendário ou plano de manutenção físico.
Ao usar um dispositivo de realidade aumentada, o usuário pode escanear os marcadores ArUcos no calendário e visualizar as tarefas de manutenção agendadas, datas, descrições e prioridades. Além disso, informações adicionais, como procedimentos de manutenção, podem ser exibidas virtualmente para auxiliar os técnicos durante o processo.
Essa aplicação combina a facilidade de uso dos ArUcos com a praticidade do agendamento de manutenção em formato digital, permitindo que as equipes de manutenção tenham acesso rápido e intuitivo às informações necessárias para realizar as tarefas de forma eficiente e organizada.
Com os ArUcos, é possível aprimorar a eficiência e precisão das tarefas de manutenção, fornecer informações valiosas aos técnicos e criar uma experiência mais rica e interativa no contexto da realidade aumentada. À medida que a tecnologia continua a evoluir, os ArUcos prometem desempenhar um papel ainda mais importante nas aplicações da realidade aumentada e manutenção de motores.
Mão na massa - Código:
O objetivo do código é fazer a detecção de marcadores ArUco em tempo real usando uma webcam e aplicar uma “image augmentation” com base nos marcadores detectados fazendo a sobreposição das imagens no frame original. Para ficar mais fácil vamos fazer toda explicação do código.
Passo 1: Importando as bibliotecas
Começamos importando as bibliotecas necessárias para nosso projeto. Usaremos o OpenCV, que é uma biblioteca popular para visão computacional, processamento de imagem e detecção de padrões. Também importaremos a biblioteca ArUco, que fornece os recursos específicos para detecção e geração de marcadores ArUco. Além disso, importaremos a biblioteca NumPy para manipulação de matrizes multidimensionais e a biblioteca OS para manipulação de arquivos e diretórios.
import cv2 as cv
from cv2 import aruco
import numpy as np
import os
Passo 2: Classe ArucoDetect
Agora vamos definir uma classe chamada ArucoDetect
para encapsular nossa funcionalidade de detecção e aumentação de ArUcos.
class ArucoDetect:
def __init__(self, image_dir):
self.images_list = self.read_images(image_dir)
self.marker_dict = aruco.Dictionary_get(aruco.DICT_6X6_250)
self.param_markers = aruco.DetectorParameters_create()
@staticmethod
def read_images(dir_path):
img_list = []
files = os.listdir(dir_path)
for file in files:
img_path = os.path.join(dir_path, file)
image = cv.imread(img_path)
img_list.append(image)
return img_list
Nesta classe, no método __init__
, inicializamos os atributos images_list
, marker_dict
e param_markers
. images_list
armazena uma lista de imagens lidas de um diretório especificado. marker_dict
representa o dicionário de marcadores ArUco que usaremos para a detecção. param_markers
contém os parâmetros de detecção específicos para a biblioteca ArUco.
O método read_images
lê as imagens do diretório especificado e retorna uma lista com as imagens lidas. As imagens exemplos que iremos usar são essas:
Você pode editar a imagem do jeito que você desejar.
Passo 3: Image Augmentation
Agora vamos implementar o método image_augmentation
, responsável por aumentar a imagem com base nos marcadores detectados.
def image_augmentation(self, frame, src_image=None, dst_points=None):
src_h, src_w = frame.shape[:2]
if src_image is not None:
src_h, src_w = src_image.shape[:2]
frame_h, frame_w = frame.shape[:2]
mask = np.zeros((frame_h, frame_w), dtype=np.uint8)
src_points = np.array([[0, 0], [src_w, 0], [src_w, src_h], [0, src_h]])
H, _ = cv.findHomography(srcPoints=src_points, dstPoints=dst_points)
warp_image = cv.warpPerspective(src_image, H, (frame_w, frame_h)) if src_image is not None else frame
cv.fillConvexPoly(mask, dst_points, 255)
cv.bitwise_and(warp_image, warp_image, frame, mask=mask)
if src_image is None:
cv.putText(frame, 'No_Motors_Infos', (dst_points[0][0], dst_points[0][1]), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
Neste método, primeiro obtemos as dimensões da imagem de entrada frame
e definimos src_h
e src_w
com base nessas dimensões. Se a imagem de origem src_image
estiver disponível, atualizamos src_h
e src_w
com as dimensões da imagem de origem.
Em seguida, obtemos as dimensões do quadro frame
e criamos uma máscara preta do mesmo tamanho. Definimos os pontos de origem src_points
como as coordenadas dos cantos da imagem de origem e os pontos de destino dst_points
como os cantos dos marcadores detectados.
Usando cv.findHomography
, calculamos a matriz de transformação H
para a perspectiva correta. Em seguida, aplicamos a transformação perspectiva usando cv.warpPerspective
para obter a imagem aumentada warp_image
. Se a imagem de origem não estiver disponível, usamos o próprio quadro como imagem aumentada.
Agora, preenchemos a região do marcador nos cantos com branco na máscara usando cv.fillConvexPoly
. Em seguida, aplicamos uma operação bitwise and
entre warp_image
e frame
usando a máscara, para sobrepor a imagem aumentada no quadro original.
Se a imagem de origem não estiver disponível, adicionamos um texto "No_Motors_Infos" no primeiro ponto de destino para indicar que não há informações disponíveis.
Passo 4: Executando a Detecção e Augmentation de ArUcos
Agora vamos implementar o método run
para executar a detecção e aumentação de ArUcos em tempo real.
def run(self):
cap = cv.VideoCapture(0)
try:
while True:
ret, frame = cap.read()
if not ret:
break
gray_frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
marker_corners, marker_IDs, reject = aruco.detectMarkers(
gray_frame, self.marker_dict, parameters=self.param_markers
)
if marker_corners:
for ids, corners in zip(marker_IDs, marker_corners):
corners = corners.reshape(4, 2)
corners = corners.astype(int)
if ids[0] < len(self.images_list):
self.image_augmentation(frame, self.images_list[ids[0]], corners)
else:
self.image_augmentation(frame, None, corners)
cv.imshow("frame", frame)
key = cv.waitKey(1)
if key == ord("q"):
break
finally:
cap.release()
cv.destroyAllWindows()
Neste método, criamos um objeto cap
para capturar o vídeo da webcam (índice 0). Dentro de um loop infinito, lemos cada quadro do vídeo usando cap.read()
. Em seguida, convertemos o quadro para escala de cinza usando cv.cvtColor
.
Usamos aruco.detectMarkers
para detectar os marcadores ArUco no quadro. Se houver marcadores detectados, iteramos sobre os IDs e os cantos dos marcadores usando um loop for
. Redimensionamos os cantos para um formato adequado e, em seguida, verificamos se o ID está dentro do intervalo da lista de imagens disponíveis. Se estiver, chamamos o método image_augmentation
com a imagem correspondente e os cantos dos marcadores. Caso contrário, chamamos o método image_augmentation
com None
como imagem de origem. Para criação dos ArUcos eu utilizei os ArUcos dos IDs 1 e 2, qualquer outro ID será classificado com “no_motors_infos”, e para criação dos desenhos dos ArUcos eu usei esse site aqui: https://chev.me/arucogen/
Exibimos o quadro resultante usando cv.imshow
. O loop é interrompido se a tecla "q" for pressionada. Ao final, liberamos a captura de vídeo e fechamos as janelas abertas usando cap.release()
e cv.destroyAllWindows()
.
Passo 5: Executando o Código
Para executar o código, criamos uma instância da classe ArucoDetect
e fornecemos o diretório de imagens de aumento. Em seguida, chamamos o método run
para iniciar a detecção e aumentação de ArUcos em tempo real.
if __name__ == "__main__":
image_directory = os.path.join("images", "augmentation")
aruco_detector = ArucoDetect(image_directory)
aruco_detector.run()
Certifique-se de fornecer o diretório correto contendo as imagens de aumento antes de executar o código. Os vídeos abaixo mostram a aplicação funcionando:
Conclusão:
Neste artigo, exploramos as aplicações dos ArUcos na manutenção de motores, destacando duas funcionalidades específicas. Primeiramente, mostramos como os ArUcos podem ser utilizados para a obtenção de dados dos motores por meio da realidade aumentada. Ao posicionar marcadores ArUcos em pontos estratégicos dos motores e escaneá-los com um dispositivo de RA, é possível visualizar informações virtuais sobre cada componente, como dados técnicos, status de funcionamento e instruções de reparo. Isso torna a experiência do usuário mais imersiva e informativa, facilitando a coleta de dados relevantes para a manutenção.
Além disso, abordamos a visualização de agendamentos de manutenção preventiva e preditiva usando ArUcos. Com marcadores aplicados em um calendário ou plano de manutenção físico, é possível escanear os ArUcos com um dispositivo de RA e visualizar as tarefas agendadas, datas, descrições e prioridades. Essa funcionalidade combina a facilidade de uso dos ArUcos com a praticidade do agendamento de manutenção digital, proporcionando acesso rápido e intuitivo às informações necessárias para realizar as tarefas de manutenção de forma eficiente e organizada.
Para implementar a detecção e sobreposição dos ArUcos em tempo real, apresentamos um código que utiliza as bibliotecas OpenCV e ArUco. O código realiza a detecção dos marcadores ArUco em um vídeo capturado pela webcam e aplica a "image augmentation", sobrepondo imagens nos marcadores detectados. Ele utiliza técnicas de visão computacional, como a transformação de perspectiva, para posicionar corretamente as imagens aumentadas sobre o mundo físico.
Com a contínua evolução da tecnologia, os ArUcos têm o potencial de desempenhar um papel cada vez mais importante na integração da realidade aumentada em diversas aplicações, especialmente na área de manutenção de motores. Essa combinação de tecnologias oferece aprimoramentos significativos em eficiência, precisão e acessibilidade, permitindo que equipes de manutenção obtenham informações valiosas e realizem suas tarefas com maior eficácia.
No futuro, espera-se que os ArUcos continuem a impulsionar a adoção da realidade aumentada em diferentes setores, abrindo caminho para experiências mais imersivas e interativas. À medida que mais empresas e profissionais reconhecem o potencial dos ArUcos na manutenção de motores e em outras áreas, é provável que novas aplicações e aprimoramentos surjam, impulsionando ainda mais a evolução dessa tecnologia promissora.
Referências Bibliográficas:
https://docs.opencv.org/4.5.3/d9/d6d/tutorial_table_of_content_aruco.html
Munoz-Salinas, R., Medina-Carnicer, R., & Gomez-Jaime, R. (2021). ArUco: An Open-Source Library for Real-Time Detection of ArUco Markers. IEEE Robotics & Automation Magazine, 28(1), 92-102.
https://www.uco.es/investiga/grupos/ava/portfolio/aruco/
Tavares, A. F. P. (2021). Método Híbrido de Detecção e Estimativa de Posição de Marcador para Aterrissagem Autônoma de Quadricóptero. Dissertação de mestrado, Universidade Estadual de Campinas, Faculdade de Engenharia Mecânica, Campinas.