MacOS - Java OpenCV Kurulumu

OpenCV, Intel Research tarafından 1999 yılında geliştirilmeye başlatılan bir görüntü işleme kütüphanesidir. C++ ile geliştirilen kütüphanenin 1.0 versiyonu 2006 yayınlanmıştır. 2.4.4 versiyonundan itibaren, Java bindingleri geliştirilmiş ve böylece java uygulamalarında kullanılmaya başlamıştır. Bünyesinde 2500’den fazla algoritma bulunan OpenCV, otonom araçlardan, dronelara kadar bir çok popüler alanda kullanılmaktadır.

Bu yazıda opencv3 kurulumu ve örnek bir java uygulaması geliştireceğiz. Öncelikle opencv3 kütüphanesinin sisteme kurulması gerekiyor. Kurulumu brew ile gerçekleştireceğiz. brew, MacOS sistemlerinde kullanılan bir package manager uygulamasıdır.

brew tap homebrew/science
brew install opencv3 --with-java --with-contrib

Bu yazının yazıldığı an itibariyle, OpenCV’nin 3.2 versiyonu yayında. Kütüphane /usr/local/Cellar/opencv3/3.2.0 klasörüne yüklenmiş olması lazım.

Repository

Ardından yeni bir maven projesi oluşturup, aşağıdaki repository tanımını pom.xml’e ekliyoruz. Native dependency’ler maven repository’de bulunmadığı için kendi repository’mizi kullanıyoruz:

<repositories>
   <repository>
      <id>kodfarki</id>
      <url>https://raw.githubusercontent.com/kodfarki/repository/master/</url>
   </repository>
</repositories>

Dependencies

Aşağıdaki dependency tanımlarını pom.xml’e ekliyoruz. Listedeki opencv bağımlılıkları, eklemiş olduğumuz repository’den indirilecek:

<dependencies>
   <dependency>
      <groupId>opencv</groupId>
      <artifactId>opencv</artifactId>
      <version>3.2.0</version>
   </dependency>

   <dependency>
      <groupId>opencv</groupId>
      <artifactId>opencvjava-runtime</artifactId>
      <classifier>natives-osx</classifier>
      <version>3.2.0</version>
   </dependency>

   <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
   </dependency>
</dependencies>

Plugins

Ardından aşağıdaki plugin tanımlarını pom.xml’e ekliyoruz.
maven-nativedependencies-plugin adlı plugin, native bağımlılıkları target/natives altına kopyalıyor.
maven-surefire-plugin adlı plugin ise, yazacağımız testi çalıştırırken “-Djava.library.path=target/natives” parametresini java komutuna ekleyecek.

<build>
   <plugins>
      <plugin>
         <groupId>com.googlecode.mavennatives</groupId>
         <artifactId>maven-nativedependencies-plugin</artifactId>
         <version>0.0.7</version>
         <executions>
            <execution>
               <id>unpacknatives</id>
               <phase>generate-resources</phase>
               <goals>
                  <goal>copy</goal>
               </goals>
            </execution>
         </executions>
      </plugin>

      <plugin>
         <artifactId>maven-surefire-plugin</artifactId>
         <version>2.19.1</version>
         <configuration>
            <argLine>-Djava.library.path=target/natives</argLine>
         </configuration>
      </plugin>
   </plugins>
</build>

Örnek Kod

Aşağıdaki kod 5 satırlı 10 kolonlu bir matris üretip, ekrana basmaktadır:

public class App {
   static { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }

   public static void main(String[] args) {
      System.out.println("Welcome to OpenCV " + Core.VERSION);
      Mat m = new Mat(5, 10, CvType.CV_8UC1, new Scalar(0));
      System.out.println("OpenCV Mat: " + m);

      Mat mr1 = m.row(1);
      mr1.setTo(new Scalar(1));

      Mat mc5 = m.col(5);
      mc5.setTo(new Scalar(5));

      System.out.println("OpenCV Mat data:\n" + m.dump());
   }
}

Kodu pratik bir şekilde koşturmak için aşağıdaki junit testini kullanacağız:

public class AppTest {
    @Test
    public void testApp() {
        App.main(null);
    }
}

Kodu mvn test komutuyla koşturabilirsiniz:

Halils-MacBook-Pro:opencv-example halil$ mvn test
...
[INFO] --- maven-surefire-plugin:2.19.1:test (default-test) @ my-opencv-app ---

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.mycompany.app.AppTest
Welcome to OpenCV 3.2.0
OpenCV Mat: Mat [ 5*10*CV_8UC1, isCont=true, isSubmat=false, nativeObj=0x7fe6eb630f00, dataAddr=0x7fe6eb43e1c0 ]
OpenCV Mat data:
[  0,   0,   0,   0,   0,   5,   0,   0,   0,   0;
   1,   1,   1,   1,   1,   5,   1,   1,   1,   1;
   0,   0,   0,   0,   0,   5,   0,   0,   0,   0;
   0,   0,   0,   0,   0,   5,   0,   0,   0,   0;
   0,   0,   0,   0,   0,   5,   0,   0,   0,   0]
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.082 sec - in com.mycompany.app.AppTest

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.152 s
[INFO] Finished at: 2017-06-08T15:46:00+03:00
[INFO] Final Memory: 18M/302M
[INFO] ------------------------------------------------------------------------

Eğer matrisin içeriğini görüntüleyebildiyseniz, OpenCV kurulumunu tamamlamış ve sisteminizi OpenCV uygulaması geliştirebilir hale getirmişsiniz demektir.

Github

Kodu https://github.com/kodfarki/opencv-example adresinden klonlayabilirsiniz.

Versiyon Güncelleme

Bağımlılıkları yeni bir OpenCV versiyonu için üretmek isterseniz aşağıdaki komutları kullanarak bağımlılıkları lokal repository’ye ekleyebilirsiniz.

cd /usr/local/Cellar/opencv3/3.2.0/share/OpenCV/java/
mvn install:install-file -Dfile=opencv-320.jar -DgroupId=opencv -DartifactId=opencvjar -Dversion=3.2.0 -Dpackaging=jar
mvn install:install-file -Dfile=opencv_java320.jar -DgroupId=opencv -DartifactId=opencvjava-runtime -Dversion=3.2.0 -Dpackaging=jar -Dclassifier=natives-osx