opencv for android 教程(环境搭建篇) | 少将全栈
  • 欢迎访问少将全栈,学会感恩,乐于付出,珍惜缘份,成就彼此、推荐使用最新版火狐浏览器和Chrome浏览器访问本网站。
  • 吐槽,投稿,删稿,交个朋友
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏少将全栈吧

opencv for android 教程(环境搭建篇)

点滴 admin 9年前 (2015-08-15) 2502次浏览 已收录 扫描二维码

原文地址:http://blog.csdn.net/pwh0996/article/details/8957764

前言:

   最近android开发异常火热,随着手机性能越来越高,图像处程序也越来越重要,
由于opencv for android 网上教程大多为英文文档,中文教程都为零星篇章,
很少有完整的opencv for android 教程
博主最近正在学习opencv for android 其中走了很多弯路
所以将一些经验写下 帮助大家少走弯路!
只适合初学者 请大神指正,或者绕道吧,走好不送!
注意本文只负责环境的搭建 不负责讲解
按照文章来确保能搭建一个完美的opencv for android 的开发环境
   但是具体的理解 需要读者自己尝试和摸索!

准备工具:

  • win7/win8 环境我是win8环境
  • 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


android环境搭建:

参考1:点击打开链接

java SDK安装:

如果你还没有JDK的话,可以去这里下载,接下来的工作就是安装提示一步一步走。设置环境变量步骤如下:

  1. 我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量:
  2. JAVA_HOME值为: D:Program FilesJavajdk1.6.0_18(你安装JDK的目录
  3. CLASSPATH值为:.;%JAVA_HOME%lib ools.jar;%JAVA_HOME%libdt.jar;%JAVA_HOME%in;
  4. Path:  在开始追加 %JAVA_HOME%in;
  5. NOTE:前面四步设置环境变量对搭建Android开发环境不是必须的,可以跳过。

安装完成之后,可以在检查JDK是否安装成功。打开cmd窗口,输入java ?version 查看JDK的版本信息。出现类似下面的画面表示安装成功了:

opencv for android 教程(环境搭建篇)

eclipse 安装:

   1.下载
2.解压到任意目录
3.去目录启动
4.设置工作路径
5.安装完成

Android SDK安装:

Android Developers下载android-sdk_r05-windows.zip,下载完成后解压到任意路径。

  • 运行SDK Setup.exe,点击Available Packages。如果没有出现可安装的包,请点击Settings,选中Misc中的”Force https://…”这项,再点击Available Packages 。
  • 选择希望安装的SDK及其文档或者其它包,点击Installation Selected、Accept All、Install Accepted,开始下载安装所选包
  • 在用户变量中新建PATH值为:Android SDK中的tools绝对路径(本机为D:AndroidDevelopandroid-sdk-windows ools)。
opencv for android 教程(环境搭建篇)

进入cmd命令窗口,检查SDK是不是安装成功。 
运行 android ?h 如果有类似以下的输出,表明安装成功:
opencv for android 教程(环境搭建篇)

ADT插件安装:

ADT是专门给eclipse开发android的插件
  • 打开 Eclipse IDE,进入菜单中的 “Help” -> “Install New Software”
  • 点击Add…按钮,弹出对话框要求输入Name和Location:Name自己随便取,Location输入http://dl-ssl.google.com/android/eclipse。如下图所示:

opencv for android 教程(环境搭建篇)



确定返回后,在work with后的下拉列表中选择我们刚才添加的ADT,我们会看到下面出有Developer
Tools,展开它会有Android DDMS和Android Development Tool,勾选他们。 如下图所示:

opencv for android 教程(环境搭建篇)

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

完成之后:

  • 选择Window > Preferences…
  • 在左边的面板选择Android,然后在右侧点击Browse…并选中SDK路径,本机为: 
    D:AndroidDevelopandroid-sdk-windows
  • 点击Apply、OK。配置完成。

创建android AVD模拟器:

android AVD模拟器是一个android的虚拟机用来在pc机上调试android程序用的!
至于如何创建 这里就不说了 因为我使用真机调试所以没有用这个
以上 android 的开发环境就搭建完毕了 如果有任何问题请自行google,这个资料太多了!
总会有一个适合你

NDK + Cygwin 环境搭建:

参考1:点击打开链接
参考2:点击打开链接

安装Android NDK:

1.下载Android NDK 我下载的是 r8版本 地址就不给除了 自己google吧
2.解压到任意目录 我解压的目录是e:/IDE/ 下
3.完成

安装Cygwin:

Cygwin 是一个将c++代码编译成os动态库的东西, 而os库就可以给java调用了
这里可能你有疑惑 opencv for android 不是有java的API了么 怎么还要用c++
嗯 只能说JAVA的API还不是很全面 有些东西还是会用到c++的API才行
所以这个是必须的
还有一些有说NDK r8 不需要Cygwin了 但是我不知道怎么弄 我目前还是使用这个的

由于NDK开发大都涉及到C/C++在GCC环境下编译、运行,所以在Windows环境下,需要模拟Linux模拟编译环境,下载地址:

http://www.cygwin.com/

下载后是个setup.exe文件,使用过程如下:

第一步:运行setup程序,第一步图略,直接点击Next进入下一步。

第二步:选择安装方式,第一次可以采用Direct Connection在线下载安装,如有现成的离线包,可以选择离线安装(Install from Local Directory)。opencv for android 教程(环境搭建篇)

第四步:设置本地包暂存路径

暂存目录默认是放到setup.exe的同级目录下,下载后名字类似ftp%3a%2f%2fcygwin.mirrors.pair.com%2f这样格式。

opencv for android 教程(环境搭建篇)

第五步:设置网络连接方式

opencv for android 教程(环境搭建篇)

第六步:选择下载站点地址

起初尝试几个看哪个速度快就用哪个地址(如果感觉不快就点取消,再次来过)。

opencv for android 教程(环境搭建篇)


第七步:等待加载安装项载入,选择安装项

我们编译NDK,在默认设置下,只需选择Devel(点击列表中Devel,将后面的Default改为Install,图中箭头所示),其它均为默认状态。

opencv for android 教程(环境搭建篇)

第八步:等待下载完成

下载完成时间决定于你选择的安装包数量及网络连接速度,比如按照本文默认的选择方式,可能需要4-5个小时,下载后压缩包约750M,下载完成后会自动安装到上文设置的安装目录。

opencv for android 教程(环境搭建篇)

提醒:第一次下载完成后,最好把下载的包目录做个备份,下次安装同样的环境可以直接使用离线安装方式(第二步中选择本地安装)。

安装完成后,先运行Cygwin一次(Cygwin.bat),以便创建一些用户环境文件,分别输入:

make -v

和,

gcc -v

如果检测成功,会有make和gcc相关版本信息打印出来,如下图。

opencv for android 教程(环境搭建篇)

可以在cygwin中通过vim修改,也可以在windows安装目录中修改 home<你的用户名>.bash_profile 文件中最后添加环境变量

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

export NDKROOT

其中NDK=/cygdrive/<你的盘符>/<android ndk 目录> ,”NDK”这个名字随便起,以后经常用不要太长。

重启cygwin,输入:

cd $NDK

可进入ndk对应目录说明设置OK。

3.用ls命令查看libs/armeabi/下是否生成了so文件,有libhello-jni.so说明ndk运行正常。
$ ls libs/armeabi/
gdb.setup gdbserver libhello-jni.so
也可以到E:androidandroid-ndk-r8sampleshello-jnilibsarmeabi目录下看有没有生成的.so文件。

opencv for android 教程(环境搭建篇)

2)导入NDK的hello-jni示例到Eclipse中
1.在Eclipse中新建一个Android工程HelloJni。
在Create Android Project时勾选“Create project from existing source”,Location中填E:androidandroid-ndk-r8sampleshello-jni

opencv for android 教程(环境搭建篇)

opencv for android 教程(环境搭建篇)

2.直接以Android Aplication运行com.example.hellojni.HelloJni项目。要先有.so文件才能运行起来。 os放在工程根目录下

opencv for android 教程(环境搭建篇)

CDT插件的安装:

CDT是eclipse开发c++用的插件
CDT插件可以在一个工程中同时开发基于C/C++的Native代码和基于Java的代码,加上Sequoyah插件可以一次编译两部分代码。下载地址:http://www.eclipse.org/cdt/downloads.php
不同eclipse版本要下载对应的包,否则安装不了。
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:这个是CDT的离线安装包。(由于文件比较大推荐使用离线包,7.0.2的54.8M,8.1.1的103MB)
安装:Eclipse -> Help -> Install New Software,点击add。
Name:CDT_版本。
Location:点击Archive,定位到下载的“cdt-master-7.0.2.zip”文件。

如果Location的下面出现“Duplicate location”错误,请到Window -> preferences -> Install/Update -> Avaliable Software Site中找到remove掉。
如果出现缺少eclipse包说明你下载的版本和eclipse版本不匹配,重新下载匹配的重新安装就可以了。

opencv for android 教程(环境搭建篇)


另外需要重启eclipse后才生效。
安装完成重启后,在Eclispe中新建一个项目,如果出现了C/C++项目,则表明CDT插件安装成功了。
opencv for android 教程(环境搭建篇)

安装Sequoyah插件:

Sequoyah插件用于设置Android工程对Native开发的支持。
官方网址:http://www.eclipse.org/sequoyah/downloads/
打开上面网址就可以看到具体的安装说明了
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的没有出来“本机开发”的配置所以没法用,本人重新安装了2.0的可以了,这个应该直接安装最新版2.0的就可以了。
在安装界面不要勾选“Group items by category”复选框,选中出现了列表为空(There are no categorized items)的情况。

在“window ?> preferences ->Android -> 本机开发”中添加NDK的路径。

opencv for android 教程(环境搭建篇)

这个插件安装后也需要重启eclipse的
重启后右键之前建立的“HelloJni”项目,在“Android Tools”选项中包含“Add Native Support…”选项即成功。

opecnv for android 开发环境搭建:

参考1:点击打开链接
参考2:点击打开链接

opencv for android SDK 安装:

进入官网(http://opencv.org/)下载OpenCV4Android并解压,其目录结构如下:

opencv for android 教程(环境搭建篇)

其中,sdk目录即是我们开发opencv所需要的类库;samples目录中存放着若干opencv应用示例(包括人脸检测等),可为我们进行android下的opencv开发提供参考;doc目录为opencv类库的使用说明及api文档等;而apk目录则存放着对应于各内核版本的OpenCV_2.4.3.2_Manager_2.4应用安装包。此应用用来管理手机设备中的opencv类库,在运行opencv应用之前,必须确保手机中已经安装了OpenCV_2.4.3.2_Manager_2.4_*.apk,否则opencv应用将会因为无法加载opencv类库而无法运行。

2.2 将SDK引入工作空间

        (1) 选择一个路径,新建文件夹做为工作空间(我在E盘根目录下新建workspace目录来做为工作空间);

        (2) 将OpenCV-2.4.3.2-android-sdk中的sdk目录copy至工作空间,并将其更名为OpenCV-SDK(是否更改名称无所谓,这是我个人习惯而已);

        (3) 以新建的目录为工作空间,打开eclipse;

        (4) 将OpenCV-SDK引入到工作空间中,如下图所示:

opencv for android 教程(环境搭建篇)


opencv for android 教程(环境搭建篇)


opencv for android 教程(环境搭建篇)


opencv for android 教程(环境搭建篇)

使用java API开发android:

创建工程

        (1) 打开eclipse,创建android应用工程GrayProcess;

        (2) 将测试图像lena.jpg添加到资源目录res/drawable-hdpi中;

        (3) 在Package Explorer中选择项目GrayProcess,单击右键在弹出菜单中选择Properties,然后在弹出的Properties窗口中左侧选择Android,然后点击右下方的Add按钮,选择OpenCV Library 2.4.3并点击OK,操作完成后,会将OpenCV类库添加到GrayProcess的Android Dependencies中,如下图所示:

opencv for android 教程(环境搭建篇)



opencv for android 教程(环境搭建篇)


opencv for android 教程(环境搭建篇)


工程代码:

(1) 字符串资源文件:strings.xml
[html] view
plain
copy

  1. <resources>  
  2.   
  3.     <string name=“app_name”>GrayProcess</string>  
  4.     <string name=“hello_world”>Hello world!</string>  
  5.     <string name=“menu_settings”>Settings</string>  
  6.     <string name=“title_activity_main”>MainActivity</string>  
  7.     <string name=“str_proc”>gray process</string>  
  8.     <string name=“str_desc”>image description</string>  
  9.   
  10. </resources>  

(2) 布局文件:main.xml

[html] view
plain
copy

  1. <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android&#8221;  
  2.     xmlns:tools=http://schemas.android.com/tools&#8221;  
  3.     android:orientation=“vertical”  
  4.     android:layout_width=“match_parent”  
  5.     android:layout_height=“match_parent” >  
  6.       
  7.     <Button   
  8.         android:id=“@+id/btn_gray_process”  
  9.         android:layout_width=“fill_parent”  
  10.         android:layout_height=“wrap_content”  
  11.         android:text=“@string/str_proc”/>  
  12.       
  13.     <ImageView  
  14.         android:id=“@+id/image_view”  
  15.         android:layout_width=“wrap_content”  
  16.         android:layout_height=“wrap_content”  
  17.         android:contentDescription=“@string/str_proc”/>  
  18.   
  19. </LinearLayout>  

  (3) MainActivity.java

[java] view
plain
copy

  1. package com.iron.grayprocess;  
  2.   
  3. import org.opencv.android.BaseLoaderCallback;  
  4. import org.opencv.android.LoaderCallbackInterface;  
  5. import org.opencv.android.OpenCVLoader;  
  6. import org.opencv.android.Utils;  
  7. import org.opencv.core.Mat;  
  8. import org.opencv.imgproc.Imgproc;  
  9.   
  10. import android.os.Bundle;  
  11. import android.app.Activity;  
  12. import android.graphics.Bitmap;  
  13. import android.graphics.BitmapFactory;  
  14. import android.graphics.Bitmap.Config;  
  15. import android.view.View;  
  16. import android.view.View.OnClickListener;  
  17. import android.widget.Button;  
  18. import android.widget.ImageView;  
  19.   
  20. public class MainActivity extends Activity implements OnClickListener{  
  21.   
  22.     private Button btnProc;  
  23.     private ImageView imageView;  
  24.     private Bitmap bmp;  
  25.       
  26.     //OpenCV类库加载并初始化成功后的回调函数,在此我们不进行任何操作  
  27.     private BaseLoaderCallback  mLoaderCallback = new BaseLoaderCallback(this) {  
  28.         @Override  
  29.         public void onManagerConnected(int status) {  
  30.             switch (status) {  
  31.                 case LoaderCallbackInterface.SUCCESS:{  
  32.                 } break;  
  33.                 default:{  
  34.                     super.onManagerConnected(status);  
  35.                 } break;  
  36.             }  
  37.         }  
  38.     };  
  39.       
  40.     @Override  
  41.     public void onCreate(Bundle savedInstanceState) {  
  42.         super.onCreate(savedInstanceState);  
  43.         setContentView(R.layout.main);  
  44.         btnProc = (Button) findViewById(R.id.btn_gray_process);  
  45.         imageView = (ImageView) findViewById(R.id.image_view);  
  46.         //将lena图像加载程序中并进行显示  
  47.         bmp = BitmapFactory.decodeResource(getResources(), R.drawable.lena);  
  48.         imageView.setImageBitmap(bmp);  
  49.         btnProc.setOnClickListener(this);  
  50.     }  
  51.   
  52.     @Override  
  53.     public void onClick(View v) {  
  54.         Mat rgbMat = new Mat();  
  55.         Mat grayMat = new Mat();  
  56.         //获取lena彩色图像所对应的像素数据  
  57.         Utils.bitmapToMat(bmp, rgbMat);  
  58.         //将彩色图像数据转换为灰度图像数据并存储到grayMat中  
  59.         Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY);  
  60.         //创建一个灰度图像  
  61.         Bitmap grayBmp = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), Config.RGB_565);  
  62.         //将矩阵grayMat转换为灰度图像  
  63.         Utils.matToBitmap(grayMat, grayBmp);  
  64.         imageView.setImageBitmap(grayBmp);  
  65.     }  
  66.       
  67.     @Override  
  68.     public void onResume(){  
  69.         super.onResume();  
  70.         //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是  
  71.         //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存在于OpenCV安装包的apk目录中  
  72.         OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);  
  73.     }  
  74. }  

3.1.3 运行结果

opencv for android 教程(环境搭建篇)opencv for android 教程(环境搭建篇) 
     


使用 c++ API开发android:

创建工程       

        步骤如工程一,创建新工程GrayProcess2,将lena.jpg添加到资源文件,并按上面所示将opencv类库添加到工程中。

编写上层代码(java)

(1)Stings.xml

[html] view
plain
copy

  1. <resources>  
  2.     <string name=“app_name”>GrayProcess2</string>  
  3.     <string name=“hello_world”>Hello world!</string>  
  4.     <string name=“menu_settings”>Settings</string>  
  5.     <string name=“title_activity_main”>GrayProcess2</string>  
  6.     <string name=“str_proc”>gray process</string>  
  7.     <string name=“str_desc”>image description</string>  
  8. </resources>  

(2)main.xml

[html] view
plain
copy

  1. <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android&#8221;  
  2.     xmlns:tools=http://schemas.android.com/tools&#8221;  
  3.     android:orientation=“vertical”  
  4.     android:layout_width=“match_parent”  
  5.     android:layout_height=“match_parent” >  
  6.       
  7.     <Button   
  8.         android:id=“@+id/btn_gray_process”  
  9.         android:layout_width=“fill_parent”  
  10.         android:layout_height=“wrap_content”  
  11.         android:text=“@string/str_proc”/>  
  12.       
  13.     <ImageView  
  14.         android:id=“@+id/image_view”  
  15.         android:layout_width=“wrap_content”  
  16.         android:layout_height=“wrap_content”  
  17.         android:contentDescription=“@string/str_proc”/>  
  18.   
  19. </LinearLayout>  

(3)MainActivity.java

[java] view
plain
copy

  1. package com.iron.grayprocess2;  
  2.   
  3. import org.opencv.android.BaseLoaderCallback;  
  4. import org.opencv.android.LoaderCallbackInterface;  
  5. import org.opencv.android.OpenCVLoader;  
  6. import android.os.Bundle;  
  7. import android.app.Activity;  
  8. import android.graphics.Bitmap;  
  9. import android.graphics.BitmapFactory;  
  10. import android.graphics.Bitmap.Config;  
  11. import android.view.View;  
  12. import android.view.View.OnClickListener;  
  13. import android.widget.Button;  
  14. import android.widget.ImageView;  
  15.   
  16. public class MainActivity extends Activity implements OnClickListener{  
  17.   
  18.     private Button btnProc;  
  19.     private ImageView imageView;  
  20.     private Bitmap bmp;  
  21.       
  22.     //OpenCV类库加载并初始化成功后的回调函数,在此我们不进行任何操作  
  23.      private BaseLoaderCallback  mLoaderCallback = new BaseLoaderCallback(this) {  
  24.         @Override  
  25.         public void onManagerConnected(int status) {  
  26.             switch (status) {  
  27.                 case LoaderCallbackInterface.SUCCESS:{  
  28.                     System.loadLibrary(“image_proc”);  
  29.                 } break;  
  30.                 default:{  
  31.                     super.onManagerConnected(status);  
  32.                 } break;  
  33.             }  
  34.         }  
  35.     };  
  36.       
  37.     @Override  
  38.     public void onCreate(Bundle savedInstanceState) {  
  39.         super.onCreate(savedInstanceState);  
  40.         setContentView(R.layout.main);  
  41.         btnProc = (Button) findViewById(R.id.btn_gray_process);  
  42.         imageView = (ImageView) findViewById(R.id.image_view);  
  43.         //将lena图像加载程序中并进行显示  
  44.          bmp = BitmapFactory.decodeResource(getResources(), R.drawable.lena);  
  45.         imageView.setImageBitmap(bmp);  
  46.         btnProc.setOnClickListener(this);  
  47.     }  
  48.   
  49.     @Override  
  50.     public void onClick(View v) {  
  51.            
  52.         int w = bmp.getWidth();  
  53.         int h = bmp.getHeight();  
  54.         int[] pixels = new int[w*h];       
  55.         bmp.getPixels(pixels, 0, w, 00, w, h);  
  56.         int[] resultInt = ImageProc.grayProc(pixels, w, h);  
  57.         Bitmap resultImg = Bitmap.createBitmap(w, h, Config.ARGB_8888);  
  58.         resultImg.setPixels(resultInt, 0, w, 00, w, h);  
  59.         imageView.setImageBitmap(resultImg);      
  60.     }  
  61.       
  62.     @Override  
  63.     public void onResume(){  
  64.         super.onResume();  
  65.         //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是  
  66.         //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存在于OpenCV安装包的apk目录中  
  67.         OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);  
  68.     }  
  69. }  

 代码第28行:System.loadLibrary(“image_proc”)用来当OpenCV类库初始化完成后加载类库image_proc。此类库由我们来生成,用于完成图像灰度处理的操作,此部分将在下面中说明。

  (4) ImageProc.java

[java] view
plain
copy

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

 ImageProc.java中只定义了方法grayProc,关键字native表明,此方法的实现由本地代码(C/C++)来完成。

编写JNI及C相关代码

        在项目中新建目录jni,在jni目录中分别添加文件Android.mk,Application.mk,ImageProc.h,ImageProc.cpp,这四个文件的内容分别如下所示。

        (1) Android.mk

[plain] view
plain
copy

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

代码说明:

第一行:指明当前编译路径;

第二行:清空变量;

第三行:将OpenCV类库中的编译文件包含进来,如此一来在我们的工程中即可使用OpenCV类库;

第四行:指定需要编译的C++源文件;

第五行:指定编译生成的类库名称;

第六行:调用命令将源文件编译为静态库。

注:第三行指定的路径很关键,当opencv类库与工程路径相关位置发生改变时,此路径也要随之改变。

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

[plain] view
plain
copy

  1. APP_STL := gnustl_static  
  2. APP_CPPFLAGS := -frtti -fexceptions  
  3. APP_ABI := armeabi-v7a  
  4. APP_PLATFORM := android-8  

(3)ImageProc.cpp

  1. #include <ImageProc.h>  
  2. #include <opencv2/core/core.hpp>  
  3. #include <string>  
  4. #include <vector>  
  5.   
  6. using namespace cv;  
  7. using namespace std;  
  8.   
  9. JNIEXPORT jintArray JNICALL Java_com_iron_grayprocess2_ImageProc_grayProc(JNIEnv* env, jclass obj, jintArray buf, jint w, jint h){  
  10.     jint *cbuf;  
  11.     cbuf = env->GetIntArrayElements(buf, false);  
  12.     if(cbuf == NULL){  
  13.         return 0;  
  14.     }  
  15.   
  16.     Mat imgData(h, w, CV_8UC4, (unsigned char*)cbuf);  
  17.   
  18.     uchar* ptr = imgData.ptr(0);  
  19.     for(int i = 0; i < w*h; i ++){  
  20.         //计算公式:Y(亮度) = 0.299*R + 0.587*G + 0.114*B  
  21.         //对于一个int四字节,其彩色值存储方式为:BGRA  
  22.         int grayScale = (int)(ptr[4*i+2]*0.299 + ptr[4*i+1]*0.587 + ptr[4*i+0]*0.114);  
  23.         ptr[4*i+1] = grayScale;  
  24.         ptr[4*i+2] = grayScale;  
  25.         ptr[4*i+0] = grayScale;  
  26.     }  
  27.   
  28.     int size=w * h;  
  29.     jintArray result = env->NewIntArray(size);  
  30.     env->SetIntArrayRegion(result, 0, size, cbuf);  
  31.     env->ReleaseIntArrayElements(buf, cbuf, 0);  
  32.     return result;  
  33. }  

说明:

  •         ImageProc.h头文件可以通过jdk提供的工具javah来生成,具体生成方法在下面
  •         JNI中的定义的函数遵循一定的命名规则:Java_包名_类名_方法名,具体参考JNI编程相关知识;
  •         ImageProc.cpp中利用彩色值转换为灰度值的计算公式,将lena.jpg图像的每个像素转换为灰度值,并返回给应用层。需要注意的是对于ARGB_8888类型的图像而言,其每一个像素值在int型数据中的存储序列为BGRA。
    还需要注ImageProc.cpp 这个文件 第10行的函数名称Java_包名_类名_方法名 请修改成.h 文件生成的那个函数名 

生成.h 文件

1.首先当年写完ImageProc.java 这个保存 以后 eclipse会自动帮你生成 java 的class文件

   你可以再工程目录–》 bin –》classes -》com ——-。。。。。 的文件里找到

   比如我的 在E:workopOpenCV-2.4.5-android-sdksamplesTest2inclassescom est2 est2 这个路径下

如图

2.将classes文件拷贝到e盘根目录下

然后打开 cmd 

e:

cd classes

javah com.test2.test2.ImageProc

然后就会在classes文件里找到一个 xxx.的头文件 如图

———————————————————————————————————————-

上述是将整个classes文件拷贝到E盘根目录,事实上不必这样,参见下面这篇文章:http://www.cnblogs.com/fww330666557/archive/2012/12/14/2817387.html错误:
找不到 ’fingerveinutility.JNInterface’ 的类文件。

打开命令行cmd,到达bin目录:

F:fwwworkspaceTestJNIin>

输入如下命令:

F:fwwworkspaceTestJNIin>javah -d header -classpath classes -jni com.YCan.testjni.MainActivity

 

java的命令我也不熟,这个命令的含义这里简单解释下:

-d header   表示将在当前目录下生成一个header文件夹,产生的头文件就在这里面了;

-classpath classes 指明类所在的位置

-jni com.YCan.testjni.MainActivity  指定类名

 

注意:要区分大小写。

———————————————————————————————————————-

你可以将这个头文件改成任意名字 比如我们上面的ImageProc.h 然后放入工程目录的jni中

编译运行方法有两种

1 配置eclipse自动运行

第一步:转换工程。点击“文件 -> 新建 -> 其他”(快捷键:Ctrl+N)。选择“C/C++”下的“Convert to a C/C++ Project(Adds C/C++ Nature)”。进 入“下一步”。

———————————————————————————————————————-

这里,一定!!!!不能!!!!右键Project->Android tools->add navive support,否则会导致无法编译

———————————————————————————————————————-

opencv for android 教程(环境搭建篇)


第二步:选中你刚才建的“HelloJni”工程,下面左边选“Makefile project”右边选“Cygwin GCC”。确定后提示的“透视图”不清楚是什么,点击“是”即可。

opencv for android 教程(环境搭建篇)

第三步:在“HelloJni”工程上右键,选择“属性”。配置“C/C++ Build”和“C/C++ General -> Paths and Symbols”。

C/C++ Build:点击“C/C++ Build”,在右边的“Builder Settings”中去掉默认勾选的“Use default build command”复选框。设置Build command为“
${NDKROOT}/ndk-build.cmd ”

C/C++ General -> Paths and Symbols:在Includes下add新的GNU C依赖路径。此“HelloJni”工程需要“D:Javaandroid-ndk-r8platformsandroid-8arch-armusrinclude”即可,以后根据不同项目选择不同的依赖库。

___________________________________________________________________________________________________________

${NDKROOT}/platforms/android-9/arch-arm/usr/include
${NDKROOT}/sources/cxx-stl/gnu-libstdc++/4.6/include
${NDKROOT}/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include
${ProjDirPath}/../sdk/native/jni/include    //如果sdk目录与project同在workspace目录里,本文中的即用此

${ProjDirPath}/../../sdk/native/jni/include
 //如果sdk目录跟workspace同级,比如自带的sdk目录和simple目录下的工程

特别是下句,Opencv教程里面没有下面这个,导致resize memset,memccpy,memchr,memcmp等无法识别,请见http://blog.csdn.net/donglynn/article/details/25242459

F:android-ndk-r9b oolchainsarm-linux-androideabi-4.8prebuiltwindowslibgccarm-linux-androideabi4.8include

其中,eclipse ->windows->prefrences->c/c++->build->envirenment里新建NDKROOT指向NDK绝对目录。

___________________________________________________________________________________________________________

这里只要是你cpp文件里头文件包含目录

你可以直接在NDK 和opencv jni那个目录下搜索头文件名 然后看看在那个路径有

配置好后运行就行了

2.手动使用Cygwin 生成os 然后运行

 由于程序中涉及到了JNI编程,因此需要用cygwin对其中的C/C++代码进行编译。打开cygwin,进入到工程的根目录中执行命令:$NDKROOT/ndk-build完成相关编译;之后在eclipse中刷新工程GrayProcess2,运行即可。编译及运行结果分别如下所示。
opencv for android 教程(环境搭建篇)

opencv for android 教程(环境搭建篇)    opencv for android 教程(环境搭建篇)

到这里两种方法都结束了!

喜欢 (0)
[🍬谢谢你请我吃糖果🍬🍬~]
分享 (0)
关于作者:
少将,关注Web全栈开发、项目管理,持续不断的学习、努力成为一个更棒的开发,做最好的自己,让世界因你不同。