Tutorial OpenCV com Microsoft Visual C#

Olá pessoal,

Como parte do processo de desenvolvimento de nosso projeto com robôs aéreos, mais especificamente o segmento relacionado ao processamento de imagens usando visão computacional, o uso da ferramenta livre OpenCV, desenvolvida pela Intel, é indispensável. Originalmente desenvolvido para uso junto às linguagens c/c++, o OpenCV é uma poderosa biblioteca gráfica que permite a realização de inúmeras tarefas envolvendo desde filtragem de imagens/vídeos a reconhecimento de padrões.

Em determinadas circunstâncias, é desejável empregar o processamento de imagens em projetos cujo desenvolvimento se dá nas demais linguagens e IDEs existentes. Uma dessas IDEs é o Visual C#, desenvolvido pela Microsoft como parte do pacote .NET (Dot NET). O Visual C# é uma excelente e poderosa ferramenta para desenvolvimento de aplicações envolvendo GUI (interfaces gráficas) por simplificar a tarefa do programador nesse sentido. Caso você esteja programando sistemas de visão em Visual C++, eu recomendo o tutorial do meu amigo André Carmona, o qual você pode acessar aqui.

Entretanto, como mencionado acima, o OpenCV foi escrito originalmente para integra-se às IDEs com suporte às linguagens c/c++, não sendo possível a sua integração direta ao Microsoft Visual C#. No entanto, há (felizmente!) uma distribuição (também denominadas wrappers) própria para a integração entre OpenCV e C# chamada EMGU CV (http://www.emgu.com/wiki/index.php/Main_Page) .

Neste tutorial, irei ensiná-los a efetuar essa integração de maneira que você possa, com sucesso, desenvolver suas aplicações em Visual C# utilizando-se dos poderosos recursos oferecidos pelo OpenCV.

Integração Entre OpenCV e Visual C#

Considerarei, a partir de agora, que você já possui o pacote OpenCV devidamente instalado em seu PC. Caso não tenha, você pode baixá-lo aqui.

1. Baixe o arquivo contendo o wrapper do EMGU CV (libemgucv-windows-x86-2.3.0.1416) aqui.

2. Para instalar o pacote, selecione o local de sua preferência.

3. Inicie um novo projeto no Visual C# (console ou windows form, não importa).

4. Criado o projeto, dentro do Visual C#, acesse via menu:

PROJECT >> ADD REFERENCE

5. Acesse a aba BROWSE. Busque pela pasta BIN que se encontra no diretório onde o EMGU C Sharp foi instalado.

6. Selecione os seguintes arquivos:

Emgu.CV.dll
Emgu.CV.UI.dll
Emgu.Util.dll

E seguida, clique em OK. Você notará que os arquivos pertinentes à biblioteca surgirão no SOLUTION EXPLORER, ao lado (vide figura abaixo);

7. No cabeçalho da função principal de seu programa, adicione as seguintes bibliotecas:

using Emgu.CV;
using Emgu.Util;
using Emgu.CV.Structure;

8. Agora você deverá inserir as seguintes bibliotecas ao seu projeto, as quais se encontram na pasta BIN da sua distribuição EMGU:

opencv_calib3dXXX.dll
opencv_contribXXX.dll
opencv_coreXXX.dll
opencv_features2dXXX.dll
opencv_highguiXXX.dll
opencv_imgprocXXX.dll
opencv_legacyXXX.dll
opencv_mlXXX.dll
opencv_objectdetectXXX.dll
opencv_videoXXX.dll

Onde o XXX se refere à versão do seu OpenCV (ex: 210 para versão 2.1 e assim por diante).
Para isso, com o botão direito, clique sobre o seu projeto em Solution Explorer:

ADD >> EXISTING ITEM

(OBS): Altere o filtro da pesquisa na janela (TIPO DE OBJETO), de modo que ele leia *.dll, caso os arquivos não se encontrem visíveis.

Você deverá ver as *dll no Solution Explorer:

9. O próximo passo é efetuar o download de um patch de correção da Microsoft aqui, cujo objetivo é solucionar alguns “bugs” de dependências internas do Visual C#.

10. Pronto. Se tudo tiver sido executado como descrito nos passoa acima, você já deverá ser capaz de utilizar o OpenCV no Visual C#. Faça o seguinte teste:

– Na função principal de seu programa, digite a seguinte linha de código (vide figura abaixo):

CvInvoke.cvNamedWindow(“Test de Integração C# + OpenCV”);

– Clique na tecla F5 e veja o seguinte resultado:

O comando CvInvoke é responsável por efetuar o direcionamento para o acesso às bibliotecas do OpenCV. Nesse sentido, cvNamedWindow(“Test de Integração C# + OpenCV”) é um método presente nas classes do OpenCV e, no nosso exemplo, efetua a criação de uma tela (formulário) com o título da nova janela como parâmetro principal. As demais funcionalidades do OpenCV como optical flow, reconhecimento de padrões e demais filtros pode (e devem) ser efetuados a partir deste simples exemplo.

Espero que tenham gostado do tutorial e que tenham sucesso nas suas aplicações.

Um abraço e até a próxima!

Sobre Eng. Rafael Coronel Bueno Sampaio, PhD.

Projeto & Pesquisa de Sistemas Mecatrônicos e Robótica Móvel
Esse post foi publicado em C#, Mecatrônica, Microsof Visual C#, OpenCV, Programação, Quadricópteros, Robôs Aéreos, Simuladores de Voo, Sistemas de Controle, Teoria de Controle, Visão Computacional. Bookmark o link permanente.

28 respostas para Tutorial OpenCV com Microsoft Visual C#

  1. Muito bo meu brother, vou acompanhar seus avanços no OpenCV com o C# e vou fazer aqui também para aprender!😀

  2. Leonardo Baggio disse:

    Muito obrigado por compartilhar essas informações. Continue postando! indiquei para alguns colegas. Nos próximos, você poderia disponibilizar um .zip do projeto que foi feito no tutorial?
    Abs.,

    • Olá Leonardo,

      Antes de tudo, obrigado pelo seu comentário. É sempre motivador ver que meus posts têm ajudado. E obrigado pelas indicações.
      Sim, logo disponibilizarei um exemplo pronto, pra servir de pontapé inicial pra vocês.

      Grande abraço!

  3. Jefersom Siqueira disse:

    Olá Rafael, excelente post!

    Sou aluno de Ciências da Computação, e estou iniciando meu TCC na areá de reconhecimento facial e processamento de imagem e queria agradecer pelo post e vou conseguir ganhar um bom tempo com essa dica.

    Só uma duvida, você tem link do path para correção do VS, quando clico na página ele me direciona para site da microsoft?

    Obrigado e grande abraço,

  4. Olá Jeferson,

    Obrigado pelo contato. Fico feliz em ter, de alguma maneira, ajudado você. Quanto ao link, já efetuei a correção. A Microsoft mudou o caminho do patch de correção, mas agora você já pode baixá-lo.
    Um abraço e mantenha contato.

  5. Hudson disse:

    Muito bom o post! Era justamente o que eu estava precisando! Mal vejo a hora de chegar no laboratório pra continuar com minha pesquisa.
    Parabéns!

    • Olá Hudson,

      Fico feliz que o tutorial sobre OpenCV e C# tenha ajudado.

      Abraços,

      Rafael

      • Hudson disse:

        Olá, Rafael,

        Segui os passos, entretanto o teste de integração falhou. Quando eu rodo a aplicação ela não fica com o título passado para o CvNamedWindow, fica com o título Form1. Tem alguma coisa errada?

      • Hudson disse:

        Cara, eu tou com um problema sério…

        System.TypeInitializationException was unhandled
        Message=O inicializador de tipo de ‘Emgu.CV.CvInvoke’ acionou uma exceção.
        Source=Emgu.CV
        TypeName=Emgu.CV.CvInvoke
        StackTrace:
        em Emgu.CV.CvInvoke.cvNamedWindow(String name)
        em TestandoEmgu.Program.Main(String[] args) na C:\Users\EngBiomedica\Documents\Visual Studio 2010\Projects\TestandoEmgu\TestandoEmgu\Program.cs:linha 14
        em System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
        em Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
        em System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
        em System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
        em System.Threading.ThreadHelper.ThreadStart()
        InnerException: System.BadImageFormatException
        Message=Foi feita uma tentativa de se carregar um programa com um formato incorreto. (Exceção de HRESULT: 0x8007000B)
        Source=Emgu.CV
        StackTrace:
        em Emgu.CV.CvInvoke.cvRedirectError(CvErrorCallback errorHandler, IntPtr userdata, IntPtr prevUserdata)
        em Emgu.CV.CvInvoke..cctor()
        InnerException:

        Segui todos os passos. O próprio HelloWorld do EmguCV funciona, mas se eu criar um projeto dá esse erro. Já tentei de tudo. Incluo as bibliotecas, mas não funciona😛

  6. Bernardo Amaral disse:

    Olá, sabe me dizer se este projeto rodaria em linux, usando as bibliotecas mono?
    Abração e muito bom o seu artigo!

  7. Roger disse:

    Muito bom, parabéns pela iniciativa… sucesso!

  8. Mauricio Carvalho disse:

    O opencv deve ser extraido para C:\opencv ?
    eu importei as dll e fiz o procedimento descrito porém não está funcionando., só abre o form1 normalmente.

    Fiz um btn executar o comando CvInvoke.cvNamedWindow(“Test de Integração C# + OpenCV”);
    está lançando a exception em The type initializer for ‘Emgu.CV.CvInvoke’ threw an exception.

    Você sabe o que pode ser?
    Obrigado e parabéns pelo post.

  9. Ruan disse:

    Cara fiz tudo certinho mas não funcionou no 2010

  10. Michele disse:

    De grande ajuda esse post! Esclareceu muitas dúvidas que eu tinha! =]

  11. Hudson, tive o mesmo problema que você. Resolvi da seguinte maneira: copiei as dlls:
    opencv_calib3dXXX.dll
    opencv_contribXXX.dll
    opencv_coreXXX.dll
    opencv_features2dXXX.dll
    opencv_highguiXXX.dll
    opencv_imgprocXXX.dll
    opencv_legacyXXX.dll
    opencv_mlXXX.dll
    opencv_objectdetectXXX.dll
    opencv_videoXXX.dll

    para a pasta bin do build gerado do meu projeto, assim funcionou normalmente.

    Abs.

    Thiago Malheiros

  12. blogdotonyhenrique disse:

    Olá, fiz um pacote NuGet que já instala no projeto todas as DLLs,
    Ou seja, fica muito simples.

    Veja meu artigo
    http://www.codeproject.com/Tips/731934/Simple-EmguCV-OpenCV-on-Csharp

    O Pacote está em
    https://www.nuget.org/packages/myEmguCV.Net

  13. Ola, post muito bacana!
    Estou com alguns problemas por não conhecer a bilbioteca OPEN CV, estou diretamente trabalhando com a EMGU, logo não sei de muitos comandos desta. Iniciei meu projeto de TCC nesta área e estou tendo alguns problemas com lentidão no momento de obter a imagem e reconhecer rosto, por exemplo. Gostaria de saber se não tem alguma dica pra me dar, para que eu possa ter uma maior desempenho durante meu projeto, algum artigo sobre comandos da EMGU ou OPEN CV, como realemnte funciona essa integração, é só chamar um método que este método tem todas os comandos da OPEN CV?

    Obrigado!

  14. Ricardo Oliveira disse:

    Valeu cara, estou terminando o curso de sistemas de informação e isso me auxiliou muito na implementação do meu TCC, estou realizando um trabalho sobre reconhecimento automático de documentos para soluções GED, os filtros para as imagens serão muito necessários. Obrigado.

  15. Evandson Dantas disse:

    Parabéns pelo tutorial, são pessoas como você que enriquecem cada vez mais a internet.

  16. Johng219 disse:

    I appreciate you sharing this article.Thanks Again. Really Cool. ceffdckekdab

  17. daniel disse:

    muito bom

  18. Edilson Junior disse:

    Boa Tarde! Ja mexeu com OpenCVFOrUnity? estou com algumas duvidas.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s