Como adicionar OpenCV em aplicações Qt

A visão computacional é um campo interdisciplinar que envolve uma série de procedimentos de processamento de imagem e algoritmos sofisticados de inteligência artificial e aprendizado de máquina para extrair significados de imagens e vídeos, como detectar objetos e faces, reconhecer caracteres, identificar placas de carro e até fazer aquela selfie engraçada com filtros faciais do Instagram ou Facebook. Uma das bibliotecas mais consagradas desse assunto é a OpenCV, de código aberto, disponível em C/C++ otimizado, Python e Java.

Para construir a aplicação, é possível aliar a visão computacional com uma bela, ou melhor, fofa interface de usuário em Qt, que é um framework de desenvolvimento em C++/QML (Qt Modeling Language) multiplataforma, o qual possui uma IDE chamada QtCreator.

Neste artigo iremos iniciar com Qt e OpenCV por meio de uma aplicação para detecção de faces frontais em fotos com uma simples interface de usuário. Apesar da simplicidade da nossa aplicação de demonstração, é possível alcançar resultados bastante interessantes e mais sofisticados com o uso destas ferramentas poderosas, como no exemplo abaixo que realiza o reconhecimento de caracteres, detecta faces, lê QR Codes, códigos de barras em fotos e as armazena em uma galeria, acessíveis através de uma interface de usuário mais elegante com animações e transições mais suaves. Veja a demonstração a seguir:

Essa combinação de funcionalidades pode ser um tanto computacionalmente custosa, portanto, para alcançar uma boa performance é preciso escolher cautelosamente o hardware. Nesta empreitada, será necessário utilizar uma placa com memória RAM e frequência de CPU suficientemente altos para obter fluidez na tela e velocidade nos processamentos do OpenCV. Portanto, a configuração do QtCreator e instalação do OpenCV serão realizados para o Computador em Módulo (CoM) Apalis iMX6Q com 1GB de RAM, 4 núcleos de CPU na frequência máxima de 996 MHz com heatsink, a placa base Ixora e o módulo de câmera CSI OV5640.

Hardware escolhido com aplicação OpenCV + Qt rodando
Figura 1: Hardware escolhido com aplicação OpenCV + Qt rodando
Tela inicial da aplicação OpenCV + Qt de detecção de faces frontais
Figura 2:  Tela inicial da aplicação OpenCV + Qt de detecção de faces frontais

Mãos à obra!

Para começar o desenvolvimento com Qt e OpenCV, vamos compilar e instalar a imagem Boot2Qt (B2Qt), fazendo uso do Kernel do Linux Embarcado fornecido pela Toradex. A B2Qt e sua toolchain são fornecidas pela Qt Company, especificamente para sistemas embarcados com uma série de otimizações, possuindo os mais diversos CoMs suportados, como Apalis e Colibri iMX6, Colibri iMX7 e VFxx, Raspberry Pi, BeagleBone Black e entre outros.

Instalando a imagem B2Qt: OpenCV + Qt

Agora vamos percorrer os passos para gerar com Yocto uma imagem B2Qt para o CoM Apalis iMX6Q com OpenCV. Os passos iniciais de eliminação das dependências, clone do repositório e configuração das variáveis de ambiente estão devidamente indicados no tutorial do Qt de compilação da B2Qt.

Como estamos utilizando o CoM Apalis iMX6Q, iremos adicionar a layer da Toradex e o pacote do OpenCV.

Para instalar a imagem, será necessário preparar um cartão SD formatado em FAT32. Os passos para tal e a instalação da B2Qt no CoM estão presentes neste artigo.

Para utilizar o módulo de câmera CSI, é necessário também alterar a device tree, isto é, na interrupção do boot, rode os comandos:

É possível também utilizar uma Webcam USB, caso você não possua o módulo de câmera analógico.

Verifique que a instalação do OpenCV foi bem sucedida testando em Python:

Certifique-se procurando as bibliotecas:

Agora vamos gerar a SDK com as bibliotecas do OpenCV. Volte para o ambiente de compilação da imagem e siga os passos a seguir:

Verifique que as bibliotecas do OpenCV estão presentes na SDK pela busca:

Configurando o Kit de Compilação do QtCreator

O QtCreator permite que sejam configurados kits de compilação para diversas plataformas. Assim, se faz necessário indicar os caminhos de compiladores, debuggers e entre outros. Para mais informações a respeito da configurações de kits de compilação, acesse este link.

A aplicação

Teste da aplicação OpenCV + Qt de detecção de faces frontais
Figura 3: Teste da aplicação OpenCV + Qt de detecção de faces frontais

A fim de incluir as bibliotecas do OpenCV no projeto em Qt, precisamos indicar no arquivo .pro os caminhos. O exemplo de detecção de rostos em imagem que será apresentado precisará apenas de 3 bibliotecas:

Algoritmo

A aplicação de exemplo desenvolvida é uma câmera que detecta faces através de cascatas de classificadores Haar (Haar Feature-based Cascades Classifiers), com uma interface de usuário bastante simples.

O algoritmo utilizado para detecção de rostos foi proposto por Paul Viola e Michael Jones no artigo “Rapid Object Detection using a Boosted Cascade of Simple Features” em 2001, cuja estratégia é baseada em aprendizado de máquina com treinamento a partir de imagens negativas (que não contém faces) e positivas (que contém faces) para gerar o classificador.

É possível encontrar arquivos XML de classificadores fornecidos pelo OpenCV no sistema de arquivos do CoM em /usr/share/OpenCV/haarcascades/ inclusive com outros tipos de objetos treinados, como olhos, sorriso.

Código

O desenvolvimento da aplicação utilizou QML, a linguagem declarativa de interfaces do Qt e C++, onde são exploradas as bibliotecas do OpenCV para detectar faces nas imagens tiradas da câmera.

No QML, existem 2 tipos importantes para invocar a câmera: VideoOutput e Camera, em que o primeiro disponibiliza a saída do segundo. Assim, é possível selecionar a câmera e configurar o VideoOutput para disponibilizar o stream de vídeo do dispositivo.

Estes recursos foram utilizados para mostrar a saída da câmera e tirar foto, que é capturada para a localização padrão do Qt, a qual é enviada ao C++ para a rotina de detecção de faces.

Neste exemplo é carregado o classificador direto do sistema de arquivos do CoM utilizando a classe CascadeClassifier do OpenCV, que provê um método de detecção, cuja saída é o vetor de retângulos onde as faces se localizam. A seguir encontra-se o trecho de código referente à classe citada:

Para usar a aplicação, basta rodá-la com o AppController da imagem B2Qt:

Esta aplicação está disponível no Github.

Saiba mais

Compilação e instalação do OpenCV 3.1.0 na Raspberry Pi Zero W

Contagem de objetos em movimento com OpenCV e Python usando Raspberry Pi

Aplicação de visão computacional com OpenCV

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Linux Embarcado » Como adicionar OpenCV em aplicações Qt
Comentários:
Notificações
Notificar
guest
3 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Juliano Carvalho Sansão
Juliano Sansão
21/05/2018 10:55

Cara Luísa, excelente artigo.

Uma pergunta, eu preciso de uma licença do QT for Device Creation ou posso baixar o Boot2QT e o toolchain com a versão free?

Abraços,

Tiago
Tiago
Reply to  Luísa Burini
10/11/2018 12:06

Olá bom dia Luisa você desenvolve algum produto? Poderia entrar em contato se sim por gentileza! [email protected]
Obrigada!

Talvez você goste:

Séries

Menu