1. 程式人生 > >使用Java開發OpenCV程式-1.開發環境安裝與配置

使用Java開發OpenCV程式-1.開發環境安裝與配置

前言:在網上看到好多的OpenCV的教程都是基於C和C++的,作為一個Java程式設計師表示深深的不服,遂研究了一番,寫文以記之。

一、下載和安裝所需的開發環境

使用Java開發程式,當然必不可少的自然是JDK了,關於JDK的安裝和環境變數的配置在此不再囉嗦,相信你本地也早已安裝好了,本文使用的是JDK1.8、Windows64位開發環境,其他環境暫時沒有測試,但理論上應該都是可行的。

其次是編輯器的選擇,在此還是推薦一下Idea,如果你是Java程式設計師,一定聽說過,如果你是安卓開發者,那你更應該聽說,Android Studio就是基於Idea的社群版開發的。扯遠了,我這裡用的是Idea的最新版 Idea 2016.1 下載

IntelliJ IDEA 2016。全平臺支援,不管你是Windows還是Mac或者Linux。安裝過程也更普通的軟體沒什麼差別。安裝好之後建議寫個”Hello World"小程式測試一下,如果不成功建議到網上搜索一下安裝過程。

下面到最重要的OpenCV登場了。目前OpenCV的最新版本是3.1.0,所以後面都是基於OpenCV3.1.0的。使用Java開發程式不像Visual Studio那麼複雜的環境配置,因為Java是直接呼叫OpenCV的jar包中的方法。到OpenCV主頁下載相應平臺的壓縮包(雖然是.exe,聰明的你肯定會發現就是個壓縮包)。下載完成後解壓,我們找到這樣一個目錄:opencv->build->java 注意java這個目錄檔案是我們需要的,其他的暫時都不需要了。

二、第一個Java版的OpenCV程式

到此為止我們差不多就可以開始第一個Java版本的Opencv程式了。第一個程式我們將讀取一張圖片,OpenCV的logo如下圖,然後將圖片的資訊使用Mat的格式打印出來。

                                                                                                                               

執行結果截圖:

首先我們建立一個maven工程,Java開發的應該都知道maven吧,因為該專案都是基於maven和git(後面會提到)來管理的。啟動Idea,選擇"Create New Project",在彈出的介面左側邊欄選擇"maven",如果你已經使用Idea測試過"Hello World"程式,那麼JDK應該已經設定好了,如果沒有,你需要在右邊欄上"Project SDK"選擇你在本地安裝的JDK。介面如圖:

接著點選"Next"下一步操作,設定maven專案的GroupId和ArtifactId,這裡我填的是"GroupId:com.superbool","ArtifactId:easy_opencv",然後點選"Next"設定專案的名稱和儲存的位置,“Project name:easy_opecv","Project location:D:\github\easy_opencv",然後點選"Finish"就完成了maven專案的建立,以後的程式碼都是寫在該專案中的,就不用再新建工程了。當然,這裡的命名和儲存的路徑等都可以自己修改的。

在開始第一個程式之前還得建立幾個目錄,我們在easy_opencv專案的父目錄下建立一個opencv目錄,然後將之前解壓的OpenCV中的build_>java目錄下的內容拷貝過來。然後在src->main->java目錄下建立我們第一個類FirstOpenCV.java。

建立好的maven工程如下圖所示(也可以手動建立這些目錄,關於每個目錄的作用,在下一篇會做詳細解釋):

  

如果覺得上面的步驟太繁瑣,那麼你可以直接在github上clone我的程式碼,然後切換到day1分支上。

終於要開始寫程式碼了,第一個基於Java的OpenCV的程式碼:

  1. public class FirstOpenCV {

  2. static {

  3. System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

  4. //注意程式執行的時候需要在VM option新增該行 指明opencv的dll檔案所在路徑

  5. //-Djava.library.path=$PROJECT_DIR$\opencv\x64

  6. }

  7. public static void main(String[] args) {

  8. Mat mat = Imgcodecs.imread("C:/opencv.png");

  9. System.out.println(mat);

  10. }

  11. }

等等,"Core.NATIVE_LIBRARY_NAME"以及"Imgcodecs.imread()"方法都標紅了,原來是opencv的jar包還沒引用進來,所以還得一步操作,導OpenCV的jar包,點選下圖的左上角紅框標識的圖示,彈出"Project Structure"選項介面,依次選擇"Modules"->"Dependencies"->"+"->"1 JARs or Dependencies..."選中剛opencv目錄下的"opencv-310.jar",再看程式碼是不是飄紅的線都不見了呢。

然後使用Ctr+Shift+F10快捷鍵執行第一個main方法,啊哦,程式丟擲了一個異常:

  1. Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java310 in java.library.path

  2. at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1864)

  3. at java.lang.Runtime.loadLibrary0(Runtime.java:870)

  4. at java.lang.System.loadLibrary(System.java:1122)

  5. at com.superbool.FirstOpenCV.<clinit>(FirstOpenCV.java:12)

  6. at java.lang.Class.forName0(Native Method)

  7. at java.lang.Class.forName(Class.java:264)

  8. at com.intellij.rt.execution.application.AppMain.main(AppMain.java:122)

  9. Process finished with exit code 1

由於程式Java程式是呼叫的本地OpenCV的動態連結庫的,所以在這裡執行的時候JVM找不到.dll檔案的位置,自然就報錯了,解決辦法也很簡單,點選如圖中的方框"FirstOpenCV"->"Edit Configurations" 彈出如下的介面,在"VM options"一欄中新增"-Djava.library.path=$PROJECT_DIRS$\opencv\x64",如果是32位系統請填"\x32"。

再使用Ctr+Shift+F10快捷鍵執行程式,是不是結果終於出來了呢,這裡只打印了讀取的mat影象的基本資訊。

不過由於OpenCV官方的jar包還沒提供像C++一樣的highgui介面,所以暫時還無法將Mat圖片顯示在介面上,之,不過在下一節我們將會自己寫一個方法來顯示這個mat影象,同時解釋一下maven各個目錄的作用。