前言:在網上看到好多的OpenCV的教程都是基於C和C++的,並且通常都是OpenCV2.4版本的,而在OpenCV3版本中不少API變了,致使之前的程序不能複用,做爲一個Java程序員表示深深的不服,遂研究了一番,寫文以記之。java
使用Java開發程序,固然必不可少的天然是JDK了,關於JDK的安裝和環境變量的配置在此再也不囉嗦,相信你本地也早已安裝好了,本文使用的是JDK1.八、Windows64位開發環境,其餘環境暫時沒有測試,但理論上應該都是可行的。git
其次是編輯器的選擇,在此仍是推薦一下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這個目錄文件是咱們須要的,其餘的暫時都不須要了。github
到此爲止咱們差很少就能夠開始第一個Java版本的Opencv程序了。第一個程序咱們將讀取一張圖片,OpenCV的logo以下圖,而後將圖片的信息使用Mat的格式打印出來。小程序
運行結果截圖:windows
首先咱們創建一個maven工程,Java開發的應該都知道maven吧,由於該項目都是基於maven和git(後面會提到)來管理的。啓動Idea,選擇"Create New Project",在彈出的界面左側邊欄選擇"maven",若是你已經使用Idea測試過"Hello World"程序,那麼JDK應該已經設置好了,若是沒有,你須要在右邊欄上"Project SDK"選擇你在本地安裝的JDK。界面如圖:app
接着點擊"Next"下一步操做,設置maven項目的GroupId和ArtifactId,這裏我填的是"GroupId:com.superbool","ArtifactId:easy_opencv",而後點擊"Next"設置項目的名稱和保存的位置,「Project name:easy_opecv","Project location:D:\github\easy_opencv",而後點擊"Finish"就完成了maven項目的建立,之後的代碼都是寫在該項目中的,就不用再新建工程了。固然,這裏的命名和保存的路徑等均可以本身修改的。maven
在開始第一個程序以前還得建立幾個目錄,咱們在easy_opencv項目的父目錄下建立一個opencv目錄,而後將以前解壓的OpenCV中的build_>java目錄下的內容拷貝過來。而後在src->main->java目錄下建立咱們第一個類FirstOpenCV.java。編輯器
建立好的maven工程以下圖所示(也能夠手動建立這些目錄,關於每一個目錄的做用,在下一篇會作詳細解釋):ide
若是以爲上面的步驟太繁瑣,那麼你能夠直接在github上clone個人代碼 easy_opencv,而後切換到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 8 public static void main(String[] args) { 9 Mat mat = Imgcodecs.imread("C:/opencv.png"); 10 System.out.println(mat); 11 } 12 }
等等,"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 10 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各個目錄的做用。