今天跟着《深入OpenCV Android应用开发》学习,发现里面的很多内容有很多小错误,而且章节末还没有完整源代码,对新手来说非常的不友好,所以还是边学边记载自己学的过程中碰到的问题吧。

一、关于menu菜单的创建和menu的作用

参考这篇文章——创建menu菜单项

大多数android程序的右上角都会设置一个菜单按钮比如微信的界面右上角的加号。

这个需要在layout同级目录下新建文件夹命名为menu,再右击新建的menu新建xml文件:

xml文件代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/id_action_add"
        app:showAsAction="always"
        android:title="add"
        android:icon="@mipmap/ic_launcher"
        android:orderInCategory="1"
        />
    <item
        android:id="@+id/id_action_delete"
        app:showAsAction="always"
        android:title="jian"
        android:icon="@mipmap/ic_launcher"
        android:orderInCategory="1"
        />
</menu>

上面的两个item代表代表的是你菜单栏上面有几个按钮。这里的按钮区别于Button。android:icon中可以自定义菜单项的图片

下面讲一下今天对面opencv001和opencv003工程是发现的问题。opencv001是创建在Android studio3.0版本的。版本升级到3.0.1之后,之前的dependencies就发生了一下小变化

opencv001项目中,后面的Scope是compile,现在变成了Implementation。上网查过之后,发现确有其事。不同点参考下面这位的描述Android Studio3.0之后gradle.build中dependencie依赖由compile变为implementation。

然后我根据之前在Android studio上配置OpenCV开发环境时候的参考博客,基于Android Studio的OpenCV开发环境搭建笔记,后面再gradle中加入几行compile语句,我也将它改成了Implement,看下会不会有什么问题。

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    compile fileTree(dir: "$buildDir/native-libs", include:'native-libs.jar')//这一句是创建项目后新增的
    implementation 'com.android.support:appcompat-v7:26.1.0'

事实证明将compile改成implementation 并没有影响,功能是一样的。opencv001项目可以跟原来一样,正常的安装到模拟器上调试,且功能可以正常的实现。然而opencv003项目也按照同样的配置,调试的时候却会报“缺少opencv manager”的错误。所以我怀疑是opencv003项目MainActivity 中的代码出现了问题。于是我将opencv001中导入opencv库的函数部分去替换opencv003项目中的那部分函数(这两个加载库的函数我都没有弄透彻,所以接下来这个问题得好好研究研究)。opencv001中用于替换的代码如下:

private String TAG = "CVSAMPLE";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initLoadOpenCVLibs();
    Button btn = findViewById(R.id.testButton);
    btn.setOnClickListener(this);

}

private void initLoadOpenCVLibs(){
    boolean success = OpenCVLoader.initDebug();
    if (success) {
        Log.i(TAG, " 类导入成功");
    } else {
        Log.i(TAG,"类导入失败");
    }
}

其中主要就是initLoadOpenCVLibs 这个方法,具体加载布局的那部分是不用替换。然后被替换的opencv003项目中的代码如下:

private BaseLoaderCallback mLoaderCallback =new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(intstatus) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS: {
                Log.i("OpenCVStatus","OpenCV loaded successfully");
            }
            break;
            default: {
                super.onManagerConnected(status);
            }
            break;
        }
    }
};

OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);

替换完之后,重新编译,发现软件可以正常打开,具体功能打算到真机上测试,但是基本的按钮和菜单都是能正常显示的。

所以接下来的重点就是弄清楚这几行代码的玄机。这里解释一下,opencv003项目的代码,我是用的《深入 opencv Android应用开发》这本书,第二章的示例代码。在未更改前,我尝试过build APKs,生成的apk居然有100多M。(个人想法:个人觉得这个应该是将用到的opencv库生成了静态链接库,不然的话不会这么大)。之前调试opencv003的时候,报“缺少opencv manager”错误时,我去下载过一个opencv manager 3.2,里面有各种版本,但是将APK拖拽到genymotion模拟器中时,都显示无法安装,说架构不匹配。我也是服了,所以这里我就没有深究了,因为免安装opencv manager应该是opencv for Android开发的一个主流吧。

如果这部分功能正常实现的话,下一步尝试将之前写好的相机程序和这个程序整合一下,实现对拍摄到的图片进行及时处理。这样,最基础的一个框架就初步成形了,后续就是对Android图像处理方面的加强学习。

————————————分割线,今天是2018-01-16,加油加油~

按如上方法更改后,运行安装好的APP,logcat会报“类导入失败”的错误,继续参考基于Android Studio的OpenCV开发环境搭建笔记这篇文章,在build.gradle(app)中继续添加如下代码:

task nativeLibsToJar(type: Jar, description: 'create a jar archive of the native libs'){
    destinationDir file("$buildDir/native-libs")
    baseName 'native-libs'
    from fileTree(dir: 'libs', include:'**/*.so')
    into 'lib/'

以及:

tasks.withType(JavaCompile){
    compileTask -> compileTask.dependsOn(nativeLibsToJar)
}

重新编译后运行,logcat显示“类导入成功”。在genymotion中调试,因为无相机图片,直接点击功能部分会闪退。所以转到真机上面进行调试。真机调试发现成功了,yeah。

效果图如下:

OpenCV4Android学习笔记一相关推荐

  1. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  2. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  3. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  4. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

  5. 2020年Yann Lecun深度学习笔记(上)

    2020年Yann Lecun深度学习笔记(上)

  6. 知识图谱学习笔记(1)

    知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...

  7. 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记

    计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...

  8. Go 学习推荐 —(Go by example 中文版、Go 构建 Web 应用、Go 学习笔记、Golang常见错误、Go 语言四十二章经、Go 语言高级编程)

    Go by example 中文版 Go 构建 Web 应用 Go 学习笔记:无痕 Go 标准库中文文档 Golang开发新手常犯的50个错误 50 Shades of Go: Traps, Gotc ...

  9. MongoDB学习笔记(入门)

    MongoDB学习笔记(入门) 一.文档的注意事项: 1.  键值对是有序的,如:{ "name" : "stephen", "genda" ...

最新文章

  1. linux php ldap扩展,php_ldap域集成模块安装-159
  2. 检测你处于程序员的哪个层级
  3. Cheat Engine教程关卡密码
  4. Linux终端打开一只小马,Linux 终端上的漂亮小马
  5. JS正则表达式常见场景下的用法总结
  6. 寻找 K8s 1.14 Release 里的“蚌中之珠”
  7. 必须用Python给程序员不懂浪漫平反一波....不管班花还是校花全都跑不掉~
  8. centos7卸载旧jdk安装新jdk1.8
  9. AS3.0文档类:FLASH右键菜单文档类
  10. 软件测试的维护,浅谈如何维护软件测试用例
  11. 【数说人物】170个热搜刷屏网络 起底康巴汉子丁真爆红路径
  12. 技术人员硬实力和软实力
  13. 9、HDFS核心设计--心跳机制、安全模式、副本存放策略、负载均衡
  14. Vue+ant-design-pro(2)动态路由
  15. 人工智能技术与专利技术变革
  16. hdu 2066 一个人的旅行(最短路)
  17. 模拟系统判断是否是你生日java
  18. php微信自动回复开发,PHP微信开发之文本自动回复
  19. 合泰杯——合泰单片机工程5之串口通信
  20. JAVA毕设项目个性化推荐的扬州农业文化旅游管理平台(java+VUE+Mybatis+Maven+Mysql)

热门文章

  1. 承受自律的苦,不要承受自责的悔
  2. js 自由变换图片尺寸
  3. pdf怎么合并成一个文件?高效工具分享
  4. 【LIO-SAM论文全文翻译】:LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping
  5. DeepMind已将AlphaGo引入多领域 Al泡沫严重
  6. 基于java的扫雷论文_毕业论文基于java的扫雷游戏的设计与实现.doc
  7. python的自定义函数
  8. 北斗时钟同步服务器(卫星授时)应用智慧路灯系统
  9. 网络抓包代理工具:Charles 超好用
  10. Matlab实现的FEMIC的说明书