利用OPENCV为android相机开发图像处理库

来源:互联网 发布:中国云计算用户大会 编辑:程序博客网 时间:2024/06/04 18:27

android调用opencv的方法有三种,利于OPENCVSDK manager调用,这种方法最简单,不过需要安装客户端,相对来说,很多适合都是不适用的。一种是使用OPENCV提供的JAVA库加SO库调用,这种方法相当来说,省掉了多安装一个APP的负责,更有利于软件推广。最后一种是利于JNI调用OPENV的C/C+语言库完成相关功能模块开发,并给JAVA层提供相应的调用接口,这种方式个人感觉效率最高。

使用OPENCV开发相机,一般是借且三种方式,一种是camera的previcewcallback接口提供的预览回调,一种是使用camera2的 ImageReader接口,还有一种使用OPENGL的shader开发相应接口,一旦加了特殊处理,都会产生丢帧。

从相机获取的数据都是YUV格式的BYTE数组,在opencv中先把其转为RGB数组,再对其做畸变,美颜,人脸查找,应用分割或者其他滤镜等技术。

先创建JAVA调用,这里写两个函数,一个YUV转为灰度,一个YUV转为RGBA,文件名字ImageProc,包名myopencv


package myopencv;public class ImageProc {static {System.loadLibrary("ImageProc");}public static native boolean convertGray(int width, int height, byte[] NV21FrameData, int[] pixels);public static native boolean convertRGBA(int width, int height,  byte[] yuv, int[] pixels);}


调用JAVAH生成头文件,头文件不是必需的,如果熟了,可以直接CPP文件

javah -classpath F:\luna5\mycam\bin\classes\ -jni myopencv.ImageProc

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class myopencv_ImageProc */#ifndef _Included_myopencv_ImageProc#define _Included_myopencv_ImageProc#ifdef __cplusplusextern "C" {#endif/* * Class:     myopencv_ImageProc * Method:    convertGray * Signature: (II[B[I)Z */JNIEXPORT jboolean JNICALL Java_myopencv_ImageProc_convertGray  (JNIEnv *, jclass, jint, jint, jbyteArray, jintArray);/* * Class:     myopencv_ImageProc * Method:    convertRGBA * Signature: (II[B[I)Z */JNIEXPORT jboolean JNICALL Java_myopencv_ImageProc_convertRGBA  (JNIEnv *, jclass, jint, jint, jbyteArray, jintArray);#ifdef __cplusplus}#endif#endif


使用opencv编写相应的功能代码

#include <stdio.h>#include <jni.h>#include<Android/log.h>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>using namespace std;using namespace cv;#define TAG    "Camera XXXXX" // 这个是自定义的LOG的标识#define LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__) // 定义LOGD类型extern "C"{    jboolean Java_myopencv_ImageProc_convertGray(        JNIEnv* env, jobject thiz, jint width, jint height,        jbyteArray NV21FrameData, jintArray outPixels)    {        jbyte * pNV21FrameData = env->GetByteArrayElements(NV21FrameData, 0);        jint * poutPixels = env->GetIntArrayElements(outPixels, 0);                Mat mNV(height, width, CV_8UC1, (unsigned char*)pNV21FrameData);        Mat mBgra(height, width, CV_8UC4, (unsigned char*) poutPixels);        cvtColor(mNV, mBgra, CV_GRAY2RGBA);        env->ReleaseByteArrayElements(NV21FrameData, pNV21FrameData, 0);        env->ReleaseIntArrayElements(outPixels, poutPixels, 0);        return true;    }    jboolean Java_myopencv_ImageProc_convertRGBA(    JNIEnv *env, jobject thiz, jint width, jint height, jbyteArray yuv, jintArray outPixels)    {        jbyte * pBuf = (jbyte*)env->GetByteArrayElements(yuv, 0);        jint * poutPixels = env->GetIntArrayElements(outPixels, 0);        Mat image(height + height/2, width, CV_8UC1, (unsigned char *)pBuf);        Mat mBgra(height, width, CV_8UC4, (unsigned char*) poutPixels);        cvtColor(image, mBgra, CV_YUV420sp2RGBA);        LOGD("jiaXXX %X", poutPixels[0]);        env->ReleaseByteArrayElements(yuv, pBuf, 0);        env->ReleaseIntArrayElements(outPixels, poutPixels, 0);        return true;    }    jboolean Java_myopencv_ImageProc_convertBeauty(        JNIEnv *env, jobject thiz, jint width, jint height, jbyteArray yuv, jintArray outPixels)    {        return true;    }    jboolean Java_myopencv_ImageProc_convertBackBlur(        JNIEnv *env, jobject thiz, jint width, jint height, jbyteArray yuv, jintArray outPixels)    {        return true;    }}

编写MK文件,Application.mk,为了兼容性,参数使用 ALL,生成所有支持的CPU的库

APP_STL := gnustl_staticAPP_CPPFLAGS := -frtti -fexceptionsAPP_ABI := allAPP_PLATFORM := android-8
编写Android.mk文件

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)OPENCV_LIB_TYPE:=STATICOPENCV_INSTALL_MODULES:=oninclude C:/Users/jiazhiguo/Downloads/opencv/sources/samples/android/sdk/native/jni/OpenCV.mkLOCAL_MODULE    := ImageProcLOCAL_SRC_FILES := ImageProc.cppLOCAL_LDLIBS +=  -llog -ldlinclude $(BUILD_SHARED_LIBRARY)


注意路径,由于是使用OPENCV开发,对OPENCV有依赖,编译时需要OPENCV路径,我的OPENCV的SDK路径在C盘,需要改成自己的

ndk-build生成相应libImageProc.so库在项目中使用.

ImageProc.convertRGBA(previewSizeWidth, previewSizeHeight, mData, pixels);



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 大掌门2转换阵容怎么办 率土之滨s2绝版怎么办 异界气息的装备怎么办 vivo电板没电了怎么办 门套拼接有缝隙怎么办 公司如果一直没有上税收入怎么办 赛车输了俩百万怎么办 交pk金员工不交怎么办 员工不想交pk金怎么办 心悦光环领错角色怎么办 心悦光环领错了怎么办 扑克牌1到13洗后怎么办 南通长牌没钱了怎么办 镇魔曲手游阵营人数已满怎么办 镇魔曲忘记在哪个区怎么办 登录镇魔曲卡在实名验证怎么办 电脑玩联盟花屏怎么办 优盘文件或目录损坏怎么办 苹果下吃鸡设备不兼容怎么办 龙之谷账号忘了怎么办 不花钱的排风除湿怎么办 苹果平板id密码忘了怎么办 苹果平板忘记id及密码怎么办 饥荒抓到的兔子怎么办 苹果手机下载不了王者荣耀怎么办 ipad登录显示验证失败怎么办 苹果手机系统内存太大怎么办 ipad玩游戏没声音怎么办 微信活跃度低怎么办 想开通淘宝直播粉丝不够怎么办 下巴长泡泡还痒怎么办 脚起泡泡很痒怎么办 脚痒还有小泡泡怎么办 外阴长了肉疙瘩怎么办 嘴巴里泡泡破了怎么办 脚上泡泡破了怎么办 脸被自己扣破了怎么办 6s安装不了软件怎么办 苹果6s特别卡怎么办 苹果手机4g网慢怎么办 大王卡玩王者卡怎么办