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生成头文件(方法在上一篇文章中有讲到)
第三步:在app/src/main目录下创建一个jni文件夹,并创建android.mk和application.mk文件,并把上一步生成的h文件发到这里来。
application.mk文件中写上这些内容:
android.mk文件中写上这些内容:
第四步:创建一个cpp文件,取名为:io_github_yanbober_ndkapplication_OpenCVHelper.cpp (这里就是android中出现的),功能是:灰度处理图片
代码如下:
第六步:在java中调用这个cpp中的方法对图片进行灰度处理
主要代码:
点击 灰度化按钮时:
点击 “灰度化”的结果:
第二种方法:直接在java代码中调用 opencv的灰度处理方法
但是这个需要使用到 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
注意:如果不是按照我上一篇文章进行搭建的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 NDK开发之:配置环境的详解
- python中使用OpenCV进行人脸检测的例子
- opencv 做人脸识别 opencv 人脸匹配分析
- 使用opencv拉伸图像扩大分辨率示例
- Android开发的IDE、ADT、SDK、JDK、NDK等名词解释
- Android Studio注释模板介绍
- Android提高之使用NDK把彩图转换灰度图的方法
- Android Studio中配置OpenCV库开发环境的教程
- 基于C++实现kinect+opencv 获取深度及彩色数据
- visual studio 2012安装配置方法图文教程 附opencv配置教程
- OpenCV 2.4.3 C++ 平滑处理分析
- 探讨:如何在NDK中呼叫Java的class
- Python中使用OpenCV库来进行简单的气象学遥感影像计算
- 利用Python和OpenCV库将URL转换为OpenCV格式的方法
- python结合opencv实现人脸检测与跟踪
- Python环境搭建之OpenCV的步骤方法
- Python+Opencv识别两张相似图片
- Python实现OpenCV的安装与使用示例
- 在树莓派2或树莓派B+上安装Python和OpenCV的教程
- opencv-python学习一--人脸检测