您的位置:首页 > 移动开发 > Android开发

Opencv开发android应用

2015-12-20 20:42 603 查看
为了大家少走弯路,写这篇博客。目的是在开发android程序时使用opencv库

一般有两种方法,第一种是异步调用,第二种是静态初始化(需要NDK,CDT插件)。

下面写的是异步调用!!

环境

windows7 、opencv2.4.9、eclipse

一、下载安装opencv android SDK
http://opencv.org/downloads.html
二、配置opencv android环境

1、将opencv android SDK中的SDK文件夹拷到自己的工作空间

2、导入opencv库

File-->Import-->Existing
projects into workspace

找到你刚才拷到工作空间下的SDK文件夹,点击finish

会出现这个

3、新建Android工程TestOpencvAndroid,右击选properties->Android,点击Add

选Opencv Library

4、将SD\native\libs下的所有东西拷进android工程下的libs文件夹

5、测试代码

package com.example.testopencvandroid;

import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;

import android.os.Bundle;
import android.util.Log;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Bitmap.Config;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity implements OnClickListener{
private Button btnProc;
private ImageView imageView;
private Bitmap bmp;

//OpenCV类库加载并初始化成功后的回调函数,在此我们不进行任何操作
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:{
} break;
default:{
super.onManagerConnected(status);
} break;
}
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("main", "Trying to load OpenCV library");
if (!OpenCVLoader.initDebug()) {
Log.e("main", "Cannot connect to OpenCV Manager");
} else {
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}

btnProc = (Button) findViewById(R.id.btn_gray_process);
imageView = (ImageView) findViewById(R.id.image_view);
//将lena图像加载程序中并进行显示
bmp = BitmapFactory.decodeResource(getResources(), R.drawable.lena);
imageView.setImageBitmap(bmp);
btnProc.setOnClickListener(this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Mat rgbMat = new Mat();
Mat grayMat = new Mat();
//获取lena彩色图像所对应的像素数据
Utils.bitmapToMat(bmp, rgbMat);
//将彩色图像数据转换为灰度图像数据并存储到grayMat中
Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY);
//创建一个灰度图像
Bitmap grayBmp = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), Config.RGB_565);
//将矩阵grayMat转换为灰度图像
Utils.matToBitmap(grayMat, grayBmp);
imageView.setImageBitmap(grayBmp);
}

}注意:加入这段代码就不需安装opencv Manager
//OpenCV类库加载并初始化成功后的回调函数,在此我们不进行任何操作
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:{
} break;
default:{
super.onManagerConnected(status);
} break;
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: