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。
效果图如下: