você está aqui: Home  → Arquivo de Mensagens

Visão Computacional - Reconhecendo objetos na plataforma Linux via Webcam

Colaboração: Alessandro de Oliveira Faria

Data de Publicação: 22 de janeiro de 2013

Visão Computacional - Breve introdução

As bibliotecas de visão computacional (mais especificamente, a biblioteca OpenCV), apresentam:

  • Recursos de manipulação de imagem
  • Entrada e saída de vídeo
  • Cálculo de matriz
  • Álgebra linear
  • Morfologia matemática
  • Análise estrutural
  • Reconhecimento de objeto
  • Gráficos primitivos

Como se não fosse o suficiente, a biblioteca OpenCV abstrai a utilização de técnicas de programação multinuclear como OpenMP e TBB da Intel, como também a utilização de GPU.

Para detectar objetos, é preciso utilizar algoritmos que obtêm características invariantes no aspecto de rotação e escala com relação ao ponto de observação do dispositivo de captura. Para que, somente então, posteriormente utilizarmos esta abstração para comparação entre duas imagens.

A imagem acima demonstra na íntegra o problema resolvido de reconhecimento das características invariantes. Ressalto que as soluções propostas neste documento são apenas uma de inúmeras maneiras de equacionar tal tarefa computacional.

Programação multinuclear e GPU

A programação paralela é obrigatório para obter o melhor desempenho em equipamentos atuais multicores. Algumas sugestões são as bibliotecas OpenMP ou TBB (Threading Building Blocks) da Intel, que encarregam-se da utilização do software ao ambiente baseado na quantidade de núcleos.

Para continuar a interminável corrida no código perfeito, para obter leveza e suavidade em sistemas de visão computacional junto à programação paralela, é saudável utilizar o uso orquestrado das GPU e CPUs.

Atualmente existem APIs e/ou SDK da NVIDIA, Intel e ATI/AMD (mais informações em algumas edições na Linux Magazine, ou no site Viva o Linux).

Download e instalação

Aqui veremos algumas dicas dos pacotes com requisitos obrigatórios e opcionais. A decisão de utilizar todos estes pacotes fica a cargo de leitor e também da capacidade e configuração do hardware em utilização.

TBB (opcional)

Utilizei a biblioteca TBB por utilizar equipamento Intel, porém, o uso de bibliotecas similares é aconselhado. Vale a pena mencionar que a ausência deste recurso não permite a utilização de todos o núcleos presente no processador do seu equipamento. Então, a seguir as instruções de instalação:

  $ wget http://www.threadingbuildingblocks.org/uploads/78/154/3.0/tbb30_018oss_src.tgz
  $ tar -zxvf tbb30_018oss_src.tgz
  $ make
  $ cd examples/
  $ make 

CUDA: GPU NVIDIA (opcional)

NVIDIA CUDA é uma arquitetura de computação paralela de propósito geral, que tira proveito do mecanismo de computação paralela das unidades de processamento gráfico (GPUs) NVIDIA para resolver muitos problemas computacionais complexos em uma fração do tempo necessário em uma CPU.

Mais informações sobre a instalação e configuração, no link a seguir: CUDA: Programe a sua NVIDIA

Download e compilação da biblioteca OpenCV (obrigatório)

O download dos fontes da biblioteca encontra-se no link: http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.3/

E obtenha o pacote OpenCV-2.4.3.tar.bz2, ou superior. As instruções de compilação e configuração a seguir, foram testadas na versão 2.X.X, então, as demais versões poderão sofrer pequenas modificações.

Com o comando wget, efetue o download e descompacte o pacote:

  $ wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.3/OpenCV-2.4.3.tar.bz2
  $ tar -jxvf tars/OpenCV-2.4.3.tar.bz2 

Após a extração dos arquivos compactados, crie uma nova pasta na recém-criada, pelo comando tar. Entre neste novo diretório para a compilação dos fontes, seguindo as orientações a seguir:

  $ cd OpenCV-2.4.3/
  $ mkdir opencv.build
  $ cd opencv.build 

Parâmetros de compilação

Como partimos do princípio que todos os pacotes opcionais foram instalados, a seguir os parâmetros de compilação, ou diretivas de compilação, do comando cmake para utilizar os os recursos na biblioteca OpenCV:

  $ cmake -DBUILD_DOCS=ON \
  -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_LATEX_DOCS=ON \
  -DBUILD_OCTAVE_SUPPORT=ON -DBUILD_PYTHON_SUPPORT=ON \
  -DBUILD_SWIG_PYTHON_SUPPORT=ONF -DBUILD_TESTS=ON \
  -DENABLE_OPENMP=OFF -DENABLE_PROFILING=OFF \
  -DBUILD_PYTHON_SUPPORT=ON -DBUILD_NEW_PYTHON_SUPPORT=ON \
  -DBUILD_EXAMPLES=ON -DINSTALL_C_EXAMPLES=ON \
  -DINSTALL_OCTAVE_EXAMPLES=ON -DINSTALL_PYTHON_EXAMPLES=ON \
  -DWITH_1394=ON -DWITH_TBB=ON -DWITH_CUDA=ON -DWITH_FFMPEG=ON \
  -DWITH_GSTREAMER=OFF -DWITH_QT=ON -DWITH_GTK=ON \
  -DWITH_JASPER=ON -DWITH_JPEG=ON -DWITH_PNG=ON -DWITH_TIFF=ON \
  -DWITH_V4L=ON -DWITH_XINE=ON -DENABLE_SSE=ON -DENABLE_SSE2=ON \
  -DENABLE_SSE3=ON -DENABLE_SSSE3=ON -DENABLE_SSE41=ON \
  -DENABLE_SSE42=ON -DWITH_QT=ON -DWITH_QT_OPENGL=ON \
  -DCUDA_NPP_LIBRARY_ROOT_DIR=/usr/local/cuda/NPP/SDK/.. 

A seguir, utilize o comando make e make install para compilar e instalar a biblioteca OpenCV:

  $ make -j 24 

** A opção "-j" permite processar durante a compilação mais de uma tarefa simultaneamente;

*** Vá tomar um café...

Como superusuário, utilize o comando make install e ldconfig e pronto! Nesta etapa todos os requisitos foram instalados com sucesso:

  # make install
  # ldconfig 

O sistema find-object

Este pacote é uma solução de código aberto baseado em Qt e OpenCV na plataforma GNU/Linux, que permite o learning (aprendizado) e detectar o objeto recém aprendido pelo sistema.

Este projeto é de código aberto, então, é uma boa fonte de aprendizagem para os programadores. Pois além de manipular Webcam, utiliza diversos algoritmos de reconhecimento de padrão como SURF e outros. Bom, chega de blá-blá-blá.

A instalação é simples. Efetue o download do código fonte no link a seguir:

  # wget http://find-object.googlecode.com/files/Find-Object-0.4.0-Source.zip 

Agora descompacte o arquivo com o comando unzip conforme o exemplo abaixo:

  # unzip Find-Object-0.4.0-Source.zip
  Archive: Find-Object-0.4.0-Source.zip
  inflating: Find-Object-0.4.0-Source/build/.empty
  inflating: Find-Object-0.4.0-Source/src/AddObjectDialog.h
  inflating: Find-Object-0.4.0-Source/src/ParametersToolBox.h
  inflating: Find-Object-0.4.0-Source/src/Camera.h
  inflating: Find-Object-0.4.0-Source/src/ParametersToolBox.cpp
  inflating: Find-Object-0.4.0-Source/src/resources.qrc
  inflating: Find-Object-0.4.0-Source/src/AboutDialog.cpp
  inflating: Find-Object-0.4.0-Source/src/KeypointItem.h
  inflating: Find-Object-0.4.0-Source/src/ui/mainWindow.ui
  inflating: Find-Object-0.4.0-Source/src/ui/addObjectDialog.ui
  inflating: Find-Object-0.4.0-Source/src/ui/aboutDialog.ui
  inflating: Find-Object-0.4.0-Source/src/QtOpenCV.h
  inflating: Find-Object-0.4.0-Source/src/AddObjectDialog.cpp
  inflating: Find-Object-0.4.0-Source/src/Settings.cpp
  inflating: Find-Object-0.4.0-Source/src/MainWindow.cpp
  inflating: Find-Object-0.4.0-Source/src/AboutDialog.h
  inflating: Find-Object-0.4.0-Source/src/ObjWidget.h
  inflating: Find-Object-0.4.0-Source/src/utilite/UFile.cpp
  inflating: Find-Object-0.4.0-Source/src/utilite/UFile.h
  inflating: Find-Object-0.4.0-Source/src/utilite/UDirectory.cpp
  inflating: Find-Object-0.4.0-Source/src/utilite/UDirectory.h
  inflating: Find-Object-0.4.0-Source/src/utilite/UPlot.h
  inflating: Find-Object-0.4.0-Source/src/utilite/UPlot.cpp
  inflating: Find-Object-0.4.0-Source/src/utilite/UStl.h
  inflating: Find-Object-0.4.0-Source/src/resources/Find-Object.png
  inflating: Find-Object-0.4.0-Source/src/resources/TheWorkingGroup_video_play.ico
  inflating: Find-Object-0.4.0-Source/src/resources/TheWorkingGroup_video_stop.ico
  inflating: Find-Object-0.4.0-Source/src/resources/TheWorkingGroup_video_pause.ico
  inflating: Find-Object-0.4.0-Source/src/Camera.cpp
  inflating: Find-Object-0.4.0-Source/src/Settings.h
  inflating: Find-Object-0.4.0-Source/src/KeypointItem.cpp
  inflating: Find-Object-0.4.0-Source/src/MainWindow.h
  inflating: Find-Object-0.4.0-Source/src/QtOpenCV.cpp
  inflating: Find-Object-0.4.0-Source/src/rtabmap/PdfPlot.h
  inflating: Find-Object-0.4.0-Source/src/rtabmap/PdfPlot.cpp
  inflating: Find-Object-0.4.0-Source/src/ObjWidget.cpp
  inflating: Find-Object-0.4.0-Source/.project
  inflating: Find-Object-0.4.0-Source/CMakeLists.txt
  inflating: Find-Object-0.4.0-Source/example/CMakeLists.txt
  inflating: Find-Object-0.4.0-Source/example/main.cpp
  inflating: Find-Object-0.4.0-Source/bin/box.png
  inflating: Find-Object-0.4.0-Source/bin/box_in_scene.png
  inflating: Find-Object-0.4.0-Source/.cproject
  inflating: Find-Object-0.4.0-Source/LICENSE
  inflating: Find-Object-0.4.0-Source/README
  inflating: Find-Object-0.4.0-Source/app/CMakeLists.txt
  inflating: Find-Object-0.4.0-Source/app/Find-Object.icns
  inflating: Find-Object-0.4.0-Source/app/Find-Object.ico
  inflating: Find-Object-0.4.0-Source/app/Find-Object.ifx
  inflating: Find-Object-0.4.0-Source/app/main.cpp
  inflating: Find-Object-0.4.0-Source/app/Find-Object.rc
  inflating: Find-Object-0.4.0-Source/cmake_uninstall.cmake.in 

Para iniciar a compilação, entre na pasta Find-Object-0.4.0-Source/build e utilize o comando cmake:

  # cd Find-Object-0.4.0-Source/build
  # cmake ..
  -- The C compiler identification is GNU 4.7.1
  -- The CXX compiler identification is GNU 4.7.1
  -- Check for working C compiler: /usr/bin/gcc
  -- Check for working C compiler: /usr/bin/gcc -- works
  -- Detecting C compiler ABI info
  -- Detecting C compiler ABI info - done
  -- Check for working CXX compiler: /usr/bin/c++
  -- Check for working CXX compiler: /usr/bin/c++ -- works
  -- Detecting CXX compiler ABI info
  -- Detecting CXX compiler ABI info - done
  -- Looking for Q_WS_X11
  -- Looking for Q_WS_X11 - found
  -- Looking for Q_WS_WIN
  -- Looking for Q_WS_WIN - not found.
  -- Looking for Q_WS_QWS
  -- Looking for Q_WS_QWS - not found.
  -- Looking for Q_WS_MAC
  -- Looking for Q_WS_MAC - not found.
  -- Found Qt4: /usr/bin/qmake (found version "4.8.1")
  -- --------------------------------------------
  -- Info :
  --    CMAKE_INSTALL_PREFIX = /usr/local
  --    CMAKE_BUILD_TYPE = Release
  -- --------------------------------------------
  -- Configuring done
  -- Generating done
  -- Build files have been written to: /tmp/Find-Object-0.4.0-Source/build 

Para iniciar a compilação e instalação, abaixo os comandos:

  # make
  # make install 

Conceitos operacionais

Inicie o programa Find Object com o comando find_object, como no exemplo abaixo. Logo após, iniciaremos a nossa Webcam pressionando a tecla espaço. Se tudo estiver funcionando corretamente, entre na opção "EDIT" do menu, e selecione o item "Add object from scene".

  $ find_object

Agora, para executar o modo learning (aprendizado computacional), devemos focar a Webcam no objeto desejado e selecionar os pontos característicos do objeto e logo a seguir, clique em "NEXT".

Pronto, ao concluir o processo, o sistema passa a identificar e/ou reconhecer no vídeo, ao vivo, o objeto selecionado anteriormente.

A seguir, um vídeo demonstrativo com a funcionalidade do sistema em operação...

Mais dicas sobre este assunto, disponibilizarei no meu blog: Inteligência Coletiva « cabelovivaolinux.wordpress.com

Para finalizar, críticas e sugestões: cabelo[ at ]opensuse.org

Este artigo foi publicado originalmente no portal Viva o Linux

Alessandro de Oliveira Faria é sócio-fundador da empresa NETi TECNOLOGIA fundada em Junho de 1996 (http://www.netitec.com.br), empresa especializada em desenvolvimento de software e soluções biométricas, Consultor Biométrico na tecnologia de reconhecimento facial, atuando na área de tecnologia desde 1986 assim proporcionando ao mercado soluções em software nas mais diversas linguagens e plataforma, levando o Linux a sério desde 1998 com desenvolvimento de soluções open-source, diversos documentos técnicos disponibilizados na internet, membro colaborador da comunidade Viva O Linux, mantenedor da biblioteca open-source de vídeo captura entre outros projetos.


 

 

Veja a relação completa dos artigos de Alessandro de Oliveira Faria

Opinião dos Leitores

Seja o primeiro a comentar este artigo
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script