Android Studio中集成OpenCV4Android记录(一)

来源:互联网 发布:流程优化的人员要求 编辑:程序博客网 时间:2024/05/21 12:33

近来公司需求需要对图片进行处理,简单的对OpenCV4Android进行集成.首先参考前人经验分为三种方式调用 其中开发方式需要使用到 ndk开发 . 我首先记录一下ndk 环境的配置过程.


Mac下配置Android Studio(AS)NDK环境

  1. 首先打开
    这里写图片描述
    将Android NDK 勾选上 之后 点击Apply 点OK 之后AS会自动下载 (有的时候google会突破墙 ,有时候就不可以了 发帖时可以直接下载) 如果打开这个页面的时候卡死 那就 赶紧挂上梯子再弄吧…..
  2. 下载完成之后创建个项目查看local.properties文件中是否配置ndk目录 一般都是有配置的.
    这里写图片描述
  3. 打开项目gradle.properties文件, 添加android.useDeprecatedNdk=true
    这里写图片描述
    至此NDK环境已经配置完成.

Mac下Android Studio生成jni调用h文件

  1. 点击Terminal打开 将终端目录调整到项目的java目录下 例如我的示例目录
    需要输入cd app/src/main/java
    这里写图片描述
  2. 这个时候需要创建一个java文件 进行jni调用 如例子
/** * Created by xyb on 16/2/26 at UHylab * * @version 1.0 */public class OpenCVHelper {    static {        System.loadLibrary("opencv_java3");        System.loadLibrary("OpenCV");    }    public static native int[] gray(int[] buf, int w, int h);}

这里写图片描述

现在我推荐Clean Project下 之后再 Make Project (哎!挺纠结的一个过程)

  1. 在Terminal 中输入 javah -jni com.uhylab.opencv.OpenCVHelper
  2. 查看java目录下生成的.h文件 在main目录下生成jni文件夹将文件放在该目录下
  3. 之后就可以开始写牛逼闪闪的C++ 代码了.. 这段俺不会 继续学吧…..
    此时就要在build.gradle文件的android 块下添加
 sourceSets {        main {            jni {                srcDirs = []            }        }    }    //禁止自带的ndk功能    sourceSets{        main{            jniLibs{                srcDirs = ['src/main/libs','src/main/jniLibs']            }        }    }    //重定向so目录为src/main/libs和src/main/jniLibs,原来为src/main/jniLibs    task ndkBuild(type: Exec, description: 'Compile JNI source with NDK') {        Properties properties = new Properties()        properties.load(project.rootProject.file('local.properties').newDataInputStream())        def ndkDir = properties.getProperty('ndk.dir')        if (org.apache.tools.ant.taskdefs.condition.Os.isFamily(org.apache.tools.ant.taskdefs.condition.Os.FAMILY_WINDOWS)) {            commandLine "$ndkDir/ndk-build.cmd", '-C', file('src/main/jni').absolutePath        } else {            commandLine "$ndkDir/ndk-build", '-C', file('src/main/jni').absolutePath        }    }    tasks.withType(JavaCompile) {        compileTask -> compileTask.dependsOn ndkBuild    }    task ndkClean(type: Exec, description: 'Clean NDK Binaries') {        Properties properties = new Properties()        properties.load(project.rootProject.file('local.properties').newDataInputStream())        def ndkDir = properties.getProperty('ndk.dir')        if (org.apache.tools.ant.taskdefs.condition.Os.isFamily(org.apache.tools.ant.taskdefs.condition.Os.FAMILY_WINDOWS)) {            commandLine "$ndkDir/ndk-build.cmd", 'clean', '-C', file('src/main/jni').absolutePath        } else {            commandLine "$ndkDir/ndk-build", 'clean', '-C', file('src/main/jni').absolutePath        }    }    clean.dependsOn 'ndkClean'

Mac下配置Android Studio(AS)OpenCV环境

  1. 首先使用OpenCV需要去下载库文件 OpenCV4Android
    这里写图片描述

  2. 将下载的文件解压后 在sdk目录下有个native文件夹 将该文件夹复制到工程的根目录下.如图
    这里写图片描述

  3. 在jni文件夹下面创建Android.mk 与 Application.mk 文件 文件内容为
    Android.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)OpenCV_INSTALL_MODULES := onOpenCV_CAMERA_MODULES := offOPENCV_LIB_TYPE :=STATICifeq ("$(wildcard $(OPENCV_MK_PATH))","")include ../../../../native/jni/OpenCV.mkelseinclude $(OPENCV_MK_PATH)endifLOCAL_MODULE := OpenCVLOCAL_SRC_FILES := com_uhylab_opencv_OpenCVHelper.cppLOCAL_LDLIBS +=  -lm -lloginclude $(BUILD_SHARED_LIBRARY)

Application.mk

APP_STL := gnustl_staticAPP_CPPFLAGS := -frtti -fexceptionsAPP_ABI := armeabi armeabi-v7aAPP_PLATFORM := android-15

再创建C++代码文件
我的为com_uhylab_opencv_OpenCVHelper.cpp

//// Created by xyb on 16/2/26.//#include "com_uhylab_opencv_OpenCVHelper.h"#include <stdio.h>#include <stdlib.h>#include <opencv2/opencv.hpp>using namespace cv;extern "C" {JNIEXPORT jintArray JNICALL Java_com_uhylab_opencv_OpenCVHelper_gray(        JNIEnv *env, jclass obj, jintArray buf, int w, int h);JNIEXPORT jintArray JNICALL Java_com_uhylab_opencv_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;}}

ndkBuild创建so文件
这里写图片描述
此时 在Activity中调用方式测试成功.

MainActivity.java
package com.uhylab.opencv;import android.graphics.Bitmap;import android.graphics.drawable.BitmapDrawable;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.widget.ImageView;public class MainActivity extends AppCompatActivity {    private ImageView img;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        img = (ImageView) findViewById(R.id.img);        Bitmap bitmap = ((BitmapDrawable) getResources().getDrawable(                R.mipmap.ic_launcher)).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);    }}

这里写图片描述

再次 感谢yanzi
http://blog.csdn.net/yanzi1225627/article/details/27863615;
安卓弟 http://blog.csdn.net/sbsujjbcy/article/details/49520791 还有各位大神.!
菜鸟敬上!有错误恳请提醒修正 谢谢!
Demo 下载地址 :https://github.com/hongyang51/OpenCV

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 太上长老她在线带娃 猎命人 夫人被迫觅王侯 穿书女配养崽忙 反派摄政王有了读心术,我躺赢了 星际大佬在荒野求生综艺爆红 满级女配在恋爱综艺当咸鱼 救命!战神王爷对我动了情 全球角色等级考核 大雍女提刑 相府逃妾登基了 电竞:荣光归你 撩疯!禁欲傅总嗜我成瘾 惊!废材她捶了天道 病娇战神的醋坛子翻了 当npc成为天降娘亲后她佛了 女主修仙,法力无边 惊!疯批狐王哭着求我摸尾巴 穿成农女后拥有了一整片森林 锦鲤系统:小奶包她欧气爆棚 不可退出 傲娇殿下整天粘着我要入赘 路人甲她又又又上位了 鬼医王妃,带着医毒空间回来复仇 凤落人间千般好 我加载了怪谈游戏 大国体育 薄教授是个护妻狂魔 我在京都贫民巷当神医 我带着游戏账号回古代经商 暴君心尖宠她从天上来 在大理寺卿怀里假意娇嗔 软萌女法师 黑客大佬又被伪装奶狗缠上了 豪门大佬每天都在娱乐圈艰难求生 荒野攻略学长手札 端王殿下又在书房偷看我 我欲修仙,狗皇帝滚边 新鲜!乡下来的小娇娇震惊全球 穿越后,病弱王爷日夜娇哄我 穿成恶毒妃子后,靠弹幕洗白了