首页 > 代码库 > WINDOWS系统Eclipse+NDK+Android + OpenCv
WINDOWS系统Eclipse+NDK+Android + OpenCv
WINDOWS系统Eclipse+NDK+Android + OpenCv
参考文档博客
1 NDK环境搭建
http://jingyan.baidu.com/article/5d6edee22d908799eadeec9f.html
2 官方文档
Android.mk与Application.mk如何编写,OpenCV库如何调用
http://docs.opencv.org/trunk/doc/tutorials/introduction/android_binary_package/dev_with_OCV_on_Android.html#dev-with-ocv-on-android
3 OpenCv测试代码来源
http://www.verydemo.com/demo_c131_i131095.html
4 NDK OpenCv测试入门程序(有问题)
http://blog.csdn.net/pwh0996/article/details/8957764
5 NDK测试入门程序(有问题)
http://blog.csdn.net/redoffice/article/details/6654714
6 出现部分问题的解法
http://blog.csdn.net/houshunwei/article/details/17217695
?
目前Android平台下调用OpenCv库函数有两种方式:
1使用封装的OpenCV API开发android:这种方式调用Java的包中的类实现类似。
2 利用JNI接口通过NDK平台调用OpenCV API函数(这种方式比较普遍)。
本文将实现这两种方式的调用。
第一部分 准备工作:
1.1本文所使用的软件版本如下:
ADT版本:ADT-22.6.3 ,开发工具ADT(Android Development Tool),集成了最新的ADT和NDK插件以及Eclipse,还有一个最新版本SDK。解压之后就可以用了,下载地址http://developer.android.com/tools/sdk/ndk/index.html
NDK: android-ndk-r10, NDK插件:用于开发Android NDK的插件,ADT版本在20以上,就能安装NDK插件,另外NDK集成了CDT插件,NDK版本在r7以上之后就集成了Cygwin,而且还是十分精简版。下载链接见:http://developer.android.com/tools/sdk/ndk/index.html
OpenCV:OpenCV-2.4.4-android-sdk,下载地址http://opencv.org/downloads.html
?
1.2 配置NDK的环境变量
1.2.1解压NDK压缩包,配置环境变量。
将解压的地址写入环境变量PATH中。在命令提示符下输入ndk-build如果弹出如下的错误,而不是说ndk-build not found,就说明ndk环境已经安装成功了。特别提示一下,搜索引擎中会告诉一些早期的NDK版本的使用,是在命令提示符下输入build/host- setup.sh;但是NDK经过更新,这个文件已经没有了。只需要输入ndk-build就可以了。
Android NDK: Could not find application project directory !???
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.???
/home/braincol/workspace/android/android-ndk-r5/build/core/build-local.mk:85: *** Android NDK: Aborting??? .? Stop.
1.2.2 Eclipse配置NDK环境
打开Eclipse,点Window->Preferences->Android->NDK,设置NDK路径,例如当前的NDK版本是是E:\android-ndk-r10。
?
1.3 配置OpenCv
下载OpenCV-2.4.4-android-sdk解压出来,可以看到文件下有apk文件,doc文档,sample例子程序,以及OpenCV4Android-sdk。
其 中,OpenCV4Android-sdk目录即是我们开发opencv所需要的类库;samples目录中存放着若干opencv应用示例(包括人脸检测等),可为我们进行 android下的opencv开发提供参考;doc目录为opencv类库的使用说明及api文档等;而apk目录则存放着对应于各内核版本的。
?
1.3.1 安装OpenCV_Manager
????OpenCV_2.4.3.2_Manager_2.4应用安装包。此应用用来管理手机设备中的opencv类库,在运行opencv应用之前,必须确保手机中已经安装了OpenCV_2.4.4.4_Manager_2.6_*.apk,否则opencv应用将会因为无法加载opencv类库而无法运行。
可以根据自己的手机类型来安装OpenCV_2.4.4.4_Manager.apk.
通过查询自己的手机CPU信息
adb shell
cat /proc/cpuinfo
?
我的手机是arm v7 –neon 架构的,Android版本为4.4.4选择第3个,第四个是适用于低版本Android系统的手机。
安装完毕后,可以测试OpenCV_2.4.4.4_Manager.apk.是否正确。
在samples文件架中找个例子安装包,如example-15-puzzle.apk,安装到手机测试这个拼图游戏是否正常运行。
?
1.3.2 OpenCV4Android-sdk引入工作空间
(1) 将OpenCV4Android-sdk目录copy至后面的Android工程的工作空间;
(2)打开eclipse,将OpenCV-SDK引入到工作空间中,如下图所示:
?
第二部分 开始实战---使用封装的OpenCV API开发android(不通过jni接口)
?
1.1 创建工程
??????? (1) 打开eclipse,创建android应用工程API_OPENCV;
??????? (2) 将测试图像lena.jpg添加到资源目录res/drawable-hdpi中;
(2) 在手机的的SD卡根目录/sdcard上新建一个目录andimg ,放入图像img1.jpg
??????? (3) 在Package Explorer中选择项目API_OPENCV,单击右键在弹出菜单中选择Properties,然后在弹出的Properties窗口中左侧选择 Android,然后点击右下方的Add按钮,选择OpenCV Library 2.4.4并点击OK,操作完成后,会将OpenCV类库添加到API_OPENCV的Android Dependencies中,如下图所示:
?
1.2 工程代码:
?
(1)布局文件:main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${packageName}.${activityClass}" >
<Button
android:id="@+id/imagegray"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="图像灰度化" />
?
<ImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/imagegray"
android:layout_centerHorizontal="true"
android:layout_marginTop="86dp" />
</RelativeLayout>
?
(2) 在AndroidManifest.xml文件中加入
?
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission
android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
?
如图所示
?(3) MainActivity.java
?
package com.example.api_opencv;
?
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.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
?
public class MainActivity extends Activity {
?
???? ????private Button btngray;
???? private ImageView imageview;
???? private Bitmap bmp;
???? ?
???? //OpenCV类库加载并初始化成功后的回调函数,在此我们不进行任何操作
????????private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) {
???? @Override
???? public void onManagerConnected(int status) {
???? switch (status) {
???? case LoaderCallbackInterface.SUCCESS:
???? {
???? } break;
???? default:
???? {
???? super.onManagerConnected(status);
???? } break;
???? }
???? }
???? };
???? ?
????????@SuppressLint("SdCardPath")
????????@Override
????????protected void onCreate(Bundle savedInstanceState) {
????????????super.onCreate(savedInstanceState);
????????????setContentView(R.layout.activity_main);
????????????this.setTitle("Android API OpenCV");
????????????btngray = (Button)findViewById(R.id.imagegray);
???? imageview = (ImageView)this.findViewById(R.id.imageview);
???? bmp=BitmapFactory.decodeFile("/sdcard/andimg/img2.jpg");
???? imageview.setImageBitmap(bmp);
?
???? btngray.setOnClickListener(new OnClickListener() {????
????????????????@Override
????????????????public void onClick(View v) {
???????? Mat rgbMat = new Mat();
???????? Mat grayMat = new Mat();
???????? //获取lena彩色图像所对应的像素数据
???????? Utils.bitmapToMat(bmp, rgbMat);
???????? //将彩色图像数据转换为灰度图像数据并存储到grayMat中
???????? Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY);
???????? //创建一个灰度图像
???????? Bitmap grayBmp = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), Config.RGB_565);
???????? //将矩阵grayMat转换为灰度图像
???????? Utils.matToBitmap(grayMat, grayBmp);
???????? imageview.setImageBitmap(grayBmp);
????????????????}
????????????});
???? ?
????????}
?
????????@Override
???? public void onResume()
???? {
???? //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是
???? //OpenCV_2.4.4_Manager_2.4_*.apk程序包,存在于OpenCV安装包的apk目录中
???? super.onResume();
???? OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_4, this, mOpenCVCallBack);
???? }
?
}
1.3 运行结果