㈠ Opencv 圖像識別android實戰(識別撲克牌 4.圖像識別掃盲)
我想來看這篇文章的人大多對機器學習都有一定的了解,我覺得沒有必要非常學術話的解讀這個意義。人的學習目的不就是為了認識更多的事物么,機器學習也是一樣,就是讓計算機通過學習類比來認識更多的事物。
在這里我們是讓計算機認識圖像,要讓計算機認識事物,首先得教他,他學會了自然就認識了,所以我們准備了很多樣本來告訴計算機什麼是方塊,什麼是梅花等等,當樣本足夠多的時候,計算機通過類比自然就能區別它所看到的事物了。
機器學習演算法有很多種,比如KNN,K-means,決策樹,SVM,貝葉斯等,我們通過提取樣本和目標的特徵數據,再應用這些分類演算法達到事物分類的目的,這樣就簡單的完成了一個機器學習的過程。當然機器學習不光用來分類,還有用來完成更多,更復雜的事情,目前圖像識別領域的機器學習,千變萬化的應用其實還是用來分類。所以圖像分類還是圖像識別的最基本,最重要的工作之一。
在任何情況對任何事物分類都需要有分類目標,比如一株植物是什麼科,那麼分類目標是這個植物,樣本自然就是我們已經定義好的各種植物以及植物類別。一個人是誰,我們可以用ta的面部特徵來分類,人臉就是一個需要分類的目標。同樣圖像分類我么首先要找到分類的目標,比如我們需要知道某張圖裡面是否有蘋果,通常情況下我們需要把可能存在蘋果的地方扣下來和蘋果圖片作為對比,通過對比當匹配度達到一定程度時我們就認為被扣下來圖片區域就是蘋果,這樣的處理過程通常來講叫做圖像分割,是圖像識別中不可或缺的過程,圖像分割的效果直接影響圖像識別的最終效果。為了解決這個過程,人們提出了很多演算法來解決這個問題,在我看來圖像分割任然是一個需要不斷改進技術。碰巧在這個開源項目中用到的圖像分割很簡單,不需要知道太多其中的原理,也可以很好的完成這個任務。
當前圖像識別領域有兩類主要的圖像識別手段;單步法和基於候選區識別。單步法比如yolo演算法,他直接把未知圖片傳入到神經網路,不用查找候選區就可以識別目標物體。基於候選區方法則多一個過程,第一首先找到可能存在某個物體的候選區,第二步把這些候選區和已知的樣本比對,如果匹配達到一定的程度就認為識別到某個物體。
基於候選區的演算法優缺點如下:
更少的樣本,更高效的運行速度,更容易理解的演算法,更廉價的設備,但是有些情況無法用單步法解決或者效果非常差,本開源項目就是用的基於候選區方式來解決問題。
單步法優缺點:
更多的樣本,單步法更多的使用神經網路,對設備性能要求高,能解決更加復雜的問題。
㈡ 如何在Android項目中導入OpenCV庫
在Android中使用OpenCV方法為:
a、OpenCV安裝路徑"F:\OpenCV-2.3.1-android-bin"下有兩個文件夾。將文件夾"OpenCV-2.3.1"拷貝到Eclipse工作空間所在的目錄,也就是在你的項目的上一級目錄中,然後導入到工作空間中,在Package Explorer中選擇項目,單機右鍵在彈出菜單中選擇Properties,然後在彈出的Properties窗口中左側選擇Android,然後點擊右下方的Add按鈕,選擇OpenCV-2.3.1並點擊OK,。
b、此時,展開項目樹,可以看到新加了一個OpenCV-2.3.1_src目錄,如下圖,那麼就是正確添加了OpenCV java API,否則就是放置OpenCV-2.3.1的目錄路徑不正確。
c、然後就可以在Java源文件中導入OpenCV的API包,並且使用OpenCV API了,OpenCV API的包的形式如下:
Org.opencv.(OpenCV模塊名).(OpenCV類名)
例如:
Org.opencv.core.Mat
㈢ 為什麼Android Studio不能導入OpenCV的SDK
AS 只能導入Eclipse 或AS 的mole。
剛好我這里也有一份openCV的SDK,可以看到OpenCv/sdk 這個目錄有一個build.gradle,看起來是AS 的mole目錄,但是仔細看看,你會發現,並不是。as 的目錄,在 build.gradle平級裡面應該有 src/main/java(res),所以這並不是AS的,那麼是不是Eclipse的?年代太久遠的了,記不清了。
我的做法:
新建Mole
復制opencv/sdk/java/src、res、AndroidManifest.xml 到mole
復制 build.gradle 按需要修改部分內容
㈣ Android NDK交叉編譯openCV
注意android-ndk-r16b-linux-x86_64.zip編譯測試程序時候會link出錯,配局仿建議用r18b
build下就生成培纖我們需要的OpenCV sdk。
編譯完成
用如下CMakeLists.txt編臘簡譯運行程序