從 OpenCV 2.4.4 開始,OpenCV 支持使用與 Android 開發(fā)幾乎相同的接口進(jìn)行桌面 Java 開發(fā)。
Clojure?是由 Java 虛擬機(jī)托管的一種現(xiàn)代 LISP 方言,它提供了與底層 JVM 的完全互操作性。這意味著我們甚至應(yīng)該能夠使用 Clojure REPL(Read Eval Print Loop)作為底層 OpenCV 引擎的交互式可編程接口。
我們將在本教程中執(zhí)行的操作
本教程將幫助您設(shè)置一個(gè)基本的 Clojure 環(huán)境,以便在完全可編程的 CLojure REPL 中以交互方式學(xué)習(xí) OpenCV。
教程源代碼
您可以在 OpenCV 存儲(chǔ)庫的文件夾中找到該示例的可運(yùn)行源代碼。按照教程中的說明安裝 OpenCV 和 Clojure 后,發(fā)出以下命令以從命令行運(yùn)行示例。samples/java/clojure/simple-sample
序言
有關(guān)安裝具有桌面 Java 支持的 OpenCV 的詳細(xì)說明,請參閱相應(yīng)的教程”。
如果您趕時(shí)間,以下是在 Mac OS X 上安裝 OpenCV 的最低快速入門指南:
注意
我假設(shè)您已經(jīng)安裝了?xcode、jdk?和?Cmake。
安裝 Leiningen
一旦你安裝了支持桌面java的OpenCV,唯一的其他要求就是安裝Leiningeng,它允許你管理CLJ項(xiàng)目的整個(gè)生命周期。
可用的安裝指南非常容易遵循:
- 下載腳本
- 把它放在你的$PATH上(如果它在你的路徑上,cf./bin 是一個(gè)不錯(cuò)的選擇。
- 將腳本設(shè)置為可執(zhí)行。(即 chmod 755/bin/lein)。
如果您在 Windows 上工作,請按照以下說明操作
現(xiàn)在,您已經(jīng)擁有了 OpenCV 庫和完全安裝的基本 Clojure 環(huán)境?,F(xiàn)在需要的是配置 Clojure 環(huán)境以與 OpenCV 庫進(jìn)行交互。
安裝 localrepo Leiningen 插件
Leiningen 原生支持的命令集(用 Leiningen 術(shù)語來說就是任務(wù))可以很容易地通過各種插件進(jìn)行擴(kuò)展。其中之一是?lein-localrepo?插件,它允許將任何 jar lib 作為工件安裝在機(jī)器的本地 maven 存儲(chǔ)庫中(通常在用戶名的 /.m2/repository 目錄中)。
我們將使用這個(gè) lein 插件將 Java 和 Clojure 使用 opencv 庫所需的 opencv 組件添加到本地 maven 存儲(chǔ)庫中。
一般來說,如果你只想在項(xiàng)目基礎(chǔ)上使用一個(gè)插件,可以直接添加到lein創(chuàng)建的CLJ項(xiàng)目中。
相反,當(dāng)您希望插件可用于用戶名空間中的任何 CLJ 項(xiàng)目時(shí),您可以將其添加到 /.lein/ 目錄中的 profiles.clj。
lein-localrepo 插件在其他 CLJ 項(xiàng)目中對我有用,在這些項(xiàng)目中,我需要調(diào)用由 Java 接口包裝的本機(jī)庫。因此,我決定將其提供給任何 CLJ 項(xiàng)目:
在 /.lein 目錄中創(chuàng)建名為 profiles.clj 的文件,并將以下內(nèi)容復(fù)制到其中:
在這里,我們說 lein-localrepo 插件的版本“0.5.2”將可用于 lein 創(chuàng)建的任何 CLJ 項(xiàng)目的 :user 配置文件。
您無需執(zhí)行任何其他操作即可安裝該插件,因?yàn)楫?dāng)您第一次發(fā)出任何 lein 任務(wù)時(shí),它將自動(dòng)從遠(yuǎn)程存儲(chǔ)庫下載。
將特定于 java 的庫安裝為本地存儲(chǔ)庫
如果您遵循了在計(jì)算機(jī)上安裝 OpenCV 的標(biāo)準(zhǔn)文檔,您應(yīng)該在構(gòu)建 OpenCV 的目錄下找到以下兩個(gè)庫:
- build/bin/opencv-247.jar java 庫
- build/lib/libopencv_java247.dylib 原生庫(或 .so 在你構(gòu)建的 OpenCV 一個(gè) GNU/Linux 操作系統(tǒng)中)
它們是 JVM 與 OpenCV 交互所需的唯一 opencv 庫。
拆解所需的 opencv 庫
創(chuàng)建一個(gè)新目錄以存儲(chǔ)在上述兩個(gè)庫中。首先將 opencv-247.jar 庫復(fù)制到其中。
第一個(gè)庫完成。
現(xiàn)在,為了能夠?qū)?libopencv_java247.dylib 共享的原生庫添加到本地 maven 存儲(chǔ)庫中,我們首先需要將其打包為 jar 文件。
必須將本機(jī)庫復(fù)制到模仿操作系統(tǒng)和體系結(jié)構(gòu)名稱的目錄布局中。我正在使用具有 X86 64 位架構(gòu)的 Mac OS X。所以我的布局如下:
將 libopencv_java247.dylib 庫復(fù)制到 x86_64 目錄中。
如果您從不同的操作系統(tǒng)/體系結(jié)構(gòu)對運(yùn)行 OpenCV,以下是您可以選擇的映射摘要。
將本機(jī) lib 打包為 jar
接下來,您需要使用 jar 命令從目錄創(chuàng)建新的 jar 文件,將本機(jī) lib 打包到 jar 文件中。
請注意,ehe M 選項(xiàng)指示 jar 命令不為工件創(chuàng)建 MANIFEST 文件。
目錄布局應(yīng)如下所示:
本地安裝 jar
現(xiàn)在,我們已準(zhǔn)備好借助 lein-localrepo 插件將這兩個(gè) jar 作為工件添加到本地 maven 存儲(chǔ)庫中。
在這里,localrepo 安裝任務(wù)創(chuàng)建了 2.4.7。從 opencv-247.jar 庫發(fā)布 OpenCV/OpenCV Maven 工件,然后將其安裝到本地 Maven 存儲(chǔ)庫中。然后,opencv/opencv 工件將可用于任何符合 maven 的項(xiàng)目(Leiningen 內(nèi)部基于 maven)。
對之前包裝在新 jar 文件中的本機(jī)庫執(zhí)行相同的操作。
請注意,這兩個(gè)工件的 groupId opencv 是相同的?,F(xiàn)在,我們已準(zhǔn)備好創(chuàng)建一個(gè)新的 CLJ 項(xiàng)目來開始與 OpenCV 進(jìn)行交互。
創(chuàng)建項(xiàng)目
使用終端中的 lein new 任務(wù)創(chuàng)建新的 CLJ 項(xiàng)目。
上述任務(wù)將創(chuàng)建以下簡單示例目錄布局:
我們需要添加兩個(gè) opencv 工件作為新創(chuàng)建項(xiàng)目的依賴項(xiàng)。打開 project.clj 并修改其 dependencies 部分,如下所示:
(defproject simple-sample “0.1.0-SNAPSHOT”description “FIXME: write description”url “http://example.com/FIXME”license {:name “Eclipse 公共許可證”url “http://www.eclipse.org/legal/epl-v10.html”}依賴項(xiàng) [[org.clojure/clojure “1.5.1”][opencv/opencv “2.4.7”] ;添加行[opencv/opencv-本機(jī) “2.4.7”]]);添加行
請注意,Clojure 編程語言也是一個(gè) jar 工件。這就是 Clojure 被稱為托管語言的原因。
要驗(yàn)證一切是否正常,請發(fā)出 lein deps 任務(wù)。第一次運(yùn)行 lein 任務(wù)時(shí),在執(zhí)行任務(wù)本身之前,需要一些時(shí)間來下載所有必需的依賴項(xiàng)。
deps 任務(wù)從 project.clj 和 /.lein/profiles.clj 文件中讀取和合并 simple-sample 項(xiàng)目的所有依賴項(xiàng),并驗(yàn)證它們是否已緩存在本地 maven 存儲(chǔ)庫中。如果任務(wù)返回時(shí)沒有關(guān)于無法檢索兩個(gè)新工件的消息,則您的安裝是正確的,否則請返回并仔細(xì)檢查您是否正確執(zhí)行了所有操作。
使用 OpenCV 進(jìn)行 REPLING
現(xiàn)在 cd 在 simple-sample 目錄中并發(fā)出以下 lein 任務(wù):
CD 簡單樣本
萊恩·雷普爾
..
nREPL 服務(wù)器在主機(jī) 127.0.0.1 上的端口 50907 上啟動(dòng)
REPL-y 0.3.0 版本
Clojure 1.5.1 版本
文檔:(doc function-name-here)
(find-doc “部分名稱在這里”)
源:(source function-name-here)
Javadoc:(javadoc java-object-or-class-here)
退出:Ctrl+D 或(退出)或(退出)
結(jié)果:存儲(chǔ)在變量 *1、*2、*3 中,異常存儲(chǔ)在 *e 中
用戶=>
您可以通過發(fā)出任何要計(jì)算的 CLJ 表達(dá)式來立即與 REPL 進(jìn)行交互。
用戶=> (+ 41 1)
42
user=> (println “你好,OpenCV!”)
你好,OpenCV!
零
user=> (defn foo [] (str “bar”))
#'用戶/foo
用戶=> (foo)
“酒吧”
當(dāng)從基于 lein 的項(xiàng)目的主目錄運(yùn)行時(shí),即使 lein repl 任務(wù)自動(dòng)加載所有項(xiàng)目依賴項(xiàng),您仍然需要加載 opencv 本機(jī)庫才能與 OpenCV 交互。
user=> (clojure.lang.RT/loadLibrary org.opencv.core.Core/NATIVE_LIBRARY_NAME)
零
然后,您可以通過引用其類的完全限定名稱來開始與 OpenCV 交互。
注意
在這里,您可以找到完整的 OpenCV Java API。
user=> (org.opencv.core.Point. 0 0)
#<點(diǎn) {0.0, 0.0}>
在這里,我們創(chuàng)建了一個(gè)二維的 opencv Point 實(shí)例。即使 OpenCV 的 java 接口中包含的所有 java 包都可以立即從 CLJ REPL 獲得,在 Point 前面加上前綴也是非常煩人的。具有完全限定包名稱的實(shí)例構(gòu)造函數(shù)。
幸運(yùn)的是,CLJ 提供了一種非常簡單的方法,通過直接導(dǎo)入 Point 類來克服這種煩惱。
user=> (import 'org.opencv.core.Point)
org.opencv.core.Point(組織.opencv.core.Point)
user=> (def p1 (點(diǎn) 0 0))
#'用戶/p1
用戶=> p1
#<點(diǎn) {0.0, 0.0}>
user=> (def p2 (點(diǎn) 100 100))
#'用戶/p2
我們甚至可以檢查實(shí)例的類,并驗(yàn)證符號(hào)的值是否是 Point java 類的實(shí)例。
user=>(類 P1)
org.opencv.core.Point(組織.opencv.core.Point)
user=> (instance? org.opencv.core.Point p1)
真
如果我們現(xiàn)在想使用 opencv Rect 類來創(chuàng)建一個(gè)矩形,我們再次必須完全限定它的構(gòu)造函數(shù),即使它留在 Point 類的同一個(gè) org.opencv.core 包中。
user=> (org.opencv.core.Rect. p1, p2)
#<矩形 {0, 0, 100x100}>
同樣,CLJ 導(dǎo)入工具非常方便,可讓您一次映射更多符號(hào)。
user=> (import '[org.opencv.core 點(diǎn)矩形大小])
org.opencv.core.Size
user=> (def r1 (Rect. p1 p2))
#'用戶/r1
用戶=> r1
#<矩形 {0, 0, 100x100}>
user=>(類 R1)
org.opencv.core.Rect
user=> (instance? org.opencv.core.Rect r1)
真
user=>(大?。?00、100)
#<尺寸 100x100>
user=> (def sq-100 (大小 100 100))
#'用戶/sq-100
user=>(SQ-100 類)
org.opencv.core.Size
user=> (instance? org.opencv.core.Size sq-100)
真
顯然,您也可以在實(shí)例上調(diào)用方法。
用戶=> (.area r1)
10000.0
用戶=> (.area sq-100)
10000.0
或者修改成員字段的值。
user=> (set!(.x p1) 10)
10
用戶=> p1
#<點(diǎn) {10.0, 0.0}>
user=> (set?。?寬度 sq-100) 10)
10
user=> (set?。?高度 sq-100) 10)
10
用戶=> (.area sq-100)
100.0
如果您發(fā)現(xiàn)自己不記得 OpenCV 類的行為,REPL 讓您有機(jī)會(huì)輕松搜索相應(yīng)的 javadoc 文檔:
user=> (javadoc 矩形)
“http://www.google.com/search?btnI=I%27m%20Feeling%20Lucky&q=allinurl:org/opencv/core/Rect.html”
在 REPL 中模擬 OpenCV Java 教程示例
現(xiàn)在讓我們嘗試將?OpenCV Java 教程示例移植到 Clojure。我們將在 REPL 上對其進(jìn)行評估,而不是將其寫入源文件中。
以下是引用示例的原始 Java 源代碼。
向項(xiàng)目添加注入
在開始編碼之前,我們希望消除在啟動(dòng)新的 REPL 以交互方式加載原生 opencv 庫時(shí)與之交互的無聊需求。
首先,通過在 REPL 提示符下計(jì)算 (exit) 表達(dá)式來停止 REPL。
然后打開 project.clj 文件并按如下方式進(jìn)行編輯:
在這里,我們說在運(yùn)行 REPL 時(shí)加載 opencv 本機(jī)庫,這樣我們就不必再記住手動(dòng)執(zhí)行。
重新運(yùn)行 lein repl 任務(wù)
導(dǎo)入感興趣的 OpenCV java 接口。
我們將幾乎逐字逐句地模仿原始的 OpenCV java 教程:
- 創(chuàng)建一個(gè) 5x10 矩陣,其所有元素都初始化為 0
- 將第二行的每個(gè)元素的值更改為 1
- 將第 6 列的每個(gè)元素的值更改為 5
- 打印得到的矩陣的內(nèi)容
user=> (def m (Mat. 5 10 CvType/CV_8UC1 (Scalar. 0 0)))#'用戶/m用戶=> (def mr1 (.row m 1))#'用戶/mr1user=> (.setTo mr1 (標(biāo)量 1 0))#<墊墊 [ 1*10*CV_8UC1, isCont=true, isSubmat=true, nativeObj=0x7fc9dac49880, dataAddr=0x7fc9d9c98d5a ]>用戶=> (def mc5 (.col m 5))#'用戶/mc5user=> (.setTo mc5 (標(biāo)量 5 0))#<Mat Mat [ 5*1*CV_8UC1, isCont=false, isSubmat=true, nativeObj=0x7fc9d9c995a0, dataAddr=0x7fc9d9c98d55 ]>用戶=> (println (.dump m))[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]
如果你習(xí)慣了一種功能語言,那么所有那些被濫用和變異的名詞都會(huì)激怒你對動(dòng)詞的偏好。即使 CLJ 互操作語法非常方便和完整,任何 OOP 語言和任何 FP 語言(即 Scala 是一種混合范式編程語言)之間仍然存在阻抗不匹配。
要退出 REPL,請?jiān)?REPL 提示符下鍵入 (exit)、ctr-D 或 (quit)。
以交互方式加載和模糊圖像
在下一個(gè)示例中,您將學(xué)習(xí)如何使用以下 OpenCV 方法以交互方式從 REPL 加載、模糊和圖像:
- Highgui 類中的 imread 靜態(tài)方法,用于從文件中讀取圖像
- Highgui 類中的 imwrite 靜態(tài)方法,用于將圖像寫入文件
- Imgproc 類中的 GaussianBlur 靜態(tài)方法,用于模糊原始圖像
我們還將使用 Mat 類,該類從 imread 方法返回并被接受為 GaussianBlur 和 imwrite 方法的主要參數(shù)。
將圖像添加到項(xiàng)目
首先,我們要將一個(gè)鏡像文件添加到新創(chuàng)建的目錄中,用于存儲(chǔ)項(xiàng)目的靜態(tài)資源。
閱讀圖片
現(xiàn)在像往常一樣啟動(dòng) REPL,然后從導(dǎo)入我們將要使用的所有 OpenCV 類開始:
萊恩·雷普爾nREPL 服務(wù)器在主機(jī) 127.0.0.1 上的端口 50624 上啟動(dòng)REPL-y 0.3.0 版本Clojure 1.5.1 版本文檔:(doc function-name-here)(find-doc “部分名稱在這里”)源:(source function-name-here)Javadoc:(javadoc java-object-or-class-here)退出:Ctrl+D 或(退出)或(退出)結(jié)果:存儲(chǔ)在變量 *1、*2、*3 中,異常存儲(chǔ)在 *e 中user=> (import '[org.opencv.core Mat Size CvType]'[org.opencv.imgcodecs imgcodecs]'[org.opencv.imgproc imgproc])org.opencv.imgproc.Imgproc現(xiàn)在從 resources/images/lena.png 文件中讀取圖像。
user=> (def lena (Highgui/imread “resources/images/lena.png”))#'用戶/莉娜用戶=> Lena#<墊墊 [ 512*512*CV_8UC3, isCont=true, isSubmat=false, nativeObj=0x7f9ab3054c40, dataAddr=0x19fea9010 ]>如您所見,通過簡單地計(jì)算 lena 符號(hào),我們知道 lena.png 是一個(gè) 512x512 的 CV_8UC3 元素類型的矩陣。讓我們創(chuàng)建一個(gè)具有相同尺寸和元素類型的新 Mat 實(shí)例。
user=> (def blurred (Mat. 512, 512 CvType/CV_8UC3))#'用戶/模糊用戶=>現(xiàn)在應(yīng)用 GaussianBlur 過濾器,使用 lena 作為源矩陣,blurred 作為目標(biāo)矩陣。
user=> (Imgproc/GaussianBlur lena blurred (Size. 5, 5), 3, 3)零最后一步,只需將模糊的矩陣保存在新的圖像文件中即可。
user=> (Highgui/imwrite “resources/images/blurred.png” blured)真user=>(退出)再見!
以下是莉娜的新模糊圖像。
后續(xù)步驟
本教程僅介紹在 CLJ REPL 中設(shè)置的非?;镜沫h(huán)境,以便能夠與 OpenCV 進(jìn)行交互。
我建議任何 Clojure 新手閱讀 Clojure Java?Interop 一章,以獲得與任何未包裝在 Clojure 中的純 Java 庫進(jìn)行互操作所需的所有知識(shí),以使其在 Clojure 中以更慣用和功能化的方式使用。
OpenCV Java API 不會(huì)根據(jù) Qt 封裝 highgui 模塊功能(例如 namedWindow 和 imshow.如果您想創(chuàng)建窗口并在從 REPL 與 OpenCV 交互時(shí)將圖像顯示在其中,那么目前您只能自己動(dòng)手。你可以使用 Java Swing 來填補(bǔ)這個(gè)空白。
???在線教程
- 麻省理工學(xué)院人工智能視頻教程?– 麻省理工人工智能課程
- 人工智能入門?– 人工智能基礎(chǔ)學(xué)習(xí)。Peter Norvig舉辦的課程
- EdX 人工智能?– 此課程講授人工智能計(jì)算機(jī)系統(tǒng)設(shè)計(jì)的基本概念和技術(shù)。
- 人工智能中的計(jì)劃?– 計(jì)劃是人工智能系統(tǒng)的基礎(chǔ)部分之一。在這個(gè)課程中,你將會(huì)學(xué)習(xí)到讓機(jī)器人執(zhí)行一系列動(dòng)作所需要的基本算法。
- 機(jī)器人人工智能?– 這個(gè)課程將會(huì)教授你實(shí)現(xiàn)人工智能的基本方法,包括:概率推算,計(jì)劃和搜索,本地化,跟蹤和控制,全部都是圍繞有關(guān)機(jī)器人設(shè)計(jì)。
- 機(jī)器學(xué)習(xí)?– 有指導(dǎo)和無指導(dǎo)情況下的基本機(jī)器學(xué)習(xí)算法
- 機(jī)器學(xué)習(xí)中的神經(jīng)網(wǎng)絡(luò)?– 智能神經(jīng)網(wǎng)絡(luò)上的算法和實(shí)踐經(jīng)驗(yàn)
- 斯坦福統(tǒng)計(jì)學(xué)習(xí)
有需要的小伙伴,可以點(diǎn)擊下方鏈接免費(fèi)領(lǐng)取或者V掃描下方二維碼免費(fèi)領(lǐng)取??
?
人工智能書籍
- OpenCV(中文版).(布拉德斯基等)
- OpenCV+3計(jì)算機(jī)視覺++Python語言實(shí)現(xiàn)+第二版
- OpenCV3編程入門 毛星云編著
- 數(shù)字圖像處理_第三版
- 人工智能:一種現(xiàn)代的方法
- 深度學(xué)習(xí)面試寶典
- 深度學(xué)習(xí)之PyTorch物體檢測實(shí)戰(zhàn)
- 吳恩達(dá)DeepLearning.ai中文版筆記
- 計(jì)算機(jī)視覺中的多視圖幾何
- PyTorch-官方推薦教程-英文版
- 《神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)》(邱錫鵬-20191121)
- …
第一階段:零基礎(chǔ)入門(3-6個(gè)月)
新手應(yīng)首先通過少而精的學(xué)習(xí),看到全景圖,建立大局觀。?通過完成小實(shí)驗(yàn),建立信心,才能避免“從入門到放棄”的尷尬。因此,第一階段只推薦4本最必要的書(而且這些書到了第二、三階段也能繼續(xù)用),入門以后,在后續(xù)學(xué)習(xí)中再“哪里不會(huì)補(bǔ)哪里”即可。
第二階段:基礎(chǔ)進(jìn)階(3-6個(gè)月)
熟讀《機(jī)器學(xué)習(xí)算法的數(shù)學(xué)解析與Python實(shí)現(xiàn)》并動(dòng)手實(shí)踐后,你已經(jīng)對機(jī)器學(xué)習(xí)有了基本的了解,不再是小白了。這時(shí)可以開始觸類旁通,學(xué)習(xí)熱門技術(shù),加強(qiáng)實(shí)踐水平。在深入學(xué)習(xí)的同時(shí),也可以探索自己感興趣的方向,為求職面試打好基礎(chǔ)。
第三階段:工作應(yīng)用
這一階段你已經(jīng)不再需要引導(dǎo),只需要一些推薦書目。如果你從入門時(shí)就確認(rèn)了未來的工作方向,可以在第二階段就提前閱讀相關(guān)入門書籍(對應(yīng)“商業(yè)落地五大方向”中的前兩本),然后再“哪里不會(huì)補(bǔ)哪里”。
?有需要的小伙伴,可以點(diǎn)擊下方鏈接免費(fèi)領(lǐng)取或者V掃描下方二維碼免費(fèi)領(lǐng)取??
?
文章來源:http://www.zghlxwxcb.cn/news/detail-793714.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-793714.html
到了這里,關(guān)于使用 Clojure 進(jìn)行 OpenCV 開發(fā)簡介的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!