Android NDK和OpenCV整合开发 (3) OpenCV

本文介绍了如何在Android NDK中整合OpenCV,实现Static Initialization,避免依赖OpenCV Manager。详细步骤包括修改Android.mk文件、添加静态初始化块、处理摄像头问题。同时,对十篇相关论文进行了总结,探讨了OpenCV在Android摄像头应用和实时视频处理中的挑战与解决方案。
摘要由CSDN通过智能技术生成

Android NDK 和 OpenCV 整合开发总结(3)

这一节的主要内容是OpenCV在Android NDK开发中的应用,包括下面几个方面的内容:

  • 如何实现Static Initialization从而不需要安装OpenCV Manager运行含OpenCV library的app
  • 对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • 如何使用Android中的摄像头,常见的问题有哪些?
  • OpenCV 和 Android NDK 整合开发的一般途径
1.实现Static Initialization

实现Static Initialization就是指将OpenCV Library添加到app package中,不需要安装OpenCV Manager这个app就能运行,官方文档有介绍,但是不详细,尤其是最后那句代码到底要放在什么地方很多人都不清楚,其实并不需要像官方文档中介绍的那样配置,我想在这里介绍下如何修改FaceDetection项目的源码来做到这点。(最好是找一个包含jni代码的项目进行修改)

  • [1]打开jni下的Android.mk文件,修改OpenCV的那一部分,将off设置为on,并设置OpenCV_LIB_TYPESHARED,结果如下:
OpenCV_CAMERA_MODULES:=on
OpenCV_INSTALL_MODULES:=on
OpenCV_LIB_TYPE:=SHARED
include ${OpenCVROOT}/sdk/native/jni/OpenCV.mk
  • [2]打开FdActivity.java文件,在其中添加一个静态初始化块代码,它是用来加载OpenCV_java库的,由于FaceDetection中还用了另一个库detection_based_tracker(用于人脸跟踪),所以要在else子句中加载进来:
static {
    Log.i(TAG, "OpenCV library load!");
    if (!OpenCVLoader.initDebug()) {
        Log.i(TAG, "OpenCV load not successfully");
    } else {
        System.loadLibrary("detection_based_tracker");// load other libraries
    }
}
  • [3]删除FdActivity.java的OnResume()方法的最后那句,不让它去访问OpenCV Manager。
@Override
public void onResume() {
    super.onResume();
//OpenCVLoader.initAsync(OpenCVLoader.OpenCV_VERSION_2_4_3, this, mLoaderCallback);//
}
  • [4]修改FdActivity.java的OnCreate()方法,从上面的private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this)代码块中拷贝try-catch块放到OnCreate的setContentView()之后,然后拷贝mOpenCVCameraView.enableView();放到mOpenCVCameraView = (CameraBridgeViewBase) findViewById(R.id.fd_activity_surface_view);之后,修改后的OnCreate()方法如下:
public void onCreate(Bundle savedInstanceState) {
    Log.i(TAG, "called onCreate");
    super.onCreate(savedInstanceState);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    setContentView(R.layout.face_detect_surface_view);

    //
    try {
        // load cascade file from application resources
        InputStream is = getResources().openRawResource(R.raw.lbpcascade_frontalface);
        File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);
        mCascadeFile = new File(cascadeDir, "lbpcascade_frontalface.xml");
        FileOutputStream os = new FileOutputStream(mCascadeFile);

        byte[] buffer = new byte[4096];
        int bytesRead;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值