OpenCV4Android学习笔记一

今天跟着《深入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。

效果图如下:




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值