16 de jun. de 2010

OpenCV + Processing, rodando no NetBeans

A biblioteca http://ubaa.net/shared/processing/opencv permite utilizar o OpenCV juntamente com o Processing. Embora não implemente todos os recursos do OpenCV, a grande vantagem desta biblioteca é utilizar o Processing. Um dos problemas que ocorrem, em especial no MacOSX SnowLeopard é quando se utiliza o Processing e o OpenCV no NetBeans. Neste post, apresentamos a solução.

Considere o código exemplo para o OpenCV + Processing:

import processing.core.*;
import hypermedia.video.OpenCV;



public class OpenCV_PApplet extends PApplet {


         OpenCV cv = null;  // OpenCV object

         // Initialise Objects
    @Override
         public void setup() {

             size( 640, 480 );              // set frame size
             cv = new OpenCV( this );       // link OpenCV process to this PApplet
             cv.capture( width, height );   // start video stream
         }

         // Display the input camera stream in frame
    @Override
         public void draw() {
             cv.read();
             image( cv.image(), 0, 0 );
         }

         // Call the PApplet main method
         public static void main( String[] args ) {
             PApplet.main( new String[]{"OpenCV_PApplet"} );
         }
     }


Supondo que as bibliocas core.jar e OpenCV.jar estejam devidamente ligadas ao projeto do NetBeans, ao tentar compilar deve surgir a seguinte mensagem de erro:

!!! required library not found : no OpenCV in java.library.path
Verify that the java.library.path property is correctly set and the opencv.framework exists in '/Library/Frameworks' folder

Exception in thread "Animation Thread" java.lang.UnsatisfiedLinkError: hypermedia.video.OpenCV.capture(III)V
        at hypermedia.video.OpenCV.capture(Native Method)
        at hypermedia.video.OpenCV.capture(OpenCV.java:945)
        at OpenCV_PApplet.setup(OpenCV_PApplet.java:17)
        at processing.core.PApplet.handleDraw(PApplet.java:1571)
        at processing.core.PApplet.run(PApplet.java:1496)
        at java.lang.Thread.run(Thread.java:637)

Mesmo o OpenCV instalado corretamente e o mesmo código executando corretamente no Processing isto ocorre. Duas são as razões: (a) falta da biblioteca libOpenCV.jnilib e (b) Esta versão do OpenCV não funciona em 64bits e necessita da JVM rodando em 32bits.

Vamos a solução dos problemas:

a) A biblioteca libOpenCV.jnilib deve ser acessada pelo programa Java. Para tanto temos duas opções, colocar a biblioteca na mesma pasta do programa compilado, ou ainda copiá-la para a pasta biblioteca de extensão do JVM. A segunda opção é bem interessante, pois permite compartilhar a biblioteca com vários programas. A pasta está localizada em /Library/Java/Extensions.

b) Para configurar a JVM para executar em 32bits, usar a diretiva -d32. No shell isto pode ser feito usando java -d32 meuprograma e para rodar diretamente do Netbeans, acesse as propriedades do projeto e selecione Run, no campo VM options, coloque -d32.

Pronto, agora o programa deverá compilar e executar corretamente.

Nenhum comentário:

Postar um comentário