OpenCV 3.2 com Object Tracking no Windows em C++ - mais um tutorial



Sei que já existem diversos tutoriais de como instalar o OpenCV no Windows, eu inclusive usei vários deles a primeira vez que fiz isso. Porém, por algum motivo obscuro (vulgo distração e o péssimo hábito de não documentar as coisas) não consegui mais compilar a biblioteca quando tentei usar outro computador para trabalhar. Depois de passar mais quatro dias de ócio procurando respostas na internet, resolvi escrever este artigo para minha própria consulta e quem sabe ainda ajudar alguém.

Basicamente, este tutorial funciona para as versões 3.1 e 3.2 do OpenCV para C++. No final do tutorial vamos ter uma IDE (no caso, o Eclipse Neon 3), com a biblioteca instalada junto com seus módulos extras e pronto para programar.

Ambiente


Para o desenvolvimento da tese de mestrado acabei optando pelo Eclipse como IDE e C++ como linguagem de programação . O C++ vai garantir uma performance próxima da ótima (sem consisderar erros do programador, claro!), além de já ser compatível com alguns sistemas embarcados menos potentes como o Arduino, ao custo de ter uma velocidade menor de desenvolvimento (ou seja, é mais "travado" para fazer as coisas funcionarem).

Baixe aqui para Windows 32bits!
O Eclipse foi ecolhido por ser uma alternativa compatível com Linux e Windows, além de não apresentar nenhum problema caso seja necessário usar uma versão mais antiga. Vou explicar porque isso é importante: quando tentei usar a última versão do Visual Studio em uma máquina que ainda rodava Windows 7 e que por algum defeito não estava fazendo o update automático para o Windows 10, a última versão da plataforma Dot Net não podia ser instalada. E adivinhem se eu consegui achar uma versão anterior do Visual Studio em um site oficial da Microsoft? Estou usando a versão 32 bits do Neon 3 pois aparentemente a 64 tem um problema para exibir a saída no console

O compilador utilizado é o MinGW, uma versão do GCC para Windows. Existem atualmente duas versões (mingw.org e mingw-w64), e nós vamos usar a mingw-w64 de 32 bits. Tentei usar o MinGW.org e obtive erros durante a compilação, assim como para a versão 64 bits. Para escolher a 32 bits, na instalação, selecione a opção "i686" na tela de instalação, conforme a figura abaixo.




Também é necessário adicionar a pasta "mingw32w64/mingw32/bin" à variável PATH do sistema operacional. No Windows 10 você pode fazer isso em Configurações -> Sistema -> Sobre -> Informações do Sistema -> Configurações Avançadas do Sistema -> Variáveis de ambiente. Existem diversos textos explicando como adicionar uma pasta á variável PATH do sistema na internet, basta pesquisar no google. ;D

Outro programa que vamos usar é o CMake. Estou usando a versão 3.9.1 mas acho que não tem problema pegar outra mais recente. Ele serve para gerar o arquivo make, que fornece instruções para a compilação de projetos em C++ mais complexos.

Finalmente, é necessário baixar o código fonte do OpenCV. Mas, como nada na vida é fácil, o módulo de tracking não vem instalado por padrão. Então, é necessário baixar a versão "base" e a versão "contrib". Mas atenção: só consegui fazer as versões 3.1 e 3.2 funcionarem com os módulos extras!

Então, resumindo até aqui, você deve ter os seguintes programas instalados no seu computador:

  • Eclipse Neon 3 32 bits.
  • Mingw32 w64, versão 32 bits.
  • CMake.
  • OpenCV e OpenCV-contrib (arquivos .ZIP extraídos)


Criando o arquivo Make



O próximo passo é organizar os pastas onde vamos montar a biblioteca. Eu por exemplo deixei uma pasta opencv-3.1.0 na área de trabalho, junto com uma outra contendo os modulos extras chamada opencv-3.1.0-contrib, mas ainda precisamos criar uma terceira pasta onde a biblioteca compilada irá ficar, que eu por exemplo chamei de opencv-3.1.0-build. Dica: adicione esta pasta "build" como exceção ao monitoramento automático do seu antivírus para evitar que ele interfira na geração dos arquivos na hora de compilação.



Agora é necessário abrir o CMake, indicar a pasta que contém o código fonte (src), que é a própria pasta do OpenCV baixada anteriormente, e  pasta de destino. Depois, aperte "Configure", e coloque as seguintes configurações:


Na próxima tela, indique onde estão seus compiladores na pasta em que instalou o mingw32 w64:
  • C compiler: gcc.exe
  • C++ compiler: c++.exe
  • Fortran compiler: gfortran.exe
Agora temos a tela de configuração do arquivo make do opencv:


A primeira coisa a adicionar, independente da versão a ser compilada, é a pasta contendo os modulos extras. Dica: se você não encontrar a opção pois a tela possui informação demais, basta digitar "modules" no campo "Search" e apertar Enter. Também é interessnte procurar a pasta pelo botão "..." do próprio Cmake, pois se você perceber, os endereços de arquivos do programa usa barras invertidas, diferentes do Windows. Depois disso, aperte "configure" novamente e novas opções surgirão na tela de configuração e ficarão sublinhadas em rosa/vermelho.

Depois de algumas tentativas, vi que as versões 3.1 e 3.2 apresentam diferentes módulos que, se não configurados previamente, vão resultar em erros na compilação. Por isso é interessante reforçar que este tutorial vai produzir a versão básica, sem nenhum adicional do OpenCV. Dito isso, vamos às configurações de cada versão:


3.1.0 - desabilitar:

  • BUILD_DOCS
  • BUILD_EXAMPLES
  • BUILD_OPENEXR
  • BUILD_WITH_DEBUG_INFO
  • BUILD_opencv_apps
  • BUILD_opencv_bioinspired
  • BUILD_opencv_calib3d
  • BUILD_opencv_ccalib
  • BUILD_opencv_contrib_world
  • BUILD_opencv_hdf
  • BUILD_opencv_python3
  • BUILD_opencv_ts
  • BUILD_opencv_world
  • WITH_GSTREAMER
  • WITH_MATLAB
  • WITH_OPENEXR

3.2.0 - desabilitar:

  • BUILD_DOCS
  • BUILD_EXAMPLES
  • BUILD_OPENEXR
  • BUILD_WITH_DEBUG_INFO
  • BUILD_opencv_apps
  • BUILD_opencv_contrib_world
  • BUILD_opencv_hdf
  • BUILD_opencv_python3
  • BUILD_opencv_world
  • WITH_GSTREAMER
  • WITH_MATLAB
  • WITH_OPENEXR
Depois destes configurações, basta apertar "Configure" novamente, e depois "Generate".



Gerando as bibliotecas e cabeçalhos



Chegamos no passo em que a biblioteca será finalmente compilada. Abra uma tela de prompt de comando (voce pode fazer isso clicando no logo do windows e digitando "cmd"), e teste se a variável de ambiente PATH foi corretamente atualizada com o caminho para o compilador mingw32w64 digitando "mingw32-make" e dando enter. O mingw32-make deve retornar um erro, conforme a figura abaixo. Caso o programa mingw32-make não seja encontrado, é necessário verificar o PATH.



Primeiro vamos compilar a biblioteca indo na pasta "build" com o comando "cd ENDEREÇO". Depois, basta digitar "mingw32-make all" e esperar o código compilar. Voce deve ver algo parecido com a tela abaixo:


Quando o processo terminar (pode demorar algumas horas!), você ainda precisa executar o comando "mingw32-make install" para gerar os cabeçalhos de função utilizados na hora de programar. Eles são aqueles arquivos referenciados nos "include"s no começo do código em C++. Você deve ver algo parecido com isso no terminal:



Nesta etapa, sua pasta "build" deve conter:
  • uma subpasta "bin" que contém os arquivos .dll.
  • uma subpasta "install/include" contendo as subpastas opencv e opencv2, que contém os cabeçalhos da biblioteca (arquivos .hpp).


Configurando o Eclipse



A primeira coisa a ser feita depois de abrir o Eclipse e escolher a pasta onde será o workbench, é ir em Window -> Preferences e adicionar o compilador ao PATH. Para isso, va em C++ -> Build -> Environment e adicione a entrada PATH, conforme a imagem abaixo.



Depois, crie um novo projeto em File -> New -> C/C++ Project -> C++ Managed Build -> Finish.

Então, clique com o botão direito em cima da pasta do projeto no menu da esquerda e clique em "Properties".

Agora, vamos modificar o compilador para o MinGW. Em C/C++ Build -> Tool Chain Editor. Mude o "Configurations" para "[All configurations]", Current toolchain para MinGW GCC, conforme figura abaixo. Depois clique em "Apply".



Depois, vá em C/C++ Build -> Settings -> GCC C++ Compiler -> Includes e adicione a pasta "install/include" dentro do seu diretório "build", conforme a figura abaixo.



Finalmente, clique em "Apply". Depois vá em MinGW C++ Linker -> Libraries, e adicione a pasta "bin" no Library search path, e inclua os nomes dos arquivo contendo as bibliotecas individualmente em Libraries. Obs: é necessário colocar o nome do arquivo sem o "lib" na frente nem o ".dll". Assim, libopencv_core320.dll deve ser incluido apenas como opencv_core320 .



Com essas configurações você já deve conseguir compilar e rodar algo no seu Eclipse. Vamos rodar um programa básico que apenas mostra uma foto em uma janela.



Rodando um programa de teste



Agora podemos criar um arquivo teste.cpp no projeto e adicionar o seguinte código:


#include <opencv2/opencv.hpp>
using namespace cv;
int main( int argc, char** argv )
{
  Mat image;
  image = imread( argv[1], 1 );
  if( argc != 2 || !image.data )
    {
      printf( "No image data \n" );
      return -1;
    }
  namedWindow( "Display Image", WINDOW_AUTOSIZE );
  imshow( "Display Image", image );
  waitKey(0);
  return 0;
}

Você vai perceber que alguns erros vão aparecer. Precisamos colocar as seguintes bibliotecas para este projeto compilar:

  • opencv_core
  • opencv_imgproc
  • opencv_imgcodecs
  • opencv_highgui
  • opencv_features2d

Lembrando que deve ser igual ao nome do arquivo sem o "lib" no início e sem o ".dll" no final. No caso da versão 3.2.0, o arquivo core fica "opencv_core320", e assim por diante.

Agora basta clicar em Project -> Build All, entrar no cmd.exe na pasta "Release" ou "Debug" do seu projeto e ele deve ter criado um executável. Basta rodar e ver se ele exibe a mensagem de "No image data" caso você não especifique a foto, ou então se eibe a foto caso ela seja passada como parametro na chamada do executável.

Como sempre, quaisquer dúvidas ou sugestões, mandem bala nos comentários abaixo!

Comentários

Top 3 em 1 ano: