




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
开发环境:windows+ADT Bundle+CDT+OpenCV-2.4.4-android-sdk 一、OpenCV2.4 简介 OpenCV 近年来发展迅猛,随着 Android 智能终端的发展,越来越 多的传统科研平台都转向 Android 移动终端。记得 2010 年人们还不 大知道 Android,当时第一次用 OpenCV 还是用的 1.0.2 版本在 VC6.0 上。早期的 OpenCV 只提供 C 语言接口,你要申请个矩阵还得 CvMat *mat = cvCreateMat(.)写一大串,这样做是为了保证程序的 运行效率,带来的不便是要开发者手动管理内存分配,稍有不慎内存 泄漏那是常有的事。在 OpenCV 的发展历程上,第一次飞跃是 2009 年 10 月 1 日发布的 2.0 版本,该版本支持 C+接口 了,是直接从 1.2 版本跳到 2.0。不久又推出了 2.1,自此后想要移植 OpenCV 至嵌入式 系统,在编译时必须借助 CMake 工具,而以往的不用。 第二次飞跃是在 2010 年 6 月发布的 2.3、2.3.1 版本,除提供 C+ 接口向下兼容 C 接口外,新增了 Java 接口,且是对准 Android 平台。 更重要的是以前官方不支持 ndk-build,这次终于一统 JNI 接口调用方 式,方便在 Android 上开发使用。2012 年 4 月 2 日发布了 2.4 版本, 支持 windows/Linux、 Mac/Android/IOS 四大系统。 最新的版本是 2013 年 11 月 11 日发布的 2.7 版本。我电脑上配置 的是 2.4.4 版本。 从 2.4 之后,为了和 Android 的系统架构保持同步,准确说是吸收 Android 框架层的优点,引入了 OpenCV Manager 的概念,其本质就 是一个 Service,用来管理 OpenCV 动态链接库。它工作在 APP 和 OpenCV 的动态链接库之间。OpenCV Manager 的结构就是模仿 Android 的 Binder 机制。其架构图如下: APP 在运行时会首先检查 OpenCV Manager 存在不,如果不存在 则会提示安装。如果存在,就会连接这个服务,进一步初始化加载 OpenCV 库。流程如下: 对于开发者而言,了解即可。从应用层面讲,将 OpenCV-2.4.4- android-sdk 解压后,会看到如下文件夹: 其中 sdk 就是开包时要用到的包, samples 是自带的示例,doc 是 说明文档,apk 则就是 OpenCV Manager。手机想要运行基于 OpenCV 的 Java 接口的程序,就必须先安 OpenCV Manager。 不同的手机选择不同的版本,如果是英特尔平台就选那个带 x86 的。 比较老的手机不支持 ARMv7 的选第三个。根据 android 的版本选择 前两个。我手机支持的是第一种。安装后即可。 二、Android APP 通过 Java 接口调 OpenCV 1、配置 配置其实比较简单,比之前的用 JNI 接口调 OpenCV 要简单很多,不 过为了保持同步,也即以后的开发中可以随意混用 Java 接口和 JNI 接口,我们仍将压缩包解压到跟工作空间平级的目录。然后将解压后 的 sdk 文件夹命名为 OpenCV4Android-sdk,拷贝到新建的工作空间 中。假设新建的工作空间名为 OpenCV4Android。 【备注:这里让它两平级是为了以后 JNI 调用时无需修改 mk 文件。 注意解压后会嵌套一个目录,把它拷到最外层。sdk 文件夹命名和拷 贝到新的工作空间都不是必须的。】 打开 Eclipse 切换到这个新的工作空间,右键 import-General- Existing Projects into workspaces,选择 OpenCV 解压后的那个 sdk 包。导入后看是否有错误,我的是提示找不到 java.util.List 这个 包,原来是没有加载进来 Android 的 SDK。选中项目,按快捷键 Alter + Enter,点 Android,选中一个 SDK,要求 3.0 以上。然后 clean 一下,看 bin 文件夹下的 opencv library - 2.4.4.jar 是否生成, 如果它生成了就表示已经导入成功。 2、新建项目并引入上面的 jar 包 任意新建一个 Android Application Project,然后选中该项目快 捷键 Alter + Enter,在下面的加库区域点 Add,将导入工作空间的 opencv sdk 选中: 可以看到在 Android Dependencies 中将刚到导包 bin 目录下生成 的 jar 文件导进去了。之后就可以使用 opencv 的 API 了。 【备注:说白了就是为了把这个 jar 包导进来。在生成这个 jar 包后 可以把它拷出来,新建一个 user library 参见导原生 camera 到 eclipse 这篇, 之后将包加进来是一样的。这个包只有 200 多 kb,也 可以将其直接拷贝到工程目录下的 libs 文件夹,也是 ok 的。但是这样 做后,就看不到 jar 包里具体的子包了,如 org.opencv.ml 这些。】 3、一个完成的 demo:将一个图片灰度化 项目名字为 GrayProcess,下面贴源码: 布局文件: html view plaincopyprint? 1. 10. 11. 16. 22. “ 29. 30. java 文件: java view plaincopyprint? 1. package com.example.grayprocess; 2. 3. import org.opencv.android.BaseLoaderCallback; 4. import org.opencv.android.OpenCVLoader; 5. import org.opencv.android.Utils; 6. import org.opencv.core.Mat; 7. import org.opencv.imgproc.Imgproc; 8. 9. import android.app.Activity; 10. import android.graphics.Bitmap; 11. import android.graphics.Bitmap.Config; 12. import android.graphics.BitmapFactory; 13. import android.os.Bundle; 14. import android.os.Handler; 15. import android.util.Log; 16. import android.view.Menu; 17. import android.view.View; 18. import android.view.View.OnClickListener; 19. import android.widget.Button; 20. import android.widget.ImageView; 21. 22. public class MainActivity extends Activity 23. 24. Button btnProcess; 25. Bitmap srcBitmap; 26. Bitmap grayBitmap; 27. ImageView imgHuaishi; 28. private static boolean flag = true; 29. private static boolean isFirst = true; 30. private static final String TAG = “MainActivity“; 31. 32. /OpenCV 库加载并初始化成功后的回调函数 33. private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) 34. 35. Override 36. public void onManagerConnected(int status) 37. / TODO Auto-generated method stub 38. switch (status) 39. case BaseLoaderCallback.SUCCESS: 40. Log.i(TAG, “成功加载“); 41. break; 42. default: 43. super.onManagerConnected(status); 44. Log.i(TAG, “加载失败“); 45. break; 46. 47. 48. 49. ; 50. Override 51. protected void onCreate(Bundle savedInstanceState) 52. super.onCreate(savedInstanceState); 53. setContentView(R.layout.activity_main); 54. initUI(); 55. 56. btnProcess.setOnClickListener(new ProcessClickListener(); 57. 58. 59. 60. Override 61. public boolean onCreateOptionsMenu(Menu menu) 62. / Inflate the menu; this adds items to the action bar if it is pres ent. 63. getMenuInflater().inflate(R.menu.main, menu); 64. return true; 65. 66. 67. public void initUI() 68. btnProcess = (Button)findViewById(R.id.btn_gray_process); 69. imgHuaishi = (ImageView)findViewById(R.id.img_huaishi); 70. Log.i(TAG, “initUI sucess.“); 71. 72. 73. 74. public void procSrc2Gray() 75. Mat rgbMat = new Mat(); 76. Mat grayMat = new Mat(); 77. srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable. nanhuaijin); 78. grayBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.get Height(), Config.RGB_565); 79. Utils.bitmapToMat(srcBitmap, rgbMat);/convert original bitmap to Ma t, R G B. 80. Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY);/rgbMat t o gray grayMat 81. Utils.matToBitmap(grayMat, grayBitmap); /convert mat to bitmap 82. Log.i(TAG, “procSrc2Gray sucess.“); 83. 84. 85. private class ProcessClickListener implements OnClickListener 86. 87. Override 88. public void onClick(View v) 89. / TODO Auto-generated method stub 90. if(isFirst) 91. 92. procSrc2Gray(); 93. isFirst = false; 94. 95. if(flag) 96. imgHuaishi.setImageBitmap(grayBitmap); 97. btnProcess.setText(“查看原图“); 98. flag = false; 99. 100. else 101. imgHuaishi.setImageBitmap(srcBitmap); 102. btnProcess.setText(“灰度化“); 103. flag = true; 104. 105. 106. 107. 108. 109. Override 110. protected void onResume() 111. / TODO Auto-generated method stub 112. super.onResume(); 113. /load OpenCV engine and init OpenCV library 114. OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_4, getApplic ationContext(), mLoaderCallback); 115. Log.i(TAG, “onResume sucess load OpenCV.“); 116. / new Handler().postDelayed(new Runnable() 117. / 118. / Override 119. / public void run() 120. / / TODO Auto-generated method stub 121. / procSrc2Gray(); 122. / 123. / 124. / , 1000); 125. 126. 127. 128. 129. 130. 131. 功能很简单,就是将一个图片灰度化,然后再次点击恢复成原来的。 里面有几个需要注意的事项: a、Bitmap 和 Mat 互相转换:Utils.bitmapToMat Utils.matToBitmap b、加载一个图片到 Bitmap:BitmapFactory.decodeResource(getResources(), R.drawable.nanhuaijin); c、颜色转换:Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY); d、grayBitmap 的格式 Config.ARGB_8888 和 Config.RGB_565 都是 可以的 e、最重要的一点: app 在找 OpenCV 里的一些包时必须在 onResume 函数 OpenCVLoader.initAsync()之后,否则会找不到库。最初我将 procSrc2Gray();放在 initUI()之后直接挂掉,后来放到 OpenCVLoader.initAsync()依旧不行。除了上面代码里的方法外,还 可以用一个延迟,默认等加载完包初始化后,再进行图像处理的操作: java view plaincopyprint? 1. new Handler().postDelayed(new Runnable() 2. 3. Override 4. public void ru
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年数字货币对货币政策传导机制影响下的金融稳定与风险防范报告
- 2025年大数据存储与管理在网络安全态势感知中的应用报告
- 2025年工业互联网平台网络安全态势感知技术在智慧交通中的应用研究报告
- 2025年文化产业园产业集聚与服务体系构建中的金融支持与服务创新报告
- 2025年功能性食品市场消费者对产品购买场景的分析报告
- 2025年智能交通系统在高速公路管理中的车路协同与智能监控技术融合策略报告
- 2025年医药企业CRO外包服务在临床试验伦理审查中的应用报告
- 传统食品工业化生产2025年智能工厂改造项目预算报告
- 2025年按摩器具项目深度研究分析报告
- 2025年二节扭铰行业深度研究分析报告
- 产褥期保健及护理课件
- 陕西省西安市2025届中考模拟英语检测试题(附答案)
- 2025-2030消防车产业规划专项研究报告
- 初中英语教辅电子版单选题100道及答案
- 2025年上海市崇明区中考二模英语试题(含答案)
- 大型心血管造影系统及其DSA质量控制
- 国家中小学智慧教育平台应用指南
- 2024北京丰台区三年级(下)期末数学试题及答案
- 2024-2025学年人教版七年级(下)期中数学试卷(考试范围:第7~9章) (含解析)
- 人工智能安全监控系统开发协议
- 油田夏季十防培训课件
评论
0/150
提交评论