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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011608180/article/details/85244329

前面两篇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

扫描二维码关注公众号,回复: 4959181 查看本文章
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

猜你喜欢

转载自blog.csdn.net/u011608180/article/details/85244329