Aplicação com câmera usando Qt5

câmera

Introdução

 

QCamera é uma classe do Qt5 que prove para o desenvolvedor toda estrutura necessária para listar dispositivos webcams e cada câmera conectada ao PC, selecionar o dispositivo desejado e executar tarefas como capturar imagem, reproduzir ou até mesmo gravar.

 

 

Configuração do sistema

 

Para sucesso na execução deste artigo, utilizarei a distribuição Linux Mint 17 Qiana 64 bits, mas não há problemas em realizar o procedimento em um Ubuntu ou outra distribuição suportada pelo Qt5. A seguir são listados os seus pré-requisitos:

  • Qt5.4 ou Qt5.5 instalado com o Qt Creator;
  • QCamera instalado;
  • Distribuição Linux suportada pelo Qt5.

 

 

O básico do QCamera

 

Para utilizar o QCamera, que não é um Widget para arrastar e soltar na aplicação, devemos incluir algumas dependências em nosso projeto. Então, vamos criar nosso projeto.

 

Clique em File > New File or Project..., selecione Application, em seguida Qt Widgets Application e prossiga. Na janela seguinte dê um nome para o projeto (estarei usando o nome myCam) e avance, deixe selecionado os Kits default e avance. Em Base Classe selecione QWidget, avance e Finish.

 

Primeira alteração que devemos realizar é adicionar multimedia ao QT do myCam.pro.

 

 

Em seguida no widget.cpp adicionar o header QCamera:

 

 

Pronto, as dependências eram essas, agora vamos a uma primeira aplicação, onde irei listar as câmeras e imprimir no output do console.

 

O seu widget.h deve ficar como abaixo:

 

 

E agora o widget.cpp:

 

 

Pressionando Ctrl+b construímos a aplicação e Ctrl+r a executamos. A saída da aplicação, no meu caso sem câmera, conectando 1 câmera e depois 2 câmeras:

 

 

Para realizar estes testes em meu notebook, primeiro eu removi o módulo uvcvideo:

 

 

Executei a aplicação e nenhuma câmera foi detectada. Em seguida, subi o módulo novamente:

 

 

Executei a aplicação e uma câmera foi detectada. Na sequência pluguei uma webcam na porta USB e executei novamente a aplicação. Ela detectou 2 dispositivos.

 

Quem fez todo o trabalho foi o QCameraInfo::availableCameras() e usando a função count() conseguimos saber quantos dispositivos foram detectados. Validar essa verificação antes de iniciar a aplicação é importante.

 

 

Obtendo informações das câmeras

 

Acima conseguimos listar as câmeras presentes no notebook no qual estamos executando a aplicação, e se quiséssemos obter mais detalhes sobre cada dispositivo, como o nome do dispositivo e descrição.

 

Vamos editar o widget.cpp da seguinte maneira:

 

 

Usei a mesma aplicação, mas caso sejam encontradas câmeras, irei montar uma QList e imprimir na tela varias informações, que pode ser vista na lista 13 a 19.

 

 

Uma análise rápida que podemos fazer é que a webcam do meu notebook é o device /dev/video0 e a webcam USB é /dev/video1. A câmera default é a do meu notebook /dev/video0, tenho a description de cada uma, que facilita saber quem é quem. Position não tem definido, mas é algo muito útil, pois podemos ter QCamera::BackFace e QCamera::FrontFace, uma forma de dizer se a câmera esta atrás da tela ou na frente, igual nos celulares. Além do parâmetro orientation.

 

Existem 4 possíveis maneiras de selecionar uma câmera com o QCamera():

  • QCamera() : Sendo a default selecionada;
  • QCamera(const QbyteArray &devicename) : Fornecendo um device name da câmera;
  • QCamera(const QcameraInfo &cameraInfo) : Fornecendo o camerainfo da câmera;
  • QCamera(QCamera::Position position) : Fornecendo QCamera::FrontFace ou QCamera::BackFace.

 

 

Construindo aplicação básica com QCamera

 

Em poucas linhas vamos desenvolver uma aplicação para abrir nossa câmera padrão e mostrar no Widget de nossa aplicação.

 

Vamos criar o projeto myCamDefault em File > New File or Project... > Application > Qt Widgets Application > name: myCamDefault > Base Class selecione Qwidget > Finish.

 

Caso tenha dúvida no procedimento para criar uma aplicação Widget, acesse o artigo Qt5 Console e Widgets.

 

Editando o arquivo myCamDefault.pro:

 

 

No .pro adicionamos multimedia e multimediawidgets, que são dependências para QCamera, e agora vamos ao widget.cpp:

 

 

Tudo começa na linha 15 onde crio o objeto QCamera cam e passo o w, que é o widget atual da minha aplicação. Na linha 20 crio um objeto QCameraViewFinder viewf, que é nosso visualizador, e passo o w novamente. Na linha 25 e 26 é uma macete para que o QCameraViewFinder ocupe o Widget inteiro, ou melhor, seja do tamanho dele. Na linha 32 passo para meu objeto cam quem será meu visualizado, no caso, viewf e logo em seguida inicio a câmera.

 

Construindo e executando nossa aplicação (Ctrl+b e Ctrl+r), temos a aplicação com a reprodução da câmera, conforme a Figura 1.

 

camera usando Qt5: QCamera e ViewFinder
Figura 1: Qt5 Widget com QCameraViewFinder reproduzindo webcam

 

Selecionando uma câmera e visualizando

 

Agora vamos criar outro projeto, onde podemos listar as câmeras disponíveis, escolher uma e reproduzir na aplicação.

 

Vamos criar o projeto myCamSelect em File > New File or Project... > Application > Qt Widgets Application > name: myCamSelect > Base Class selecione Qwidget > Finish.

 

OBS: Deve-se adicionar multimediawidgets ao QT do myCamSelect.pro, para trabalhar com o QCameraViewFinder como Widget.

 

 

Primeiramente vamos “desenhar” nossa tela clicando no widget.ui, que possuirá:

 

ComponenteNome
QpushButtonbtnOpenCam
QpushButtonbtnCloseCam
QpushButtonbtnCaptureImage
QpushButtonbtnClose
QComboBoxcbListCam
QStackedWidgetstackedWidget
QWidgetviewfinderPage
QCameraViewFindercamViewFinder

 

Caso tenha alguma dificuldade em posicionar ou configurar a interface gráfica (.ui), o projeto completo será disponibilizado no final do artigo. Segue na Figura 2 como ficou a tela.

 

camera usando Qt5: Qt5UIQCamera
Figura 2: Desenho da tela Cameras no Qt5 com QCamera

 

Agora segue o código com comentários em cada função ou uma importante etapa da aplicação, começando pelo widget.h:

 

 

Editando  o widget.cpp:

 

 

Em main.cpp não houve alterações.

 

Para entender o que foi feito, criamos dois ponteiros, um para QCamera que será o objeto cam e um para QCameraViewFinder que será o objeto viewFinder. No widget.cpp setamos o cam com o device selecionado no QComboBox e configuramos nossa viewFinder com o QCameraViewFinder no QStackedWidget, e os botões possuem ações de iniciar e parar a câmera. O botão Captura Image é um aperitivo para o próximo artigo.

 

Compilando e executando nossa aplicação:

 

câmera usando Qt5: câmera externa
Figura 3: Selecionando /dev/video1 no Qt5 QCamera

 

câmera usando Qt5: câmera onboard
Figura 4: Selecionando /dev/video0 no Qt5 QCamera

 

Como não tenho mais um Tux, o Sidney (Figura 3) auxiliou na captura da webcam externa 🙂 e eu na webcam onboard.

 

As aplicações aqui apresentadas têm por fim mostrar as possibilidades da ferramenta em uma abordagem didática. A partir desta base pode-se customizar e explorar os recursos de acordo com a necessidade da aplicação ou projeto.

 

 

Download do Projeto

 

 

Referências

 

NEWSLETTER

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

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

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

Cleiton Bueno
Proprietário da B2Open onde oferecemos consultoria, treinamentos e desenvolvimento em Sistemas Embarcados. Entusiasta a filosofia open-source, mais de 10 anos de experiências em Linux e FOSS. Em sistemas embarcado do firmware baremetal ao Linux Embedded, e há aproximadamente 8 anos desenvolvendo em (C, Python, Qt e muito Shell Script), além de profiling, hardening e tuning para targets com Linux Embarcado. Graduado em Engenharia da Computação pela UNICEP com ênfase em robótica e sistemas embarcados.

Deixe um comentário

avatar
 
  Notificações  
Notificar