Android JNI 中使用OpenCV (RGB图像转灰度图像)

前面两篇blog:

1.Android 获取Camera图像数据:https://blog.csdn.net/u011608180/article/details/85072252

2.Android NDK 开发:https://blog.csdn.net/u011608180/article/details/85063634

本篇blog的内容是:如何在JNI中使用OpenCV处理Camera图像数据,然后简单demo一下将rgb图像转化为gray图像,并保存。

步骤一:定义JNI接口:

public native boolean cvtColor(byte[] inputArray,int width,int height,int code);

步骤二:参考 Android NDK开发 生成头文件 。

步骤三:编写Android.mk 文件,具体如下:(注:OpenCV.mk 的路径是我本机的路径,修改成你自己的路径)

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

OpenCV_INSTALL_MODULES:=on
include /home/tony/work/opencv/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk


LOCAL_MODULE := vision_lib
LOCAL_SRC_FILES := ImageProcess.cpp

LOCAL_LDLIBS    += -llog

include $(BUILD_SHARED_LIBRARY)

步骤四:添加ImageProcess.cpp文件,引入OpenCV 头文件。(注:cpp名称可以自己起)

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

 将Android 层获取到的Camera数据通过JNI传递到cpp,并转化成OpenCV Mat矩阵,具体代码如下:

JNIEXPORT jboolean JNICALL Java_com_abilix_colorblob_follow_ComputerVisionInterface_cvtColor
  (JNIEnv *env, jobject thiz, jbyteArray imageData, jint imageWidth, jint imageHeight, jint code)
{
   jbyte *p_imageData = env->GetByteArrayElements(imageData, NULL);
   if(NULL == p_imageData) {
       env->ReleaseByteArrayElements(imageData, p_imageData, 0);
       return false;
   }

   unsigned char *imageCharData = (unsigned char*)p_imageData;

   Mat frame = Mat((int)(imageHeight * 1.5), imageWidth, CV_8UC1, imageCharData);
   cvtColor(frame, frame, CV_YUV420sp2BGR);

   env->ReleaseByteArrayElements(imageData, p_imageData, 0);
   return true;
}

灰度化处理数据:

Mat gray;
cvtColor(frame, gray, CV_BGR2GRAY);

保存灰度图片到sdcard

imwrite("/sdcard/DCIM/Camera/save.jpg", gray);

步骤五:Android 层代码加载so库(和定义Native方法在同一个java文件中)

    static {
        System.loadLibrary("vision_lib");
        System.loadLibrary("opencv_java");
    }

步骤六:在Camera 的 setPreviewCallback中获取到Camera数据,并传递到JNI层。

mCamera.setPreviewCallback(new Camera.PreviewCallback() {
    @Override
    public void onPreviewFrame(byte[] bytes, Camera camera) {
        Log.e("onPreviewFrame","bytes size:"+bytes.length);
        final boolean flag = computerVisionInterface.cvtColor(bytes,320,240,1);
    }
});

步骤七:设置Android 的相关权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

打包运行:

步骤八:取出sdcard中保存的图片

adb pull /sdcard/DCIM/Camera/ ~

查看图片:

eog save.jpg

 

 

 

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值