Boa tarde, queridos leitores de Habr! Esta é a segunda parte da história sobre o uso da câmera olho de peixe no Raspberry Pi 3. A primeira parte pode ser encontrada
aqui . Neste artigo, falarei sobre como calibrar uma câmera olho de peixe e usar a câmera para detectar objetos usando o pacote find_object_2d. Quem se importa, por favor, debaixo do gato.
Calibre uma câmera olho de peixe usando camera_calibration
Aqui, descrevo o procedimento de calibração com base no
manual oficial no portal ros.org.
Para realizar a calibração, precisamos do pacote de calibração da câmera. Podemos instalá-lo com o apt:
sudo apt-get install ros-kinetic-camera-calibration
Vamos precisar de um modelo quadriculado. Faça o download do modelo no
manual oficial em ros.org e imprima-o. Por conveniência, colei em uma placa de madeira compensada:

Vamos executar o programa de calibração:
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.108 image:=/usb_cam/image_raw camera:=/usb_cam
Vamos tirar uma foto:

Mova um pouco o modelo e aguarde até que o modelo seja selecionado no quadro (linhas coloridas com pontos não aparecerão no modelo).


Mova o modelo um pouco mais para o lado. Para realizar a calibração com sucesso, precisamos executar uma série de movimentos do modelo na frente da câmera, de um lado para o outro, para que o modelo caia em todas as posições angulares no campo de visão da câmera (esquerda, direita, superior e inferior). À direita da janela de imagem da câmera na janela do programa está o painel de registro com três barras de progresso:
- X captura o movimento do padrão na direção esquerda / direita (horizontal) no campo de visão da câmera
- Y captura o movimento do padrão na direção para cima / baixo (horizontal) no campo de visão da câmera
- Tamanho captura a abordagem / remoção do modelo da câmera e inclina-a em relação à câmera.
- Inclinar fixa a inclinação do modelo para a esquerda, direita, para cima e para baixo (chanfro).
Portanto, para uma calibração bem-sucedida, é importante que o modelo apareça em diferentes cantos do quadro, ocupe todo o quadro e também seja inclinado para a esquerda, direita, para cima e para baixo.
Calibrar uma câmera olho de peixe em seu Raspberry Pi pode demorar um pouco, portanto seja paciente. Meu procedimento de calibração levou 20 minutos.
Quando a calibração estiver concluída, o botão Calibrar deve ser ativado (destacado em cores):

Também podemos ver os resultados da calibração no terminal:

Se você estiver satisfeito com o resultado, pressione o botão COMMIT. A janela do programa será fechada e você verá a mensagem "escrevendo dados de calibração em ..." no terminal.
Verifique se o arquivo especificado foi criado:
ll ~/.ros/camera_info/head_camera.yaml -rw-rw-r-- 1 vladimir vladimir 592 Apr 14 14:02 /home/vladimir/.ros/camera_info/head_camera.yaml
Calibração concluída. Agora, os dados de calibração obtidos podem ser usados na localização visual e nos algoritmos SLAM no ROS.
Detectando objetos usando o find_object_2d
A instalação do
pacote é bastante simples. Instale-o a partir do repositório apt no Ubuntu 16.04 para ROS Kinetic:
sudo apt-get install ros-kinetic-find-object-2d source /opt/ros/kinetic/setup.bash
Execute o ROS master e o rqt_image_view:
roscore roslaunch usb_cam usb_cam-test.launch
Usando o seguinte comando, inicie o nó do detector:
rosrun find_object_2d find_object_2d image:=/usb_cam/image_raw
A janela do programa de detecção é aberta:

Aqui veremos o fluxo da câmera e o resultado da detecção de características em objetos.
Para começar, realizaremos treinamento em detectores em nossas instalações. Coloque o primeiro objeto na frente da câmera:

Clique com o botão direito do mouse no painel esquerdo de Objetos na janela e a opção Adicionar objetos da cena será aberta. Selecione esta opção e a janela para adicionar um objeto será aberta:

Depois de escolher a melhor posição para o objeto, clique no botão Tirar foto para tirar uma foto do objeto:

Precisamos selecionar o objeto na imagem. Use o cursor do mouse para selecionar o objeto:

Clique no botão Avançar para cortar o objeto na imagem e passar para a próxima etapa. Depois de cortar a imagem, obtemos o número total de recursos característicos detectados no objeto. Resta apenas pressionar o botão Finalizar para adicionar o objeto ao banco de dados de objetos detectores treinados. Aqui vemos a última etapa do procedimento para adicionar um objeto:

Como resultado, treinamos o detector em um objeto. Agora você pode tentar a detecção do objeto na cena:

Vamos desenhar a posição do objeto detectado no terminal:
rosrun find_object_2d print_objects_detected
A saída será assim:
Object 1 detected, Qt corners at (259.387238,103.530960) (448.684052,79.495495) (282.419050,240.049667) (458.438938,199.656717) --- Object 1 detected, Qt corners at (255.340408,104.615120) (451.348079,75.302353) (284.672425,230.382223) (452.696585,197.625600) --- Object 1 detected, Qt corners at (253.440521,102.973320) (447.226440,76.793541) (278.530854,238.918013) (454.377219,197.526599) ---
Vamos listar os tópicos:
rostopic list
Dois novos tópicos apareceram na lista: / objects e / objectsStamped.
Exibimos informações sobre os objetos detectados:
rostopic echo /objects
layout: dim: [] data_offset: 0 data: [1.0, 266.0, 177.0, 0.7527905702590942, 0.060980819165706635, 0.00022385441116057336, 0.3012462854385376, 0.8929792046546936, 0.0008534671505913138, 334.9065856933594, 182.55294799804688, 1.0] ---
Aqui, o segundo e o terceiro valores (266,0, 177,0) representam a largura e a altura do objeto. Todos os outros valores no campo de dados representam uma matriz de homografia 3x3 (usada para calcular a posição e orientação do objeto, bem como os valores de escala e deslocamento).
Como mostram as observações, o find_object_2d faz um péssimo trabalho na detecção de objetos com uma textura fraca ou sem textura (sem textura). Além disso, o detector é ineficaz ao detectar um objeto em um ângulo grande em relação ao objeto (se observarmos o objeto de lado) ou a uma grande distância do objeto.

Depois de concluir o trabalho com o detector, o find_object_2d nos oferecerá para salvar os objetos adicionados no disco.
Por enquanto é tudo. Boa sorte a todos e até breve!