• 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.

    Add dependency from OpenCV library

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

    Add dependency from OpenCV library

    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等。

  • 相关阅读:
    知识点复习
    【程序人生】一个IT人的立功,立言,立德三不朽
    【朝花夕拾】Android多线程之(三)runOnUiThread篇——程序猿们的贴心小棉袄
    【朝花夕拾】Android多线程之(二)ThreadLocal篇
    【朝花夕拾】Android多线程之(一)View.post()篇
    Camera2笔记
    HangFire多集群切换及DashBoard登录验证
    Linq 动态多条件group by
    Api接口签名验证
    postgre ||连接字段
  • 原文地址:https://www.cnblogs.com/dawnminghuang/p/4166060.html
Copyright © 2020-2023  润新知