当前位置:文档之家› 《嵌入式系统开发技术》设计报告

《嵌入式系统开发技术》设计报告

嵌入式系统开发技术设计报告组长:成员:中国石油大学(华东)计算机与通信工程学院计算机科学系二0 年12 月一、引言OpenCV的全称是:Open Source Computer Vision Library。

OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。

它轻量级而且高效——由一系列C 函数和少量C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

它的应用领域非常广泛,包括人机互动、物体识别、图像分割、人脸识别、机器视觉、汽车安全驾驶等。

随着手机性能的不断提高,OpenCV往安卓上移植已经成为可能,安卓设备移植上OpenCV之后将能够进行复杂的图像处理和视频分析工作,人们不必拘泥于使用固定的设备进行图像以及视频的处理,从而增加了处理的灵活性。

本课程设计实现的就是OpenCV到安卓的移植以及在安卓上实现一个简单的图像处理应用。

Android应用程序是通过Android SDK(Software Development Kit)利用Java编程语言进行开发,同时也可以通过JNI调用C动态库,不过这种开发方式存在技术障碍,伴随着Android NDK(Native Development Kit)的问世,使得“JA V A+C”的开发方式走向成熟。

二、总体设计1、功能描述本课程设计分为以下四个模块,各模块功能介绍如下:Android-OpenCV项目:OpenCV中大部分重要API在该项目中已经封装成了JA V A接口,为安卓上的OpenCV开发提供C、C++函数支持。

Android NDK:它包括从C / C++生成原生代码库所需要的工具和build files,能够将一致的原生库嵌入可以在Android设备上部署的应用程序包文件(application packages files ,即.apk文件)中,支持所有未来Android平台的一些列原生系统头文件和库。

在本课程设计中担任重要角色,包括交叉编译OpenCV源代码、编译测试程序等。

Cygwin:Windows下模拟Linux操作环境,在其中执行NDK编译。

Eclipse:Android开发环境,开发android程序,生成可执行的.apk文件,连接真机或虚拟机进行调试。

2、设计特色本课程设计的特色在于成功的将android-opencv移植到eclipse开发环境中去,实现了在android设备开发图像处理、视频分析应用,提高了android设备的使用价值。

编译环境采用Android NDK+Cygwin,方便开发者在windows环境下开发“java+c”程序。

3、体系结构C代码开发环境:Java代码开发环境:三、详细设计1、Android NDK开发环境搭建(1)、NDK下载本课程设计使用的NDK版本是android-ndk-r4-crystax,这是一款面向android的编译工具,下载后解压,存放位置自己定义,我放在G盘根目录下。

(2)、Cygwin下载由于NDK编译代码时必须要用到make和gcc,所以必须搭建一个Linux环境,下载Cygwin,安装时要注意一下几点:安装目录最好不要放在有中文和空格的目录里;在选择需要下载的包时,由于不清楚各个包的用途,为了避免出错,所以选择了全部下载;由于是从国外站点下载资源,速度稍微有些慢,大约1~2个小时,期间应确保网络通畅。

安装后在系统环境变量Path中加入cygwin的bin和android-ndk-r4-crystax的路径,检测是否安装成功,打开Cygwin Terminal,在命令行输入“cygcheck -c cygwin”,会打印出当前cygwin的版本和运行状态,显示status是“OK”,则表示安装成功,否则需要重新安装。

下面需要配置NDK环境变量,配置文件为.bash_profile,我的文件目录是D:\cygwin\home\zhangyu\.bash_profile,在文件末尾添加“NDK=/cygdrive/< 你的盘符>/<android ndk 目录>”,为了区分该NDK版本,我写的是:ndk_r4=/cygdrive/g/android-ndk-r4-crystax export ndk_r4,“ndk_r4”这个名字是自己定义的,方便记忆。

保存后,关闭终端,重启,终端,可能会出现一下错误:导致这个错误的原因是使用了windows环境下的编辑环境,在Linux下存在不兼容的问题,在该文件目录下输入“dos2unix .bash_profile”,以Unix标准规范该文件即可消除错误。

输入“cd $ndk_r4”,如果跳到该目录下,则表明ndk环境变量配置成功。

下面对NDK所带的一个例子进行编译,如下图所示:编译后生成libhello-jni.so文件,将该工程导入eclipse,编译运行,结果如下:至此,Android NDK开发环境搭建完毕。

2、Android-OpenCV移植移植方法参照CSDN的一篇博文,下载Android-OpenCV源码包,存放到G盘根目录下,该源码包已经写好了交叉编译Opencv的Makefile文件和Opencv的Android Library Project,用于本课程设计,需要修改以下几个地方:(1)build.sh文件将“ndk-build”替换为“cygdrive/g/android-ndk-r4-crystax/ndk-build ”,用于明确所使用的ndk-build的具体路径。

(2)clean.sh文件同上。

将android-ndk-r4-crystax整个文件夹拷贝到D:\cygwin\home\zhangyu下,因为在opencv源码包中的local.env文件中指定的ANDROID_NDK_ROOT=$(HOME)/android-ndk-r4-crystax。

或者在此处更改NDK目录,总之目的就是正确的找到NDK工具所在目录。

下面编译Opencv,打开Cygwin终端,进入opencv目录,运行build.sh,编译大约持续30分钟,编译成功后,在android/libs/armeabi和armeabi-v7a两个文件夹下生成libandroid-opencv.so文件,用于Android开发的opencv 库文件生成成功。

打开eclipse,将android文件夹下的工程导入到eclipse工作空间中,导入后运行该工程,在虚拟机上无任何反应,eclipse控制台输出如下信息:下面运行opencv源码包自带的android应用,启动cygwin终端,进入例子程序CVCamera目录下:编译成功,将该工程导入eclipse,连接手机,选择在真机上运行,运行结果如下:表示androi-opencv移植成功,该eclipse开发环境具备了使用opencv进行android应用开发的功能。

3、Android-OpenCV应用实例我们自己开发了一个简单的图片处理的应用,功能是对彩色图片进行灰度处理和加入噪点处理。

新建android project,导入opencv库工程bin目录下的opencv.jar,这样新建的工程就可以调用java封装的opencv函数。

该工程用到了一个activity和一个layout,布局界面代码如下:Activity_main.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=""xmlns:tools=""android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent" ><Buttonandroid:id="@+id/btn_gray_process" <!--灰度处理按钮-->android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/str_grayproc"/><Buttonandroid:id="@+id/btn_salt_process" <!-- 加入噪点按钮-->android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/str_saltproc"/><Buttonandroid:id="@+id/btn_restore_process" <!-- 还原图片按钮-->android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/str_restoreproc"/><ImageViewandroid:id="@+id/image_view" <!-- 显示图片控件-->android:layout_width="wrap_content"android:layout_height="wrap_content"android:contentDescription="@string/str_desc"/></LinearLayout>Activity部分代码如下:public class MainActivity extends Activity implements OnClickListener{private Button gray; //灰度处理按钮private Button salt; //噪点按钮private Button restore; //还原按钮private ImageView imageView;private Bitmap bmp;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);gray = (Button) findViewById(R.id.btn_gray_process); //变量与xml文件中salt = (Button) findViewById(R.id.btn_salt_process); //的控件进行绑定restore = (Button) findViewById(R.id.btn_restore_process);imageView = (ImageView) findViewById(R.id.image_view);//将lena图像加载程序中并进行显示bmp = BitmapFactory.decodeResource(getResources(), R.drawable.lena);imageView.setImageBitmap(bmp); //为按钮点击事件设置监听器gray.setOnClickListener(this);salt.setOnClickListener(this);restore.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch(v.getId()) //根据被按下按钮的ID转到相应的处理函数{case R.id.btn_gray_process:graybmp();break;case R.id.btn_salt_process:saltbmp();break;case R.id.btn_restore_process:imageView.setImageBitmap(bmp);break;}}public void graybmp(){ //灰度处理函数int w = bmp.getWidth(); //获得图片的宽度,像素个数int h = bmp.getHeight(); //获得图片的高度,像素个数int[] pixels = new int[w*h]; //建立一个整形数组,大小为图片像素总数bmp.getPixels(pixels, 0, w, 0, 0, w, h);//获取图片的每一个像素值并存储到pixels数组中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); //建的位图}static{System.loadLibrary("ImageProc"); 加载本地库文件}}ImageProc 类,定义本地函数public class ImageProc {public static native int[] grayProc(int[] pixels, int w, int h); //灰度处理public static native int[] saltbmp(int[] pixels,int w,int h,int n); //加入噪点}仿照opencv自带的安卓例子,编写makefile和定义本地函数的.c文件。

相关主题