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转一个图像灰度转换
<span style="color:#006600;background-color: rgb(255, 255, 255);">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 );
}
}</span>
但是编译的过程中总是出现各种问题,如下:
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;
}
}
终于可以使用了,主要参考如下: