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 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.
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:
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
- 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
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
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".
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 .
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!
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
Postar um comentário