任志敏
(常州紡織服裝職業(yè)技術(shù)學(xué)院機(jī)電學(xué)院,江蘇 常州 213164)
隨著無(wú)人駕駛、人工智能及5G技術(shù)的飛速發(fā)展,越來(lái)越多的智能新技術(shù)應(yīng)用產(chǎn)品深入尋常百姓家。不管是哪一種產(chǎn)品,少不了Android系統(tǒng)的身影。作為智能化產(chǎn)品的標(biāo)志之一,類人的視覺(jué)系統(tǒng)是必不可少的,其中對(duì)顏色和形狀的識(shí)別又是最基本的。因此,本文將著重解決android平臺(tái)下顏色和形狀識(shí)別的問(wèn)題。
關(guān)于顏色及形狀的識(shí)別在PC機(jī)平臺(tái)下已經(jīng)比較成熟,但是在Android平臺(tái)下受制于軟硬件系統(tǒng)的局限性,該技術(shù)有待進(jìn)一步研究。
Android系統(tǒng)的內(nèi)核是由C/C++設(shè)計(jì)的Linux系統(tǒng),其上層支持Java和Kotlin編程語(yǔ)言,目前國(guó)內(nèi)主流使用的仍舊是Java。第一種方案是直接在Android平臺(tái)上使用Java語(yǔ)言實(shí)現(xiàn)顏色和形狀識(shí)別算法,但是比起C/C++語(yǔ)言,使用Java語(yǔ)言進(jìn)行圖像處理的效率沒(méi)那么高,因此,直接使用Java語(yǔ)言進(jìn)行圖像處理不是最佳的選擇。第二種方案是采用已有的成熟的圖像處理庫(kù),在Android平臺(tái)下調(diào)用庫(kù)實(shí)現(xiàn)顏色和形狀識(shí)別?,F(xiàn)有的主流圖像處理庫(kù)有OpenCv,CxImage,F(xiàn)reeImage,AForge等。
OpenCV的全稱是Open Source Computer Vision Library,是一個(gè)基于BSD許可(開(kāi)源)發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺(jué)庫(kù),又名“開(kāi)源計(jì)算機(jī)視覺(jué)庫(kù)”。OpenCV可運(yùn)行在Windows、Android、Maemo、FreeBSD、OpenBSD、iOS、Linux和Mac OS等平臺(tái)。OpenCV提供了各種圖像處理算法,用戶通過(guò)組合算法實(shí)現(xiàn)需要的功能。
CxImage類庫(kù)是一個(gè)優(yōu)秀的圖像操作類庫(kù)。它可以快捷地存取、顯示、轉(zhuǎn)換各種圖像。對(duì)Windows、MFC支持極好,支持圖像的多種操作(線性濾波、中值濾波、直方圖操作、旋轉(zhuǎn)縮放、區(qū)域選取、閾值處理、膨脹腐蝕、alpha混合等)。
FreeImage也是一個(gè)開(kāi)放源碼庫(kù)項(xiàng)目,為開(kāi)發(fā)人員提供支持當(dāng)今多媒體應(yīng)用程序所需的流行圖形圖像格式,如PNG、BMP、JPEG、TIFF等。FreeImage易于使用,速度快,多線程安全,兼容所有32位或64位版本的Windows,也支持Linux和Mac OS X。
AForge.NET是一個(gè)專門為開(kāi)發(fā)者和研究者基于C#框架設(shè)計(jì)的,該框架提供了不同的類庫(kù)和關(guān)于類庫(kù)的資源,還有很多應(yīng)用程序例子,包括計(jì)算機(jī)視覺(jué)與人工智能,圖像處理,神經(jīng)網(wǎng)絡(luò),遺傳算法,機(jī)器學(xué)習(xí),機(jī)器人等領(lǐng)域。
綜合比較,OpenCV因其優(yōu)秀的跨平臺(tái)性,已經(jīng)是目前PC平臺(tái)下最主流的圖像處理庫(kù),并已經(jīng)通過(guò)了大量工程應(yīng)用的考驗(yàn),因此,本文選擇OpenCV為顏色形狀識(shí)別的支持庫(kù)。OpenCV提供了基于Android平臺(tái)的SDK,支持3種方式接入Android。
第一種方式適用于對(duì)OpenCVc++不熟悉的用戶,不需要直接調(diào)用C++方案,因?yàn)楣俜教峁┑腟DK已經(jīng)用JNI全部封裝好了。用戶只需要安裝好JDK、AndroidStudio與NDK環(huán)境。
第二種方式是使用OpenCVSDK提供的C++頭文件、.so動(dòng)態(tài)庫(kù)和.a靜態(tài)庫(kù),用戶自己封裝JNI,該方式使用的效率會(huì)比第一種方法高一些,且可以100%使用OpenCV的接口[1]。
第三種方式通過(guò)OpenCV的源碼,重新編譯成Android SDK庫(kù),這樣的好處是能獲取到OpenCV最新的功能,缺點(diǎn)是編譯較為復(fù)雜,且新的代碼或許會(huì)存在不兼容與錯(cuò)誤。
綜合比較以上三種方式的優(yōu)缺點(diǎn),本文使用第二種方式,通過(guò)JNI調(diào)用OpenCV提供的API,使用C++語(yǔ)言操作OpenCV的接口。
為了驗(yàn)證顏色形狀識(shí)別的可行性與可靠性,本文設(shè)定的識(shí)別目標(biāo)為4種顏色(紅色、綠色、黃色和藍(lán)色),5種形狀(長(zhǎng)方形、正方形、三角形、多邊形和圓)。如圖1所示。
圖1 顏色形狀識(shí)別樣圖
第一步建立Androidstudio平臺(tái)下OpenCv的JNI開(kāi)發(fā)環(huán)境[2]。本文使用的版本是Android Studio3.2和OpenCv3.4.2-android-sdk。如圖2所示。
第二步:設(shè)計(jì)APP(Java語(yǔ)言)。如圖3所示。
一共設(shè)計(jì)了4個(gè)控件,包括2個(gè)Button,1個(gè)ImageView,1個(gè)TextView?!斑x擇…”按鈕用于打開(kāi)Android系統(tǒng)的圖片目錄,選擇需要識(shí)別的圖片。ImageView用于顯示選擇的待識(shí)別圖片。“形狀顏色識(shí)別”按鈕用于執(zhí)行具體的識(shí)別程序。APP底部的TextView控件用于顯示識(shí)別的結(jié)果。
圖2 android studio及opencv開(kāi)發(fā)環(huán)境
圖3 顏色形狀識(shí)別APP布局文件
因?yàn)橐x取Android的系統(tǒng)圖片目錄,需要首先在AndroidManifest.xml文件中設(shè)置允許讀外部存儲(chǔ)器權(quán)限。即:
若使用的androidSDK是23及以上版本,還需要在程序中設(shè)置運(yùn)行時(shí)允許讀權(quán)限。
因?yàn)榇蜷_(kāi)Android系統(tǒng)圖片目錄是一個(gè)新的Activity,該Activity需要向MainActivity回傳圖片路徑信息,因此使用startActivityForResult(Intent intent, int requestCode)方法打開(kāi)新的Activity,并把圖片文件回傳給MainActivity中的變量fileUri。設(shè)計(jì)顏色形狀識(shí)別函數(shù)
private void colorShapeDector() {
Mat image = Imgcodecs.imread(fileUri.getPath());
if(image.empty()) {
return;
}
strResult = DetectShapeColor(image.getNativeObjAddr());
tvResult.setText(strResult);
調(diào)用imread獲取待識(shí)別圖片的數(shù)據(jù)元素。通過(guò)image.getNativeObjAddr()方法把Java端獲得的路徑轉(zhuǎn)換為OpenCV端可識(shí)別的路徑。
第三步:設(shè)計(jì)顏色形狀識(shí)別程序(C++語(yǔ)言)
在native-lib.cpp聲明識(shí)別函數(shù)名稱、參數(shù)和返回值。
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_sidneyren_firstdemo_MainActivity_DetectShapeColor(
JNIEnv *env,
jobject /* this */,
jlong addrInputRgbaImage
)
S1:為了增強(qiáng)識(shí)別的魯棒性,轉(zhuǎn)換圖片的顏色空間,由RGB轉(zhuǎn)換為HSV。cvtColor(img,imgHSV,COLOR_BGR2HSV);其中img為原始圖像,imgHSV為轉(zhuǎn)換后的圖像。
S2:設(shè)置待識(shí)別顏色的HSV三個(gè)分量的上下限閾值,以綠色為例,greenLowH=35,greenHighH=77,greenLowS=43,greenHighS=255,greenLowV=46,greenHighV=255。調(diào)用inRange(imgHSV,Scalar(greenLowH,greenLowS,greenLowV),Scalar(greenHighH,greenHighS,greenHighV),imgThresholded)函數(shù)對(duì)imgHSV圖像進(jìn)行分割,位于綠色HSV上下限區(qū)間內(nèi)的像素點(diǎn)設(shè)置為255,不在該范圍內(nèi)的像素點(diǎn)設(shè)置為0,即生成一個(gè)二值化圖像[3],分割后生成的圖像imgThresholded如圖4所示。
圖4 分割后的圖像
S3:調(diào)用形態(tài)學(xué)操作函數(shù):element=getStructuringElement(MORPH_RECT, Size(5,5));對(duì)圖像進(jìn)行腐蝕和膨脹。調(diào)用函數(shù)morphologyEx對(duì)圖像進(jìn)行開(kāi)閉操作,并提取輪廓,處理后的圖像如圖5所示。
圖5 腐蝕、膨脹后的圖像
S4:設(shè)計(jì)形狀識(shí)別的類ShapeDetector。
調(diào)用arcLength函數(shù)計(jì)算封閉輪廓的周長(zhǎng)。調(diào)用approxPolyDP函數(shù)對(duì)圖像輪廓點(diǎn)進(jìn)行多邊形擬合,從而獲得輸出的多邊形點(diǎn)集,通過(guò)判斷多邊形點(diǎn)集的數(shù)量判斷具體是哪種形狀。
S5:遍歷圖像中所有輪廓,調(diào)用形狀識(shí)別類,即可識(shí)別具體某一種顏色塊的所有形狀。
S6:設(shè)置紅色、黃色和藍(lán)色的HSV上下限閾值,重復(fù)步驟S3~S5即可識(shí)別4種顏色塊的形狀。
本文一共使用100張各種形狀的圖片來(lái)驗(yàn)證APP的識(shí)別準(zhǔn)確率,圖片分成形狀和顏色不連接的部分和連接的部分,結(jié)果形狀和顏色均不連接的圖片識(shí)別準(zhǔn)確率為100%,形狀和顏色連接的圖片有一張未能準(zhǔn)確識(shí)別,總體識(shí)別準(zhǔn)確率為99%。