国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

OpenCV在Android上的應(yīng)用示例

瀏覽:4日期:2022-09-24 14:28:01

一. OpenCV 介紹

OpenCV是一個(gè)基于BSD許可(開源)發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺庫(kù),可以運(yùn)行在Linux、Windows、Android和Mac OS操作系統(tǒng)上。它輕量級(jí)而且高效——由一系列 C 函數(shù)和少量 C++ 類構(gòu)成,同時(shí)提供了Python、Ruby、MATLAB等語(yǔ)言的接口,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺方面的很多通用算法。

在移動(dòng)端上使用 OpenCV 可以完成一系列圖像處理的工作。

二. OpenCV 在 Android 上的配置

我在項(xiàng)目中使用的 OpenCV 版本是 4.x。

在 Android Studio 中創(chuàng)建一個(gè) Library,將官網(wǎng)下載的 OpenCV 導(dǎo)入后,就可以直接調(diào)用 OpenCV 中 Java 類的方法。如果想調(diào)用 C++ 的類,也可以使用 CMake 創(chuàng)建環(huán)境,然后通過 include 文件放入指定路徑。下面是項(xiàng)目中使用的 CMakeLists.txt

cmake_minimum_required(VERSION 3.6.0)include_directories( ${CMAKE_SOURCE_DIR}/src/main/cpp/include)add_library(libopencv_java4 SHARED IMPORTED)set_target_properties( libopencv_java4 PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/libs/${ANDROID_ABI}/libopencv_java4.so)add_library(libc++_shared SHARED IMPORTED)set_target_properties( libc++_shared PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/libs/${ANDROID_ABI}/libc++_shared.so)add_library( detect SHARED src/main/cpp/detect-lib.cpp src/main/cpp/detect-phone.cpp)find_library( log-lib log)target_link_libraries( detect libopencv_java4 libc++_shared jnigraphics ${log-lib})

其中,detect-lib.cpp 和 detect-phone.cpp 是我創(chuàng)建的 C++ 類。打成 so 文件時(shí),會(huì)包含這2個(gè)類。

三. 例子兩則

3.1 作為二維碼識(shí)別的兜底方案

在 Android 原生開發(fā)中,二維碼識(shí)別有老牌的 zxing 等開源庫(kù)。為何還要使用 OpenCV 呢?因?yàn)?OpenCV 有自己的優(yōu)勢(shì),借助它可以定位到二維碼的位置,一般識(shí)別不到二維碼的內(nèi)容大多是因?yàn)檎也坏剿奈恢谩R悄軌蛘业轿恢茫涂梢钥焖僮R(shí)別二維碼的內(nèi)容。這樣一來(lái),識(shí)別二維碼時(shí)需要先拍一張照,從圖像中找出二維碼的位置。當(dāng)然,還可以對(duì)圖像進(jìn)行預(yù)處理,以便能夠更好地找到二維碼的位置。下面的代碼,展示了在應(yīng)用層拍完照之后,將圖片的路徑傳到 jni 層將其轉(zhuǎn)換成對(duì)應(yīng)的 Mat 對(duì)象,再轉(zhuǎn)換成灰度圖像,然后找出二維碼的位置,要是能夠找到的話就識(shí)別出二維碼的內(nèi)容。

extern 'C'JNIEXPORT jstring JNICALLJava_com_xxx_sdk_utils_DetectUtils_qrDetect(JNIEnv *env, jclass jc,jstring filePath) { const char *file_path_str = env->GetStringUTFChars(filePath, 0); string path = file_path_str; Mat src = imread(path); Mat gray, qrcode_roi; cvtColor(src, gray, COLOR_BGR2GRAY); QRCodeDetector qrcode_detector; vector<Point> pts; string detect_info; bool det_result = qrcode_detector.detect(gray, pts); if (det_result) { detect_info = qrcode_detector.decode(gray, pts, qrcode_roi); return env->NewStringUTF(detect_info.c_str()); } else { detect_info = ''; return env->NewStringUTF(detect_info.c_str()); }}

對(duì)應(yīng)的 Java 代碼,方便應(yīng)用層調(diào)用 jni 層的 qrDetect()

public class DetectUtils { static { System.loadLibrary('detect'); } /** * 識(shí)別二維碼 * @param filePath * @return */ public static native String qrDetect(String filePath); ......}

最后是應(yīng)用層的調(diào)用

// 使用 OpenCV 進(jìn)行二維碼識(shí)別val result = DetectUtils.qrDetect(filePath)L.d('opencvs識(shí)別二維碼: $result')

3.2 比對(duì)圖像的差異

在我們的實(shí)際開發(fā)中遇到一個(gè)應(yīng)用場(chǎng)景:需要判斷我們的手機(jī)回收機(jī)里面是否存放了物體。(手機(jī)回收機(jī)是一個(gè)觸摸屏設(shè)備,可以通過 Android 系統(tǒng)來(lái)操作內(nèi)部的硬件設(shè)備。)

我們事先拍一張回收機(jī)內(nèi)沒有物體的圖作為基準(zhǔn)圖像,等到需要判斷是否存在物體時(shí)再拍一張圖片。兩幅圖片對(duì)比看比例,比列超過閾值則認(rèn)為回收機(jī)內(nèi)存在著物體。

下面的代碼,展示了在應(yīng)用層拍完照之后,跟基準(zhǔn)圖片進(jìn)行比對(duì),并返回結(jié)果。

extern 'C'JNIEXPORT jboolean JNICALLJava_com_xxx_sdk_utils_DetectUtils_checkPhoneInMTA(JNIEnv *env, jclass jc,jstring baseImgPath,jstring filePath) { jboolean tRet = false; const char *file_path_str = env->GetStringUTFChars(filePath, 0); string path = file_path_str; Mat src = imread(path); const char *base_img_path_str = env->GetStringUTFChars(baseImgPath, 0); string basePath = base_img_path_str; Mat baseImg = imread(basePath); int result = checkPhoneInBox(baseImg,src,40,0.1); LOGI('checkPhoneInBox result = %d',result); if (result == 0) { tRet = true; } return tRet;}

兩張圖片真正的比對(duì)是在 checkPhoneInBox() 中完成的。其中,maxFilter() 是為了處理彩色的情況,然后使用高斯濾波進(jìn)行降噪處理,再進(jìn)行二值化處理,最后判斷灰度差異區(qū)域占總圖像的比列是否超過預(yù)先設(shè)定的閾值。

int checkPhoneInBox(cv::Mat baseImg, cv::Mat snapImg, int diffThresh, double threshRatio) { cv::Mat baseMaxImg, snapMaxImg,baseGausImg, snapGausImg; if (baseImg.empty()|| snapImg.empty()) { return -1; } try { maxFilter(baseImg, baseMaxImg); maxFilter(snapImg, snapMaxImg); } catch (...) { return -1; } cv::GaussianBlur(baseMaxImg, baseGausImg, cv::Size(5, 5),0); cv::GaussianBlur(snapMaxImg, snapGausImg, cv::Size(5, 5),0); cv::Mat diff,diffBin; cv::Mat noMax; cv::absdiff(baseGausImg, snapGausImg, diff); cv::threshold(diff, diffBin, diffThresh, 255, cv::THRESH_BINARY); float ratio = (float)cv::countNonZero(diffBin) / (long)diffBin.total(); LOGI('ratio = %f,%d,%ld',ratio,cv::countNonZero(diffBin),(long)diffBin.total()); if (ratio > threshRatio) { return 0; } else { return 1; }}int maxFilter(cv::Mat baseImg, cv::Mat &maxImg){ if (baseImg.channels() <3) { maxImg = baseImg.clone(); } else { maxImg.create(baseImg.size(), CV_8UC1); for (int r=0;r<baseImg.rows;r++) { for (int c = 0; c < baseImg.cols; c++) {uchar maxTmp=0;cv::Vec3b s = baseImg.at<cv::Vec3b>(r, c);maxTmp = (std::max)(s[0],s[1]);maxTmp = (std::max)(maxTmp,s[2]);maxImg.at<uchar>(r, c) = maxTmp; } } } return 0;}

對(duì)應(yīng)的 Java 代碼,方便應(yīng)用層調(diào)用 jni 層的 checkPhoneInMTA()

public class DetectUtils { static { System.loadLibrary('detect'); } /** * 判斷MTA中是否有手機(jī) * @param baseImageFilePath 基準(zhǔn)的圖片 * @param filePath 拍攝的圖片 * @return */ public static native boolean checkPhoneInMTA(String baseImageFilePath, String filePath); ......}

最后是應(yīng)用層的調(diào)用

val result = DetectUtils.checkPhoneInMTA(Constants.OPENCV_PHOTO_PATH, it.absolutePath)

四. 總結(jié)

OpenCV 是一款功能強(qiáng)大的圖像處理庫(kù)。但是它本身體積也較大,在移動(dòng)端使用至少會(huì)增加 Android Apk 包 10 M+ 的體積(主要取決于 App 要支持多少個(gè) CPU 架構(gòu))。如果很介意的話,可以考慮自行裁剪 OpenCV,然后再進(jìn)行編譯。我所在的部門隸屬于中臺(tái)部門,主要輸出接口和 SDK。在 SDK 中使用 OpenCV 的確會(huì)給業(yè)務(wù)方造成困擾,未來(lái)也會(huì)考慮如何減少 SDK 的體積,以及把 SDK 做成模塊化。

到此這篇關(guān)于OpenCV在Android上的應(yīng)用示例的文章就介紹到這了,更多相關(guān)OpenCV Android應(yīng)用內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 美国免费三片在线观看 | 成人精品视频 | 国产一国产一级毛片视频在线 | 国产不卡精品一区二区三区 | 韩国一级淫片视频免费播放 | 亚洲国产欧美91 | 日韩国产成人精品视频 | 国产中文字幕在线播放 | 中国的毛片 | 成人久久在线 | 99在线观看精品视频 | 免费在线视频成人 | 一级做a爰片性色毛片中国 一级做a爰性色毛片 | 国产精品国产亚洲精品看不卡 | xxxx肥婆性bbbb欧美 | 国产一级大片免费看 | 亚洲小视频在线播放 | 国产精品久久久久久久hd | 午夜黄色毛片 | 欧美俄罗斯一级毛片激情 | 米奇久久| 国产免费怡红院视频 | 欧美成人免费大片888 | 精品在线观看视频 | 国产成人免费高清激情视频 | 精品视频免费在线观看 | 国产综合久久久久影院 | 久久欧美精品欧美九久欧美 | 国产高清片 | 日韩欧美一二区 | 免费a网址 | 欧美一级片免费 | 日本亚欧乱色视频在线网站 | 日本一级级特黄特色大片 | 欧美一区二区三区在线观看免费 | 欧美精品久久 | 日本黄色免费大片 | 午夜国产亚洲精品一区 | 精品欧美一区视频在线观看 | 午夜性爽快免费视频播放 | a级男女性高爱潮高清试 |