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

上传人:b****3 文档编号:24797150 上传时间:2023-06-01 格式:DOCX 页数:15 大小:513.28KB
下载 相关 举报
《嵌入式系统开发技术》设计报告.docx_第1页
第1页 / 共15页
《嵌入式系统开发技术》设计报告.docx_第2页
第2页 / 共15页
《嵌入式系统开发技术》设计报告.docx_第3页
第3页 / 共15页
《嵌入式系统开发技术》设计报告.docx_第4页
第4页 / 共15页
《嵌入式系统开发技术》设计报告.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

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

《《嵌入式系统开发技术》设计报告.docx》由会员分享,可在线阅读,更多相关《《嵌入式系统开发技术》设计报告.docx(15页珍藏版)》请在冰豆网上搜索。

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

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

 

嵌入式系统开发技术

设计报告

 

组长:

成员:

 

中国石油大学(华东)计算机与通信工程学院计算机科学系

二0年12月

设计名称

OpenCV在Android环境下的移植与应用

完成时间

20**年12月

验收时间

20**年12月

本组成员情况

姓名

学号

承担的任务

成绩

71216

制定计划,项目进度安排,移植OpenCV到android,开发OpenCV在安卓中的应用

71309

搜集资料,学习Opencv程序设计,开发OpenCV在安卓中的应用

71214

配置安卓开发环境,学习安卓中jni的使用方法,开发OpenCV在安卓中的应用

 

1、引言

OpenCV的全称是:

OpenSourceComputerVisionLibrary。

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

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

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

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

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

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

2、总体设计

1、功能描述

本课程设计分为以下四个模块,各模块功能介绍如下:

Android-OpenCV项目:

OpenCV中大部分重要API在该项目中已经封装成了JAVA接口,为安卓上的OpenCV开发提供C、C++函数支持。

AndroidNDK:

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

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

Cygwin:

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

Eclipse:

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

2、设计特色

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

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

3、

体系结构

 

C代码开发环境:

 

Java代码开发环境:

 

3、详细设计

1、AndroidNDK开发环境搭建

(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的路径,检测是否安装成功,打开CygwinTerminal,在命令行输入“cygcheck-ccygwin”,会打印出当前cygwin的版本和运行状态,显示status是“OK”,则表示安装成功,否则需要重新安装。

下面需要配置NDK环境变量,配置文件为.bash_profile,我的文件目录是D:

\cygwin\home\zhangyu\.bash_profile,在文件末尾添加“NDK=/cygdrive/< 你的盘符 >/”,为了区分该NDK版本,我写的是:

ndk_r4=/cygdrive/g/android-ndk-r4-crystaxexportndk_r4,“ndk_r4”这个名字是自己定义的,方便记忆。

保存后,关闭终端,重启,

终端,可能会出现一下错误:

导致这个错误的原因是使用了windows环境下的编辑环境,在Linux下存在不兼容的问题,在该文件目录下输入“dos2unix.bash_profile”,以Unix标准规范该文件即可消除错误。

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

下面对NDK所带的一个例子进行编译,如下图所示:

编译后生成libhello-jni.so文件,将该工程导入eclipse,编译运行,结果如下:

 

至此,AndroidNDK开发环境搭建完毕。

2、Android-OpenCV移植

移植方法参照CSDN的一篇博文,下载Android-OpenCV源码包,存放到G盘根目录

下,该源码包已经写好了交叉编译Opencv的Makefile文件和Opencv的AndroidLibraryProject,用于本课程设计,需要修改以下几个地方:

(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应用实例

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

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

该工程用到了一个activity和一个layout,布局界面代码如下:

Activity_main.xml

xmlversion="1.0"encoding="utf-8"?

>

android=""

xmlns:

tools=""

android:

orientation="vertical"

android:

layout_width="match_parent"

android:

layout_height="match_parent">

android:

id="@+id/btn_gray_process"

--灰度处理按钮-->

android:

layout_width="fill_parent"

android:

layout_height="wrap_content"

android:

text="@string/str_grayproc"/>

android:

id="@+id/btn_salt_process"

--加入噪点按钮-->

android:

layout_width="fill_parent"

android:

layout_height="wrap_content"

android:

text="@string/str_saltproc"/>

android:

id="@+id/btn_restore_process"

--还原图片按钮-->

android:

layout_width="fill_parent"

android:

layout_height="wrap_content"

android:

text="@string/str_restoreproc"/>

android:

id="@+id/image_view"

--显示图片控件-->

android:

layout_width="wrap_content"

android:

layout_height="wrap_content"

android:

contentDescription="@string/str_desc"/>

Activity部分代码如下:

publicclassMainActivityextendsActivityimplementsOnClickListener{

privateButtongray;//灰度处理按钮

privateButtonsalt;//噪点按钮

privateButtonrestore;//还原按钮

privateImageViewimageView;

privateBitmapbmp;

@Override

publicvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.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);

}

@Override

publicvoidonClick(Viewv){

switch(v.getId())//根据被按下按钮的ID转到相应的处理函数

{

caseR.id.btn_gray_process:

graybmp();

break;

caseR.id.btn_salt_process:

saltbmp();

break;

caseR.id.btn_restore_process:

imageView.setImageBitmap(bmp);

break;

}

}

publicvoidgraybmp(){//灰度处理函数

intw=bmp.getWidth();//获得图片的宽度,像素个数

inth=bmp.getHeight();//获得图片的高度,像素个数

int[]pixels=newint[w*h];//建立一个整形数组,大小为图片像素总数

bmp.getPixels(pixels,0,w,0,0,w,h);

//获取图片的每一个像素值并存储到pixels数组中

int[]resultInt=ImageProc.grayProc(pixels,w,h);//调用本地函数

BitmapresultImg=Bitmap.createBitmap(w,h,Config.ARGB_8888);

//创建一个位图,大小与被处理图片大小相同

resultImg.setPixels(resultInt,0,w,0,0,w,h);//将处理后的像素数组赋值给新imageView.setImageBitmap(resultImg);//建的位图

}

static{

System.loadLibrary("ImageProc");加载本地库文件

}

}

ImageProc类,定义本地函数

publicclassImageProc{

publicstaticnativeint[]grayProc(int[]pixels,intw,inth);//灰度处理

publicstaticnativeint[]saltbmp(int[]pixels,intw,inth,intn);//加入噪点

}

仿照opencv自带的安卓例子,编写makefile和定义本地函数的.c文件。

首先,生成本地函数头文件。

在工程目录下新建jni文件夹,启动cygwin,进入该工程目录下:

则在jni文件夹下生成头文件,重命名头文件,目的方便书写和记忆,更名为ImageProc.h,然后编写ImageProc.c文件,实现本地函数,部分代码如下:

JNIEXPORTjintArrayJNICALLJava_com_example_grayprocess_ImageProc_grayProc(JNIEnv*env,jclassobj,jintArraybuf,jintw,jinth){//jni编程的特殊格式

jint*cbuf;

cbuf=env->GetIntArrayElements(buf,false);

if(cbuf==NULL){

return0;

}

MatimgData(h,w,CV_8UC4,(unsignedchar*)cbuf);

//将cbuf指向的像素数组转换为opencv中的Mat类

uchar*ptr=imgData.ptr(0);//获取Mat对象首地址

for(inti=0;i

//计算公式:

Y(亮度)=0.299*R+0.587*G+0.114*B

//对于一个int四字节,其彩色值存储方式为:

BGRA

intgrayScale=(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;

}

intsize=w*h;

jintArrayresult=env->NewIntArray(size);

env->SetIntArrayRegion(result,0,size,cbuf);

//将处理后的像素数组赋给result数组

env->ReleaseIntArrayElements(buf,cbuf,0);

returnresult;//返回处理结果

}

Makefile文件的编写,包括build.sh,clean.sh,Application.mk,Android.mk。

编译ImageProc.c:

库文件生成成功,在eclipse重新编译运行该工程,运行结果如下:

初始界面:

黑白处理后:

加入噪点后:

 

4、总结与感悟

这次课程设计,对我们的锻炼很大。

说实话,选题之前,我们连opencv具体是什么都不清楚,只是希望通过这么一个嵌入式移植类型的题目来检验一下一学期的学习。

我们通过找老师请教,大致了解了移植opencv的方法,首先要熟悉opencv程序编写,其次要了解所要移植的目标平台,然后还要知道移植的目的。

有了大致的思路后,我们开始做知识准备,在网上下载了opencv2.3.1forwindows,配置到vs2010开发环境上,进行opencv程序练习。

结合时下热门的操作系统android,我们决定向android平台移植。

现在较新的opencv版本已经有android版本,并且可以直接拿来用。

我们选择的opencv版本为2.3,该版本中android相关的makefile文件已经写好,但是需要自己对其进行交叉编译。

编译opencv占据整个课程设计将近一半的时间,起初使用的NDK(android-ndk-r6b)版本不对,导致编译了几次都没能成功,后来改用android-ndk-r4-crystax,原因是普通的NDK不支持opencv里面的一些函数,crystax是专门针对opencv的编译工具。

改用之后依然遇到了变异不通过的问题,我们分析它的build.sh文件发现,其中指定的ndk-build是之前默认安装的android-ndk-r6b下的ndk-build,修改路径之后编译终于通过。

开发opencv应用这部分,我们选取了简单的图片处理,结合之前对opencv的学习,使用相关函数实现了图片处理功能。

这次,这次课程设计让我们收获到很多,学习了opencv、NDK、Cygwin、JNI编程这些未接触过的知识,这对我们以后无论是学习还是工作都是很好的铺垫。

我们不仅收获了知识,更认识到团队力量的伟大,收获了珍贵的友情。

 

教师评语

 

签名:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 日语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1