Android学习六---OpenCV for android samples

搭建好OpenCV4Android环境后,就要着手开发自己的应用了。对于一个没有OpenCV基础的人来开发OpenCV应用确实有点难度,不过我们可以从samples里学起,结合javadoc和万能的网络开发一个简单的应用应该不难。为了简单,我们采用的是纯粹的java API不涉及JNI,等对这一部分熟悉之后再来采用JNI实现。

首先对OpenCV的android应用来个感性的认识,把samples中的image-manipulations安装到手机上(手机上先安装好OpenCV manager 和binary pack见上节),然后把menu调出来,试一试Histograms,Canny  ,sobel 等菜单,会发现应用对摄像头捕获的图像实时的处理,在屏幕的一个小的窗口中输出处理结果图。

这样一来我们的重点就确定了,简单的界面设计,数据存储,显示和算法的应用是关键。而算法的应用就通过调用一系列的API来实现。我们就围绕下面几个问题来进行

1.操纵相机,取出图像进行处理

首先必须要知道OC(OpenCV)是怎么操纵相机的,如何从图像流中取出一帧帧来进行处理?

解决:通过opencv官网的例子了解

JAVA 包含OpenCV java包。即通过非同步的方式来进行应用开发,这个是官网强烈推荐的方式,因为可以减少代码量等优势,主要是用OpenCV Manager方式来获取OpenCV库(已经在目标系统安装好了)

1.1 File -> Import -> Existing project in your workspace.

Android学习六---OpenCV for android samples

1.2.  Project -> Properties -> Android -> Library -> Addselect OpenCV Library - 2.4.9.

Android学习六---OpenCV for android samples

1.3   一个简单的程序

public class Sample1Java extends Activity implements CvCameraViewListener {

    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i(TAG, "OpenCV loaded successfully");
mOpenCvCameraView.enableView();
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
}; @Override
public void onResume()
{
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_6, this, mLoaderCallback);
} ...
}

OnManagerConnected callback会在UI线程中调用,在使用OpenCV调用或者载入OpenCV支撑的本地库前一定要先包含这一调用。在OpenCV成功初始化后载入本地库,默认的BaseLoaderCallback会把应用程序上下文当成是Activity,所以在初始化失败时会调用Activity.finish()。要重写这一行为,就必须重写finish()这一方法。

2.要了解处理的程序是写在哪一部分的,如何达到只对这一部分修改,而其他部分不变?

官网上的samples,ImageManipulationsActivity采用的是OpenCV java API来写的,通过一个hello opencv知道整个流程(虽然这个程序没有运行成功),

知道应该修改的是OnCameraFrame,对每帧图像进行处理。

3.如何实现一个简单基于连通域分析的OpenCV文本定位算法,把算法嵌入应用程序中?

算法流程,对彩色的帧图像进行二值化,二值化之后进行连通域分析,分析每个连通域的情况,对连通域进行分析,去除一些不符合要求的,对剩下的连通域采用形态学图像处理,连成一个文本行,在对文本行进行滤除,最后得到文本的区域位置。

4.如何对错误进行调试使最终实现运行?

采用同Android相同的方式进行调试,如logcat和端点,一系列快捷键的使用如F5,F6,F7,F8 和ctrl+R等。

上一篇:golang----GC的实现原理


下一篇:Linux/Mac OS 个人常用Terminal技巧整理