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

android studio 搭建opencv环境 (接上一篇文章)

2016-07-08 18:09 597 查看
在上一篇文章中,已经介绍了怎么在android studio中搭建ndk开发环境,现在基于ndk环境,再搭建 opencv开发环境。

注意:如果不是按照我上一篇文章进行搭建的ndk环境的话,建议初学者别看下去了

首先感谢这位大神的博客:http://blog.csdn.net/sbsujjbcy/article/details/49520791

基本都是参考这里的,我想自己记录一下,这样印象会更深刻。

我的环境:

android studio 1.5.1

opencv for android 2.4.9

android-ndk-r12-beta1

一开始学习搭建这个环境的时候,采用了一种不可取的方式进行搭建:使用OpenCVLoader.initAsync()加载库,这样就要在手机上安装这种apk:



而且还不是每种apk都可以用的,有的apk会让你的程序直接崩掉。。

如果大家看到这种方法,希望直接跳过,不可能你发布的产品,还要让用户再去下载一个可能没有用的apk来运行你的产品,用户都已经不用体验就想删了你的软件了。

主要分以下几步完成搭建过程

第一步:将opencv的sdk的native目录拷贝到项目根目录

第二步:创建一个Java文件,然后编译(Make Project),再通过javah生成头文件(方法在上一篇文章中有讲到)

package io.github.yanbober.ndkapplication;

public class OpenCVHelper {
static {
System.loadLibrary("OpenCV");
}
public static native int[] gray(int[] buf, int w, int h);
}


第三步:在app/src/main目录下创建一个jni文件夹,并创建android.mk和application.mk文件,并把上一步生成的h文件发到这里来。

application.mk文件中写上这些内容:

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi armeabi-v7a
APP_PLATFORM := android-8


android.mk文件中写上这些内容:



第四步:创建一个cpp文件,取名为:io_github_yanbober_ndkapplication_OpenCVHelper.cpp (这里就是android中出现的),功能是:灰度处理图片

代码如下:

#include "io_github_yanbober_ndkapplication_OpenCVHelper.h"
#include <stdio.h>
#include <stdlib.h>
#include <opencv2/opencv.hpp>

using namespace cv;

extern "C" {

JNIEXPORT jintArray JNICALL Java_io_github_yanbober_ndkapplication_OpenCVHelper_gray(
JNIEnv *env, jclass obj, jintArray buf, int w, int h) {

jint *cbuf;
cbuf = env->GetIntArrayElements(buf, JNI_FALSE);
if (cbuf == NULL) {
return 0;
}

Mat imgData(h, w, CV_8UC4, (unsigned char *) cbuf);

uchar *ptr = imgData.ptr(0);
for (int i = 0; i < w * h; i++) {
//计算公式:Y(亮度) = 0.299*R + 0.587*G + 0.114*B
//对于一个int四字节,其彩色值存储方式为:BGRA
int grayScale = (int) (ptr[4 * i + 2] * 0.299 + ptr[4 * i + 1] * 0.587 +
ptr[4 * i + 0] * 0.114);
ptr[4 * i + 1] = grayScale;
ptr[4 * i + 2] = grayScale;
ptr[4 * i + 0] = grayScale;
}

int size = w * h;
jintArray result = env->NewIntArray(size);
env->SetIntArrayRegion(result, 0, size, cbuf);
env->ReleaseIntArrayElements(buf, cbuf, 0);
return result;
}
}


第六步:在java中调用这个cpp中的方法对图片进行灰度处理

主要代码:

点击 灰度化按钮时:

Bitmap bitmap = ((BitmapDrawable) getResources().getDrawable(
R.drawable.ic)).getBitmap();
int w = bitmap.getWidth(), h = bitmap.getHeight();
int[] pix = new int[w * h];
bitmap.getPixels(pix, 0, w, 0, 0, w, h);
int[] resultPixes = **OpenCVHelper.gray(pix, w, h)**;
Bitmap result = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565);
result.setPixels(resultPixes, 0, w, 0, 0, w, h);
img.setImageBitmap(result);


点击 “灰度化”的结果:



第二种方法:直接在java代码中调用 opencv的灰度处理方法

OpenCVLoader.initDebug();
Mat rgbMat = new Mat();
Mat grayMat = new Mat();
Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic);
Bitmap grayBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), Bitmap.Config.RGB_565);
Utils.bitmapToMat(srcBitmap, rgbMat);//convert original bitmap to Mat, R G B.
Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY);//rgbMat to gray grayMat
Utils.matToBitmap(grayMat, grayBitmap); //convert mat to bitmap
img.setImageBitmap(grayBitmap);


但是这个需要使用到 opencv的java代码,所以我们需要导入opencv的sdk的java。 点击:File->New->Import Module ,选择如下图;



然后点击next -> finish。

我们需要把 库中的build.gradle的version改成跟app的build.gradle一样的版本。



接下来,点击“java层灰度化”,就能产生一样的结果了



demo链接(本来200M+的,删了大量的“无关”文件):

http://download.csdn.net/detail/chang_1134/9571036
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android studio opencv ndk