Android 接入 OpenCV庫的三種方式

来源:http://www.cnblogs.com/xiaoxiaoqingyi/archive/2017/04/06/6676096.html
-Advertisement-
Play Games

OpenCV是一個基於BSD許可(開源)發行的跨平臺電腦視覺庫,可以運行在Linux、Windows、Android和Mac OS操作系統上。它輕量級而且高效——由一系列 C 函數和少量 C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的介面,實現了圖像處理和電腦視覺方面的很 ...


       OpenCV是一個基於BSD許可(開源)發行的跨平臺電腦視覺庫,可以運行在Linux、Windows、Android和Mac OS操作系統上。它輕量級而且高效——由一系列 C 函數和少量 C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的介面,實現了圖像處理和電腦視覺方面的很多通用演算法。          我們利用它來做一些圖片的處理,能大大的優化記憶體的處理。下麵我來說說接下OpenCV 的三種方式:   一、接入OpenCV 的Java SDK 包,這樣你可以直接在Java調用OpenCV 的大部分方法。第一種方式適用於對Opencv c++ 不熟悉的童鞋,不需要直接調用C++方案, 因為SDK 已經用JNI 全部封裝好了。假設你已經安裝好JDK、AndroidStudio與NDK環境。          先到官網http://opencv.org/releases.html ,下載Android 包,如:opencv-3.2.0-android-sdk.zip。   sdk 目錄提供了Android的API與Java 庫 sdk/java 目錄包含了一個 Eclipse 項目,該項目提供 OpenCV 的Java API,且可以導入到開發環境里。 sdk/native 目錄包含了OpenCV C++ 頭文件(用於JNI),與Android的 .so動態庫 .a靜態庫。 sdk/etc 目錄包含了Haar 與 LBP cascades 級聯。 apk  目錄包含了用戶安裝在指定的Android設備的安裝文件,該文件使opencv 庫可以管理opencv API   首先: File > New > New Module   然後:選擇Import Eclipse ADT Project   把sdk/java 下的項目導入到項目里,然後把這個modules 添加到 app modules里, 直接在 app 目錄下build.gradle 文件里dependencies 大括弧下添加: compile project(':openCVLibrary')   接著在 app/src/main 目錄下 創建一個jniLibs 目錄,然後把sdk/native/libs 下所有文件 拷貝到jniLibs下,編譯,運行。   如果導入後,出現一些android 自帶的類識別不了,那就是因為編譯的SDK版本出錯了。 打開 剛導入 的模塊下 build.gradle 文件,把 compileSdkVersion 與 targetSdkVersion修改成你最新的SDK版本,如:  
apply plugin: 'com.android.library'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.0"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 25
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}
運行,則成功了,我發現似乎不需要再安裝額外的 opencv 的apk 了。 下麵鏈接是我添加成功的例子:  https://github.com/xiaoxiaoqingyi/NDKDemos     OpenCV_java 項目   二、使用opencv sdk 提供的 C++ 頭文件與 .so動態庫 與 .a靜態庫,自己封裝jni,這樣使用的效率會比第一種方法高一些, 且可以100%使用opencv 的介面。下麵看一下安裝的方式:         用AndroidStudio 創建一個項目,然後在 Java 類里創建一個native 方法, 再在app/src/main 下創建 jni,然後創建 cpp 文件對於 native 方法。 以上是一個簡單的jni 方法,你可以查看我以前的 文章: http://www.cnblogs.com/xiaoxiaoqingyi/p/6524165.html 在基本的jni 跑通下,我們把 opencv 庫加入項目里,首先:   1、把 sdk/native 目錄 拷貝到 項目的 jni 目錄下,   然後就是配置 Android.mk文件:
LOCAL_PATH:=$(call my-dir)

include $(CLEAR_VARS)
OpenCV_INSTALL_MODULES := on
OpenCV_CAMERA_MODULES := off
OPENCV_LIB_TYPE :=STATIC

ifeq ("$(wildcard $(OPENCV_MK_PATH))","")
include $(LOCAL_PATH)/native/jni/OpenCV.mk
else
include $(OPENCV_MK_PATH)
endif
LOCAL_MODULE := OpenCV
LOCAL_SRC_FILES := com_magicing_eigenndk_NDKUtils.cpp
LOCAL_LDLIBS +=  -lm -llog
include $(BUILD_SHARED_LIBRARY)

 

接著配置 Application.mk 文件:
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_PLATFORM := android-9
  最後在 cpp 文件調用 opencv 的方法, 首先導入 #include <opencv2/opencv.hpp> 如:
#include <jni.h>
#include <string>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <opencv2/opencv.hpp>

using namespace cv;

extern "C"

  JNIEXPORT jintArray JNICALL Java_com_magicing_eigenndk_NDKUtils_gray(
          JNIEnv *env, jclass obj, jintArray buf, int w, int h) {

      jint *cbuf;
      cbuf = env->GetIntArrayElements(buf, JNI_FALSE );
      if (cbuf == NULL) {
          return 0;
      }

      Mat imgData(h, w, CV_8UC4, (unsigned char *) cbuf);

      uchar* ptr = imgData.ptr(0);
      for(int i = 0; i < w*h; i ++){
          //計算公式:Y(亮度) = 0.299*R + 0.587*G + 0.114*B
          //對於一個int四位元組,其彩色值存儲方式為:BGRA
          int grayScale = (int)(ptr[4*i+2]*0.299 + ptr[4*i+1]*0.587 + ptr[4*i+0]*0.114);
          ptr[4*i+1] = grayScale;
          ptr[4*i+2] = grayScale;
          ptr[4*i+0] = grayScale;
      }

      int size = w * h;
      jintArray result = env->NewIntArray(size);
      env->SetIntArrayRegion(result, 0, size, cbuf);
      env->ReleaseIntArrayElements(buf, cbuf, 0);
      return result;
  }
  然後在 activity 頁面里顯示處理過的圖片,如下:
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        NDKUtils ndk = new NDKUtils();

        Bitmap bitmap = ((BitmapDrawable) getResources().getDrawable(
                R.mipmap.pic_test)).getBitmap();
        int w = bitmap.getWidth(), h = bitmap.getHeight();
        int[] pix = new int[w * h];
        bitmap.getPixels(pix, 0, w, 0, 0, w, h);
        int [] resultPixes=ndk.gray(pix,w,h);
        Bitmap result = Bitmap.createBitmap(w,h, Bitmap.Config.RGB_565);
        result.setPixels(resultPixes, 0, w, 0, 0,w, h);

        ImageView img = (ImageView)findViewById(R.id.img2);
        img.setImageBitmap(result);

    }

}

運行成功後:

 

我編譯成功的項目鏈接: https://github.com/xiaoxiaoqingyi/NDKDemos   (OpenCV_native項目) 官網參考資料: http://docs.opencv.org/2.4/doc/tutorials/introduction/android_binary_package/dev_with_OCV_on_Android.html#native-c   三、通過opencv 的源碼,重新編譯成 Android sdk 庫,這樣的好處是能獲取到最新的功能,缺點是編譯有點困難(對於不懂C++/C 的童鞋),且新的代碼或許會存在不相容與錯誤。   http://code.opencv.org/projects/opencv/wiki/Building_OpenCV4Android_from_trunk      以上的鏈接是官網推薦的編譯過程,我也嘗試過編譯成功,如果在windows 下安裝Cygwin,然後來編譯是通過不了的,需要重新安裝cmake、shell 以及其它的軟體,編譯的過程確實複雜很多。      我是在MAC下編譯的,只需安裝 cmake軟體,當然也要有NDK的環境。大概的步驟: https://github.com/opencv/opencv 下載opencv 源碼包   1、在mac 下安裝好 cmake 軟體, 2、配置NDK環境變數, 參考百度:http://jingyan.baidu.com/article/d2b1d1029c1ea65c7e37d4c9.html 3、build_android_arm/install 目錄下 得到編譯好的jni 目錄。        如果你想編譯 opencv_contrib 也就是 opencv extra庫的話,你需要把https://github.com/Itseez/opencv_contrib 額外庫包也下載下來。我曾經把opencv_contrib包的tracking模塊 加入到opencv 核心庫,編譯到PC的CodeBlocks開發環境就成功了,但是編譯成Android的環境就出錯了,這個問題我一直沒有解決,最後我換用了其它的方法,我把相應的一些資料提供給大家:   https://github.com/alexkarargyris/Caffe_OpenCV_Android_App https://zami0xzami.wordpress.com/2016/03/17/building-opencv-for-android-from-source/       我參考了上述的資料,在載入opencv 額外庫的時候,編譯了幾次也沒能成功,會報cmake 編譯出錯。我也讓C++ 的同事嘗試用cmake 幫我編譯,也沒能成功,也許我們對cmake 瞭解不夠深,據說opencv extra 庫是需要收費的,所以Android端不能直接編譯進來,但是PC端是成功編譯了的。如有編譯成功的大神,請多多指教!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ▓▓▓▓▓▓ 大致介紹 在ECMASript6中引入了類這一概念,通過class聲明一個類。對於學習過C和C++的人應該不會陌生 ▓▓▓▓▓▓ 類 看一個簡單的類: 在上面的例子中,利用class關鍵字聲明瞭一個類Greeter,在類中,定義了一個屬性,一個構造函數和一個方法 ▓▓▓▓▓▓ 繼承 類 ...
  • 我們看有的項目的文檔,會發現它的註釋寫的很好看,很規範。 而如果你的代碼註釋還是在用簡單的 // 或者 /**/ ,那就學習一下在Android Studio中如何進行註釋模板的設置 首先看下麵代碼: 很顯然,這是一個規範的註釋方法,對方法的每一個參數都有進行說明,很顯然 這註釋中的 @param ...
  • 一、準備工具: 1.配置電腦java JDK 環境 JDK 可以到官網下載 ,根據需要安裝的電腦的配置下載相應的JDK http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 我這裡選擇: ...
  • 本文並非最終版本,如果想要關註更新或更正的內容請關註文集,聯繫方式詳見文末,如有疏忽和遺漏,歡迎指正。 本文相關目錄: ================== 所屬文集: "【iOS】07 設備工具 " ================== "7.4 定位服務 1.0 簡介" "7.4 定位服務 2. ...
  • 相信 strings.xml 已經是大家在 Android 開發中最熟悉的文件之一了,但其實它也有很多需要註意的地方和一些小技巧,知道了這些可以讓你的 Android 應用更加規範易用,大家來看看吧。: ) 不要復用 這一條可能很多人會有不同的意見,因為廣為流行的編程理念就在教導我們要復用代碼,當然 ...
  • 頂部Analyze菜單中選擇Run Inspection by Name 在彈出的輸入框中輸入unused resources ...
  • 推薦地址:https://developer.apple.com/app-store/review/guidelines/cn/ 目錄 1.條款與條件 2.功能 3.元數據 4.位置 5.推送通知 6.游戲中心 7.廣告 8.商標與商品外觀 9.媒體內容 10.用戶界面 11.購買與貨幣 12.抓取 ...
  • 轉載請註明出處:http://www.cnblogs.com/cnwutianhao/p/6676121.html 序言 Android 用甜點作為它們系統版本的代號的命名方法開始於 Andoird 1.5 發佈的時候。作為每個版本代表的甜點按照26個英文字母順序的原則進行命名:紙杯蛋糕,甜甜圈,松 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...