日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

安装目录opencv for android 教程(环境搭建篇)

發(fā)布時(shí)間:2025/3/17 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 安装目录opencv for android 教程(环境搭建篇) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這幾周朋友幾篇文章介紹了改安裝目錄的文章. 關(guān)聯(lián)文章的地址

? ?

????最近android開(kāi)發(fā)異常熾熱,隨著手機(jī)性能越來(lái)越高,圖像處程序也越來(lái)越重要,

????由于opencv for android 網(wǎng)上教程大多為英文文檔,中文教程都為零碎篇章,

????很少有完全的opencv for android 教程

????博主最近正在學(xué)習(xí)opencv for android 其中走了很多彎路

????所以將一些經(jīng)驗(yàn)寫(xiě)下 幫助大家少走彎路!

????只合適初學(xué)者 請(qǐng)大神教正,或者繞道吧,走好不送!

????注意本文只擔(dān)任環(huán)境的搭建 不擔(dān)任講授

????按照文章來(lái)確保能搭建一個(gè)完美的opencv for android 的開(kāi)發(fā)環(huán)境

? ?

????但是詳細(xì)的理解 須要讀者自己實(shí)驗(yàn)和摸索!

????win7/win8 環(huán)境

????我是win8環(huán)境

????java SDK 6 / 7 ? ? ?

?

????我是用的6

????eclipse for java EE IED

????我是32位版

????ADT插件

????CDT插件

????Android SDK

????Android NDK

????我的是r8版

????cygwin

????Sequoyah

????opencv for android

????我用的是2.4.5

????

如果你還沒(méi)有JDK的話,可以去這里下載,接下來(lái)的工作就是安裝提示一步一步走。設(shè)置環(huán)境變量步調(diào)如下:

????

  • 我的電腦->屬性->高級(jí)->環(huán)境變量->系統(tǒng)變量中添加以下環(huán)境變量:
  • JAVA_HOME值為: D:\Program Files\Java\jdk1.6.0_18(你安裝JDK的目錄
  • CLASSPATH值為:.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\bin;
  • Path:? 在開(kāi)始追加 %JAVA_HOME%\bin;
  • NOTE:前面四步設(shè)置環(huán)境變量對(duì)搭建Android開(kāi)發(fā)環(huán)境不是必須的,可以跳過(guò)。
  • ????

    安裝實(shí)現(xiàn)當(dāng)前,可以在檢查JDK是否安裝成功。打開(kāi)cmd窗口,輸入java –version 查看JDK的版本信息。涌現(xiàn)相似下面的畫(huà)面表示安裝成功了:

    ????

    ? ?

    ????1.下載

    ????2.解壓到任意目錄

    ????3.去目錄啟動(dòng)

    ????4.設(shè)置工作路徑

    ????5.安裝實(shí)現(xiàn)

    ????

    在Android Developers下載android-sdk_r05-windows.zip,下載實(shí)現(xiàn)后解壓到任意路徑。

    ????

    • 運(yùn)行SDK Setup.exe,點(diǎn)擊Available Packages。如果沒(méi)有涌現(xiàn)可安裝的包,請(qǐng)點(diǎn)擊Settings,選中Misc中的"Force https://..."這項(xiàng),再點(diǎn)擊Available Packages 。
    • 選擇希望安裝的SDK及其文檔或者其它包,點(diǎn)擊Installation Selected、Accept All、Install Accepted,開(kāi)始下載安裝所選包
    • 在用戶(hù)變量中新建PATH值為:Android SDK中的tools絕對(duì)路徑(本機(jī)為D:\AndroidDevelop\android-sdk-windows\tools)。

    ????

    ????


    ????

    進(jìn)入cmd命令窗口,檢查SDK是不是安裝成功。?
    運(yùn)行 android –h 如果有相似以下的輸出,標(biāo)明安裝成功:

    ????


    ????ADT是專(zhuān)門(mén)給eclipse開(kāi)發(fā)android的插件

    ????

    ????

    • 打開(kāi) Eclipse IDE,進(jìn)入菜單中的 "Help" -> "Install New Software"
    • 點(diǎn)擊Add...按鈕,彈出對(duì)話框要求輸入Name和Location:Name自己隨意取,Location輸入http://dl-ssl.google.com/android/eclipse。如下圖所示:

    ????

    ????

    ????然后就是按提示一步一步next。

    ????

    ????

    實(shí)現(xiàn)當(dāng)前:

    ????

    • 選擇Window > Preferences...
    • 在左邊的面板選擇Android,然后在右側(cè)點(diǎn)擊Browse...并選中SDK路徑,本機(jī)為:?
      D:\AndroidDevelop\android-sdk-windows
    • 點(diǎn)擊Apply、OK。配置實(shí)現(xiàn)。

    ????

    創(chuàng)建android AVD模擬器:

    android AVD模擬器是一個(gè)android的虛擬機(jī)用來(lái)在pc機(jī)上調(diào)試android程序用的! 至于如何創(chuàng)建 這里就不說(shuō)了 因?yàn)槲覒?yīng)用真機(jī)調(diào)試所以沒(méi)有用這個(gè)
    以上 android 的開(kāi)發(fā)環(huán)境就搭建終了了 如果有任何問(wèn)題請(qǐng)自行g(shù)oogle,這個(gè)資料太多了! 總會(huì)有一個(gè)合適你

    NDK + Cygwin 環(huán)境搭建:

    參考1: 點(diǎn)擊打開(kāi)鏈接 參考2: 點(diǎn)擊打開(kāi)鏈接

    安裝Android NDK:

    1.下載Android NDK 我下載的是 r8版本 地址就不給除了 自己google吧 2.解壓到任意目錄 我解壓的目錄是e:/IDE/ 下 3.實(shí)現(xiàn)

    安裝Cygwin:

    Cygwin 是一個(gè)將c++代碼編譯成os動(dòng)態(tài)庫(kù)的東西, 而os庫(kù)就可以給java調(diào)用了 這里可能你有困惑 opencv for android 不是有java的API了么 怎么還要用c++ 嗯 只能說(shuō)JAVA的API還不是很全面 有些東西還是會(huì)用到c++的API才行 所以這個(gè)是必須的 還有一些有說(shuō)NDK r8 不須要Cygwin了 但是我不知道怎么弄 我現(xiàn)在還是應(yīng)用這個(gè)的

    由于NDK開(kāi)發(fā)大都涉及到C/C++在GCC環(huán)境下編譯、運(yùn)行,所以在Windows環(huán)境下,須要模擬Linux模擬編譯環(huán)境,下載地址:

    http://www.cygwin.com/

    下載后是個(gè)setup.exe文件,應(yīng)用進(jìn)程如下:

    第一步:運(yùn)行setup程序,第一步圖略,直接點(diǎn)擊Next進(jìn)入下一步。

    第二步:選擇安裝方法,第一次可以采取Direct Connection在線下載安裝,如有現(xiàn)成的離線包,可以選擇離線安裝(Install from Local Directory)。

    ?

    第四步:設(shè)置本地包暫存路徑

    暫存目錄默許是放到setup.exe的同級(jí)目錄下,下載后名字相似ftp%3a%2f%2fcygwin.mirrors.pair.com%2f這樣格式。


    第五步:設(shè)置網(wǎng)絡(luò)連接方法


    第六步:選擇下載站點(diǎn)地址

    起初實(shí)驗(yàn)幾個(gè)看哪個(gè)速度快就用哪個(gè)地址(如果感到不快就點(diǎn)取消,再次來(lái)過(guò))。



    ?

    第七步:等待加載安裝項(xiàng)載入,選擇安裝項(xiàng)

    我們編譯NDK,在默許設(shè)置下,只要選擇Devel(點(diǎn)擊列表中Devel,將前面的Default改成Install,圖中箭頭所示),其它均為默許狀態(tài)。

    ?

    第八步:等待下載實(shí)現(xiàn)

    下載實(shí)現(xiàn)時(shí)光決定于你選擇的安裝包數(shù)量及網(wǎng)絡(luò)連接速度,比如按照本文默許的選擇方法,可能須要4-5個(gè)小時(shí),下載后壓縮包約750M,下載實(shí)現(xiàn)后會(huì)自動(dòng)安裝到上文設(shè)置的安裝目錄。



    提示:第一次下載實(shí)現(xiàn)后,最好把下載的包目錄做個(gè)備份,下次安裝同樣的環(huán)境可以直接應(yīng)用離線安裝方法(第二步中選擇本地安裝)。

    安裝實(shí)現(xiàn)后,先運(yùn)行Cygwin一次(Cygwin.bat),以便創(chuàng)建一些用戶(hù)環(huán)境文件,分離輸入:

    make -v

    和,

    gcc -v

    如果檢測(cè)成功,會(huì)有make和gcc相關(guān)版本信息打印出來(lái),如下圖。


    ????


    ????


    ????

    可以在cygwin中通過(guò)vim修改,也可以在windows安裝目錄中修改 home\<你的用戶(hù)名>\.bash_profile 文件中最后添加環(huán)境變量

    NDKROOT=/cygdrive/e/Andriod/develop/android-ndk-r8

    export NDKROOT

    其中NDK=/cygdrive/<你的盤(pán)符>/<android ndk 目錄> ,"NDK"這個(gè)名字隨意起,當(dāng)前經(jīng)常用不要太長(zhǎng)。

    重啟cygwin,輸入:

    cd $NDK

    可進(jìn)入ndk對(duì)應(yīng)目錄說(shuō)明設(shè)置OK。

    3.用ls命令查看libs/armeabi/下是否生成了so文件,有l(wèi)ibhello-jni.so說(shuō)明ndk運(yùn)行正常。
    $ ls libs/armeabi/
    gdb.setup gdbserver libhello-jni.so
    也可以到E:\android\android-ndk-r8\samples\hello-jni\libs\armeabi目錄下看有沒(méi)有生成的.so文件。


    2)導(dǎo)入NDK的hello-jni示例到Eclipse中
    1.在Eclipse中新建一個(gè)Android工程HelloJni。
    在Create Android Project時(shí)勾選“Create project from existing source”,Location中填E:\android\android-ndk-r8\samples\hello-jni





    2.直接以Android Aplication運(yùn)行com.example.hellojni.HelloJni項(xiàng)目。要先有.so文件才能運(yùn)行起來(lái)。 os放在工程根目錄下


    CDT插件的安裝:

    ????

    CDT是eclipse開(kāi)發(fā)c++用的插件

    ????

    CDT插件可以在一個(gè)工程中同時(shí)開(kāi)發(fā)基于C/C++的Native代碼和基于Java的代碼,加上Sequoyah插件可以一次編譯兩部分代碼。下載地址:http://www.eclipse.org/cdt/downloads.php
    不同eclipse版本要下載對(duì)應(yīng)的包,否則安裝不了。
    Help-->About Eclipse 下可以看到自己用的版本,我的是 Version: Helios Service Release 2 即Helios版本
    http://www.eclipse.org/downloads/download.php?file=/tools/cdt/releases/helios/dist/cdt-master-7.0.2.zip
    cdt-master-7.0.2.zip:這個(gè)是CDT的離線安裝包。(由于文件比較大推薦應(yīng)用離線包,7.0.2的54.8M,8.1.1的103MB)
    安裝:Eclipse -> Help -> Install New Software,點(diǎn)擊add。
    Name:CDT_版本。
    Location:點(diǎn)擊Archive,定位到下載的“cdt-master-7.0.2.zip”文件。

    如果Location的下面涌現(xiàn)“Duplicate location”錯(cuò)誤,請(qǐng)到Window -> preferences -> Install/Update -> Avaliable Software Site中找到remove掉。
    如果涌現(xiàn)缺少eclipse包說(shuō)明你下載的版本和eclipse版本不匹配,從新下載匹配的從新安裝就可以了。

    ????

    ????


    ????


    ????

    另外須要重啟eclipse后才生效。
    安裝實(shí)現(xiàn)重啟后,在Eclispe中新建一個(gè)項(xiàng)目,如果涌現(xiàn)了C/C++項(xiàng)目,則標(biāo)明CDT插件安裝成功了。

    ????

    ????


    ????

    安裝Sequoyah插件:

    ????

    Sequoyah插件用于設(shè)置Android工程對(duì)Native開(kāi)發(fā)的支持。
    官方網(wǎng)址:http://www.eclipse.org/sequoyah/downloads/
    打開(kāi)上面網(wǎng)址就可以看到詳細(xì)的安裝說(shuō)明了
    Location:http://download.eclipse.org/sequoyah/updates/2.0/

    For Helios SR2 Sequoyah version: http://download.eclipse.org/sequoyah/updates/1.0.2/
    注:只是安裝1.0.2的沒(méi)有出來(lái)“本機(jī)開(kāi)發(fā)”的配置所以沒(méi)法用,本人從新安裝了2.0的可以了,這個(gè)應(yīng)該直接安裝最新版2.0的就可以了。
    在安裝界面不要勾選“Group items by category”復(fù)選框,選中涌現(xiàn)了列表為空(There are no categorized items)的情況。

    在“window –> preferences ->Android -> 本機(jī)開(kāi)發(fā)”中添加NDK的路徑。

    ????

    ????


    ????

    這個(gè)插件安裝后也須要重啟eclipse的
    重啟后右鍵之前建立的“HelloJni”項(xiàng)目,在“Android Tools”選項(xiàng)中包含“Add Native Support…”選項(xiàng)即成功。

    ????


    每日一道理
    正所謂“學(xué)海無(wú)涯”。我們正像一群群魚(yú)兒在茫茫的知識(shí)之海中跳躍、 嬉戲,在知識(shí)之海中出生、成長(zhǎng)、生活。我們離不開(kāi)這維持生活的“海水”,如果跳出這個(gè)“海洋”,到“陸地”上去生活,我們就會(huì)被無(wú)情的“太陽(yáng)”曬死。

    opecnv for android 開(kāi)發(fā)環(huán)境搭建:

    參考1: 點(diǎn)擊打開(kāi)鏈接 參考2: 點(diǎn)擊打開(kāi)鏈接

    opencv for android SDK 安裝:

    進(jìn)入官網(wǎng)(http://opencv.org/)下載OpenCV4Android并解壓,其目錄結(jié)構(gòu)如下:

    其中,sdk目錄即是我們開(kāi)發(fā)opencv所須要的類(lèi)庫(kù);samples目錄中存放著多少opencv應(yīng)用示例(包括人臉檢測(cè)等),可為我們進(jìn)行android下的opencv開(kāi)發(fā)提供參考;doc目錄為opencv類(lèi)庫(kù)的應(yīng)用說(shuō)明及api文檔等;而apk目錄則存放著對(duì)應(yīng)于各內(nèi)核版本的OpenCV_2.4.3.2_Manager_2.4應(yīng)用安裝包。此應(yīng)用用來(lái)管理手機(jī)設(shè)備中的opencv類(lèi)庫(kù),在運(yùn)行opencv應(yīng)用之前,必須確保手機(jī)中已安裝了OpenCV_2.4.3.2_Manager_2.4_*.apk,否則opencv應(yīng)用將會(huì)因?yàn)闊o(wú)法加載opencv類(lèi)庫(kù)而無(wú)法運(yùn)行。

    2.2 將SDK引入工作空間

    ??????? (1) 選擇一個(gè)路徑,新建文件夾做為工作空間(我在E盤(pán)根目錄下新建workspace目錄來(lái)做為工作空間);

    ??????? (2) 將OpenCV-2.4.3.2-android-sdk中的sdk目錄copy至工作空間,并將其更名為OpenCV-SDK(是否更改名稱(chēng)無(wú)所謂,這是我個(gè)人習(xí)氣而已);

    ??????? (3) 以新建的目錄為工作空間,打開(kāi)eclipse;

    ??????? (4) 將OpenCV-SDK引入到工作空間中,如下圖所示:









    應(yīng)用java API開(kāi)發(fā)android:

    創(chuàng)建工程

    ??????? (1) 打開(kāi)eclipse,創(chuàng)建android應(yīng)用工程GrayProcess;

    ??????? (2) 將測(cè)試圖像lena.jpg添加到資源目錄res/drawable-hdpi中;

    ??????? (3) 在Package Explorer中選擇項(xiàng)目GrayProcess,單擊右鍵在彈出菜單中選擇Properties,然后在彈出的Properties窗口中左側(cè)選擇Android,然后點(diǎn)擊右下方的Add按鈕,選擇OpenCV Library 2.4.3并點(diǎn)擊OK,操縱實(shí)現(xiàn)后,會(huì)將OpenCV類(lèi)庫(kù)添加到GrayProcess的Android Dependencies中,如下圖所示:








    工程代碼:
    (1) 字符串資源文件:strings.xml
    <resources><string name="app_name">GrayProcess</string><string name="hello_world">Hello world!</string><string name="menu_settings">Settings</string><string name="title_activity_main">MainActivity</string><string name="str_proc">gray process</string><string name="str_desc">image description</string></resources> (2) 布局文件:main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent" ><Button android:id="@+id/btn_gray_process"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/str_proc"/><ImageViewandroid:id="@+id/image_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:contentDescription="@string/str_proc"/></LinearLayout>
    ? (3) MainActivity.java package com.iron.grayprocess;import org.opencv.android.BaseLoaderCallback; import org.opencv.android.LoaderCallbackInterface; import org.opencv.android.OpenCVLoader; import org.opencv.android.Utils; import org.opencv.core.Mat; import org.opencv.imgproc.Imgproc;import android.os.Bundle; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Bitmap.Config; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView;public class MainActivity extends Activity implements OnClickListener{private Button btnProc;private ImageView imageView;private Bitmap bmp;//OpenCV類(lèi)庫(kù)加載并初始化成功后的回調(diào)函數(shù),在此我們不進(jìn)行任何操縱private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {@Overridepublic void onManagerConnected(int status) {switch (status) {case LoaderCallbackInterface.SUCCESS:{} break;default:{super.onManagerConnected(status);} break;}}};@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);btnProc = (Button) findViewById(R.id.btn_gray_process);imageView = (ImageView) findViewById(R.id.image_view);//將lena圖像加載程序中并進(jìn)行表現(xiàn)bmp = BitmapFactory.decodeResource(getResources(), R.drawable.lena);imageView.setImageBitmap(bmp);btnProc.setOnClickListener(this);}@Overridepublic void onClick(View v) {Mat rgbMat = new Mat();Mat grayMat = new Mat();//獲得lena黑色圖像所對(duì)應(yīng)的像素?cái)?shù)據(jù)Utils.bitmapToMat(bmp, rgbMat);//將黑色圖像數(shù)據(jù)轉(zhuǎn)換為灰度圖像數(shù)據(jù)并存儲(chǔ)到grayMat中Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY);//創(chuàng)建一個(gè)灰度圖像Bitmap grayBmp = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), Config.RGB_565);//將矩陣grayMat轉(zhuǎn)換為灰度圖像Utils.matToBitmap(grayMat, grayBmp);imageView.setImageBitmap(grayBmp);}@Overridepublic void onResume(){super.onResume();//通過(guò)OpenCV引擎服務(wù)加載并初始化OpenCV類(lèi)庫(kù),所謂OpenCV引擎服務(wù)即是//OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存在于OpenCV安裝包的apk目錄中OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);} }
    3.1.3 運(yùn)行結(jié)果 ? ? ? ?


    應(yīng)用 c++ API開(kāi)發(fā)android:

    創(chuàng)建工程???????

    ??????? 步調(diào)如工程一,創(chuàng)建新工程GrayProcess2,將lena.jpg添加到資源文件,并按上面所示將opencv類(lèi)庫(kù)添加到工程中。

    編寫(xiě)下層代碼(java)

    (1)Stings.xml

    <resources><string name="app_name">GrayProcess2</string><string name="hello_world">Hello world!</string><string name="menu_settings">Settings</string><string name="title_activity_main">GrayProcess2</string><string name="str_proc">gray process</string><string name="str_desc">image description</string> </resources> (2)main.xml

    ?

    ?

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent" ><Button android:id="@+id/btn_gray_process"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/str_proc"/><ImageViewandroid:id="@+id/image_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:contentDescription="@string/str_proc"/></LinearLayout>
    (3)MainActivity.java

    ?

    ?

    package com.iron.grayprocess2;import org.opencv.android.BaseLoaderCallback; import org.opencv.android.LoaderCallbackInterface; import org.opencv.android.OpenCVLoader; import android.os.Bundle; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Bitmap.Config; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView;public class MainActivity extends Activity implements OnClickListener{private Button btnProc;private ImageView imageView;private Bitmap bmp;//OpenCV類(lèi)庫(kù)加載并初始化成功后的回調(diào)函數(shù),在此我們不進(jìn)行任何操縱private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {@Overridepublic void onManagerConnected(int status) {switch (status) {case LoaderCallbackInterface.SUCCESS:{System.loadLibrary("image_proc");} break;default:{super.onManagerConnected(status);} break;}}};@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);btnProc = (Button) findViewById(R.id.btn_gray_process);imageView = (ImageView) findViewById(R.id.image_view);//將lena圖像加載程序中并進(jìn)行表現(xiàn)bmp = BitmapFactory.decodeResource(getResources(), R.drawable.lena);imageView.setImageBitmap(bmp);btnProc.setOnClickListener(this);}@Overridepublic void onClick(View v) {int w = bmp.getWidth();int h = bmp.getHeight();int[] pixels = new int[w*h]; bmp.getPixels(pixels, 0, w, 0, 0, w, h);int[] resultInt = ImageProc.grayProc(pixels, w, h);Bitmap resultImg = Bitmap.createBitmap(w, h, Config.ARGB_8888);resultImg.setPixels(resultInt, 0, w, 0, 0, w, h);imageView.setImageBitmap(resultImg); }@Overridepublic void onResume(){super.onResume();//通過(guò)OpenCV引擎服務(wù)加載并初始化OpenCV類(lèi)庫(kù),所謂OpenCV引擎服務(wù)即是//OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存在于OpenCV安裝包的apk目錄中OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);} }
    ?代碼第28行:System.loadLibrary("image_proc")用來(lái)當(dāng)OpenCV類(lèi)庫(kù)初始化實(shí)現(xiàn)后加載類(lèi)庫(kù)image_proc。此類(lèi)庫(kù)由我們來(lái)生成,用于實(shí)現(xiàn)圖像灰度處理的操縱,此部分將在下面中說(shuō)明。

    ?


    ??(4) ImageProc.java

    ?

    package com.iron.grayprocess2;public class ImageProc {public static native int[] grayProc(int[] pixels, int w, int h); }

    ?


    ?ImageProc.java中只定義了方法grayProc,關(guān)鍵字native標(biāo)明,此方法的實(shí)現(xiàn)由本地代碼(C/C++)來(lái)實(shí)現(xiàn)。


    ?

    編寫(xiě)JNI及C相關(guān)代碼

    ????????在項(xiàng)目中新建目錄jni,在jni目錄中分離添加文件Android.mk,Application.mk,ImageProc.h,ImageProc.cpp,這四個(gè)文件的內(nèi)容分離如下所示。

    ??????? (1) Android.mk

    ?

    LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) include ../OpenCV-SDK/native/jni/OpenCV.mk LOCAL_SRC_FILES := ImageProc.cpp LOCAL_MODULE := image_proc include $(BUILD_SHARED_LIBRARY)

    ?

    代碼說(shuō)明:

    第一行:指明當(dāng)前編譯路徑;

    第二行:清空變量;

    第三行:將OpenCV類(lèi)庫(kù)中的編譯文件包含進(jìn)來(lái),如此一來(lái)在我們的工程中即可應(yīng)用OpenCV類(lèi)庫(kù);

    第四行:指定須要編譯的C++源文件;

    第五行:指定編譯生成的類(lèi)庫(kù)名稱(chēng);

    第六行:調(diào)用命令將源文件編譯為靜態(tài)庫(kù)。

    注:第三行指定的路徑很關(guān)鍵,當(dāng)opencv類(lèi)庫(kù)與工程路徑相關(guān)位置產(chǎn)生改變時(shí),此路徑也要隨之改變。


    (2) Application.mk(配置文件)

    ?

    APP_STL := gnustl_static APP_CPPFLAGS := -frtti -fexceptions APP_ABI := armeabi-v7a APP_PLATFORM := android-8

    ?


    (3)ImageProc.cpp

    ?

    #include <ImageProc.h> #include <opencv2/core/core.hpp> #include <string> #include <vector>using namespace cv; using namespace std;JNIEXPORT jintArray JNICALL Java_com_iron_grayprocess2_ImageProc_grayProc(JNIEnv* env, jclass obj, jintArray buf, jint w, jint h){jint *cbuf;cbuf = env->GetIntArrayElements(buf, 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 ++){//計(jì)算公式:Y(亮度) = 0.299*R + 0.587*G + 0.114*B//對(duì)于一個(gè)int四字節(jié),其黑色值存儲(chǔ)方法為:BGRAint 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; }

    ?

    說(shuō)明:

    • ImageProc.h頭文件可以通過(guò)jdk提供的工具javah來(lái)生成,詳細(xì)生成方法在下面
    • JNI中的定義的函數(shù)遵循必定的命名規(guī)則:Java_包名_類(lèi)名_方法名,詳細(xì)參考JNI編程相關(guān)知識(shí);
    • ImageProc.cpp中利用黑色值轉(zhuǎn)換為灰度值的計(jì)算公式,將lena.jpg圖像的每一個(gè)像素轉(zhuǎn)換為灰度值,并返回給應(yīng)用層。須要注意的是對(duì)于 ARGB_8888類(lèi)型的圖像而言,其每一個(gè)像素值在int型數(shù)據(jù)中的存儲(chǔ)序列為BGRA。 還須要注 ImageProc.cpp 這個(gè)文件 第10行的函數(shù)名稱(chēng)Java_包名_類(lèi)名_方法名 請(qǐng)修改成.h 文件生成的那個(gè)函數(shù)名?
    生成.h 文件


    1.首先當(dāng)年寫(xiě)完ImageProc.java 這個(gè)保存 當(dāng)前 eclipse會(huì)自動(dòng)幫你生成 java 的class文件

    ? ?你可以再工程目錄--》 bin --》classes -》com -------。。。。。 的文件里找到

    ? ?比如我的 在E:\work\op\OpenCV-2.4.5-android-sdk\samples\Test2\bin\classes\com\test2\test2 這個(gè)路徑下

    如圖


    2.將classes文件拷貝到e盤(pán)根目錄下

    然后打開(kāi) cmd?

    e:

    cd classes

    javah com.test2.test2.ImageProc

    然后就會(huì)在classes文件里找到一個(gè) xxx.的頭文件 如圖


    你可以將這個(gè)頭文件改成任意名字 比如我們上面的ImageProc.h 然后放入工程目錄的jni中


    編譯運(yùn)行方法有兩種

    1 配置eclipse自動(dòng)運(yùn)行

    第一步:轉(zhuǎn)換工程。點(diǎn)擊“文件 -> 新建 -> 其他”(快捷鍵:Ctrl+N)。選擇“C/C++”下的“Convert to a C/C++ Project(Adds C/C++ Nature)”。進(jìn) 入“下一步”。


    第二步:選中你剛才建的“HelloJni”工程,下面左邊選“Makefile project”右側(cè)選“Cygwin GCC”。肯定后提示的“透視圖”不清楚是什么,點(diǎn)擊“是”即可。

    第三步:在“HelloJni”工程上右鍵,選擇“屬性”。配置“C/C++ Build”和“C/C++ General -> Paths and Symbols”。

    C/C++ Build:點(diǎn)擊“C/C++ Build”,在右側(cè)的“Builder Settings”中去掉默許勾選的“Use default build command”復(fù)選框。設(shè)置Build command為“
    ${NDKROOT}/ndk-build.cmd "


    C/C++ General -> Paths and Symbols:在Includes下add新的GNU C依賴(lài)路徑。此“HelloJni”工程須要“D:\Java\android-ndk-r8\platforms\android-8\arch-arm\usr\include”即可,當(dāng)前根據(jù)不同項(xiàng)目選擇不同的依賴(lài)庫(kù)。


    這里只要是你cpp文件里面文件包含目錄

    你可以直接在NDK 和opencv jni那個(gè)目錄下搜索頭文件名 然后看看在那個(gè)路徑有

    配置好后運(yùn)行就行了

    ?


    2.手動(dòng)應(yīng)用Cygwin 生成os 然后運(yùn)行

    ?由于程序中涉及到了JNI編程,因此須要用cygwin對(duì)其中的C/C++代碼進(jìn)行編譯。打開(kāi)cygwin,進(jìn)入到工程的根目錄中執(zhí)行命令:$NDKROOT/ndk-build實(shí)現(xiàn)相關(guān)編譯;當(dāng)前在eclipse中刷新工程GrayProcess2,運(yùn)行即可。編譯及運(yùn)行結(jié)果分離如下所示。


    ? ??



    到這里兩種方法都結(jié)束了!


    有問(wèn)題請(qǐng)留言

    或者279291014@qq.com

    ?




    文章結(jié)束給大家分享下程序員的一些笑話語(yǔ)錄: Borland說(shuō)我很有前途,Sun笑了;Sun說(shuō)我很有錢(qián),IBM笑了;IBM說(shuō)我很專(zhuān)業(yè),Sybase笑了;Sybase說(shuō)我數(shù)據(jù)庫(kù)很牛,Oracle笑了;Oracle說(shuō)我是開(kāi)放的,Linux笑了;Linux說(shuō)我要打敗Unix,微軟笑了;微軟說(shuō)我的系統(tǒng)很穩(wěn)定,我們都笑了。

    總結(jié)

    以上是生活随笔為你收集整理的安装目录opencv for android 教程(环境搭建篇)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。