OpenCV4android 配置以及注意点

1.配置的基本步骤

     详细的步骤的可以参考博客:http://blog.csdn.net/Glouds/article/details/39375035
  这里只讲几个关键快速上手的步骤,而且是使用openCV for java封装的函数。
  • 下载好openCV4android
     下载地址是:http://opencv.org/
解压后的一些文件
  • 导入到Eclipse中
将sdk文件夹copy到eclipse workspace文件夹下,然后import进来
 

添加sdk

添加后在导航栏中的状态


  • 将openCV lib 添加到需要使用的工程中
右键工程选择porperties,再选择Android就可看到下面的窗口

添加成功后的文件
  • 使用OpenCV转一个图像灰度转换
package com.example.cvtest;




import android.app.Activity;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.ImageView;




import org.opencv.android.BaseLoaderCallback; 

import org.opencv.android.LoaderCallbackInterface; 

import org.opencv.android.Utils; 

import org.opencv.android.OpenCVLoader;

import org.opencv.core.Mat; 

import org.opencv.imgproc.Imgproc;




public class MainActivity extends Activity

{

       private ImageView imageView ; 

       private Bitmap bmp ; 


      

    private BaseLoaderCallback  mLoaderCallback = new BaseLoaderCallback(this) { 

         @Override 

         public void onManagerConnected(int status) { 

             switch (status ) { 

                 case LoaderCallbackInterface .SUCCESS :{ 

                 } break; 

                 default:{ 

                     super.onManagerConnected (status ); 

                 } break; 

             } 

         } 

     }; 




//    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {

//        @Override

//        public void onManagerConnected( int status) {

//            switch (status) {

//                case LoaderCallbackInterface.SUCCESS:

//                {

//                    Log.i("OpenCV", "OpenCV loaded successfully");

//                    imageMat=new Mat();

//                } break;

//                default:

//                {

//                    super.onManagerConnected(status);

//                } break;

//            }

//        }

//    };

      

      

       @Override

       protected void onCreate(Bundle savedInstanceState)

      {

             super.onCreate (savedInstanceState );

             setContentView(R.layout .activity_main );

            

//          if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_11,

//                MainActivity.this, mLoaderCallback)) {

//            Log.e("TEST", "Cannot connect to OpenCV Manager");

//        }

            

             imageView = ( ImageView) findViewById(R.id.iv_image );

             bmp = BitmapFactory.decodeResource (getResources (),R .drawable .lena );

             imageView.setImageBitmap( bmp);




//          

//          if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2,

//                MainActivity.this, mLoaderCallback)) {

//            Log.e("TEST", "Cannot connect to OpenCV Manager");

//        }

            

      }




      

       public void click(View v)

      {

             Mat rgbMat = new Mat();

             Mat grayMat = new Mat();

            

//          Mat imageMat = new Mat();

            

             Utils. bitmapToMat(bmp, rgbMat );

            

             Imgproc. cvtColor(rgbMat , grayMat ,Imgproc .COLOR_BGR2GRAY );

            

             Utils. matToBitmap(grayMat , bmp );

            

             imageView.setImageBitmap( bmp);




      }

      

      

    @Override 

     public void onResume ()

    { 

         super.onResume (); 

         //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 

         //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存在于OpenCV安装包的 apk目录中 

         OpenCVLoader.initAsync (OpenCVLoader .OPENCV_VERSION_2_4_11 , this, mLoaderCallback ); 

     }




      

}

但是编译的过程中总是出现各种问题,如下:

2.配置的主要的问题

  • 报错信息
java.lang.IllegalArgumentException: Service Intent must be explicit: Intent {act=org.opencv.engine.BIND }

  • 原因分析
    • 这个错误好像是由于Android版本引起,网上也有相关的讨论,说是android5.0更新引起的,但是我试过更爱编译的版本为4.0还是不行
    • 这个可能是是openCv初始化的时候没有初始化,导致的错误

3.解决的方案

  • 最后试了很多种方案,终于找到了正解,需要修改openCV源码:src/main/java/org/opencv/android/AsyncServiceHelper.java

  • 需要将这个改成如下的代码:
public static boolean initOpenCV(String Version, final Context AppContext,
        final LoaderCallbackInterface Callback) {
    AsyncServiceHelper helper = new AsyncServiceHelper(Version, AppContext,
            Callback);
    Intent intent = new Intent("org.opencv.engine.BIND");
    intent.setPackage("org.opencv.engine");
    if (AppContext.bindService(intent, helper.mServiceConnection,
            Context.BIND_AUTO_CREATE)) {
        return true;
    } else {
        AppContext.unbindService(helper.mServiceConnection);
        InstallService(AppContext, Callback);
        return false;
    }
}


终于可以使用了,主要参考如下:
http://blog.csdn.net/Glouds/article/details/39375035
http://stackoverflow.com/questions/27470313/opencv-service-intent-must-be-explicit-android-5-0-lolipop

你可能感兴趣的:(图像知识)