`
mfcai
  • 浏览: 409409 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

深入了解android平台的jni---图像灰度化处理

阅读更多
一、涉及到的jni编程知识
Java基本类型的数组,在JNI中都是jArray的类型格式。具体类型如下:
引用
typedef jarray jbooleanArray;
typedef jarray jbyteArray;
typedef jarray jcharArray;
typedef jarray jshortArray;
typedef jarray jintArray;
typedef jarray jlongArray;
typedef jarray jfloatArray;
typedef jarray jdoubleArray;
typedef jarray jobjectArray;

jArray类型JNI定义的类型,通过它JNIEnv可以操作Java数组,但它并不是C/C++的数组,所以我们要把jArray类型转换为C/C++中的数组。
JNIEnv定义了一系列的方法来把一个jArray类型转换为C/C++数组,和把C/C++数组转换为jArray
1、Java基本类型的数组转换成相应的C数组类型
引用
    jboolean* (*GetBooleanArrayElements)(JNIEnv*, jbooleanArray, jboolean*);
    jbyte*   (*GetByteArrayElements)(JNIEnv*, jbyteArray, jboolean*);
    jchar*   (*GetCharArrayElements)(JNIEnv*, jcharArray, jboolean*);
    jshort*   (*GetShortArrayElements)(JNIEnv*, jshortArray, jboolean*);
    jint*     (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);
    jlong*    (*GetLongArrayElements)(JNIEnv*, jlongArray, jboolean*);
    jfloat*   (*GetFloatArrayElements)(JNIEnv*, jfloatArray, jboolean*);
    jdouble*  (*GetDoubleArrayElements)(JNIEnv*, jdoubleArray, jboolean*);
参数:
env:JNI 接口指针。       
array:Java 字符串对象。       
isCopy:指向布尔值的指针。       
返回值:       
返回指向数组元素的指针,如果操作失败,则为 NULL。
2、获取数组的长度:
     jsize       (*GetArrayLength)(JNIEnv*, jarray);
3、释放C/C++的数组内存
    
引用
void        (*ReleaseBooleanArrayElements)(JNIEnv*, jbooleanArray,jboolean*, jint);
     void        (*ReleaseByteArrayElements)(JNIEnv*, jbyteArray,jbyte*, jint);
     void        (*ReleaseCharArrayElements)(JNIEnv*, jcharArray,jchar*, jint);
     void        (*ReleaseShortArrayElements)(JNIEnv*, jshortArray,jshort*, jint);
     void        (*ReleaseIntArrayElements)(JNIEnv*, jintArray,jint*, jint);
     void        (*ReleaseLongArrayElements)(JNIEnv*, jlongArray,jlong*, jint);
     void        (*ReleaseFloatArrayElements)(JNIEnv*, jfloatArray,jfloat*, jint);
     void        (*ReleaseDoubleArrayElements)(JNIEnv*, jdoubleArray,jdouble*, jint);

参数:       
env:JNI 接口指针。       
array:Java 数组对象。       
elems:指向数组元素的指针。       
mode:释放模式。
4、构造一个指定长度的Java基本类型的数组
    
引用
jbooleanArray (*NewBooleanArray)(JNIEnv*, jsize);
     jbyteArray    (*NewByteArray)(JNIEnv*, jsize);
     jcharArray    (*NewCharArray)(JNIEnv*, jsize);
     jshortArray   (*NewShortArray)(JNIEnv*, jsize);
     jintArray     (*NewIntArray)(JNIEnv*, jsize);
     jlongArray    (*NewLongArray)(JNIEnv*, jsize);
     jfloatArray   (*NewFloatArray)(JNIEnv*, jsize);
     jdoubleArray  (*NewDoubleArray)(JNIEnv*, jsize);

5、给java基本类型的数组赋值
   
引用
void  (*SetBooleanArrayRegion)(JNIEnv*, jbooleanArray,jsize, jsize, const jboolean*);
     void  (*SetByteArrayRegion)(JNIEnv*, jbyteArray,jsize, jsize, const jbyte*);
     void  (*SetCharArrayRegion)(JNIEnv*, jcharArray,jsize, jsize, const jchar*);
     void  (*SetShortArrayRegion)(JNIEnv*, jshortArray,jsize, jsize, const jshort*);
     void  (*SetIntArrayRegion)(JNIEnv*, jintArray,jsize, jsize, const jint*);
     void  (*SetLongArrayRegion)(JNIEnv*, jlongArray,jsize, jsize, const jlong*);
     void  (*SetFloatArrayRegion)(JNIEnv*, jfloatArray,jsize, jsize, const jfloat*);
     void  (*SetDoubleArrayRegion)(JNIEnv*, jdoubleArray, jsize, jsize, const jdouble*);

把java基本类型的数组中的指定范围的元素用C/C++的数组中的元素来赋值
参数:       
env:JNI 接口指针。       
array:  Java 数组。       
start:起始下标。       
len:要复制的元素数。       
buf:源缓冲区。       
抛出:       
ArrayIndexOutOfBoundsException:如果区域中的某个下标无效。
注意:
如果是c程序,要用 (*env)->
如果是C++要用 env->
在linux下如果.c文件中用 “env->” 编译会找不到此结构,必须用“(*env)->”,或者改成.cpp文件,以 c++的方式来编译。
具体请看一下jni.h的代码。另外还有些省略的内容,可以参考JNI的文档:Java Native Interface 6.0 Specification,在JDK的文档里就可以找到。如果要进行更深入的JNI编程,需要仔细阅读这个文档


二、图像灰度化
彩色转灰度的著名心理学公式:Gray = R*0.299 + G*0.587 + B*0.114
实际应用中为了避免浮点运算,然后就有了移位运算代替了。
2至20位精度的系数:
Gray = (R*1 + G*2 + B*1) >> 2
Gray = (R*2 + G*5 + B*1) >> 3
Gray = (R*4 + G*10 + B*2) >> 4
Gray = (R*9 + G*19 + B*4) >> 5
Gray = (R*19 + G*37 + B*8) >> 6
Gray = (R*38 + G*75 + B*15) >> 7
Gray = (R*76 + G*150 + B*30) >> 8
Gray = (R*153 + G*300 + B*59) >> 9
Gray = (R*306 + G*601 + B*117) >> 10
Gray = (R*612 + G*1202 + B*234) >> 11
Gray = (R*1224 + G*2405 + B*467) >> 12
Gray = (R*2449 + G*4809 + B*934) >> 13
Gray = (R*4898 + G*9618 + B*1868) >> 14
Gray = (R*9797 + G*19235 + B*3736) >> 15
Gray = (R*19595 + G*38469 + B*7472) >> 16
Gray = (R*39190 + G*76939 + B*14943) >> 17
Gray = (R*78381 + G*153878 + B*29885) >> 18
Gray = (R*156762 + G*307757 + B*59769) >> 19
Gray = (R*313524 + G*615514 + B*119538) >> 20


三、灰度化代码实现
JNIEXPORT jintArray JNICALL Java_org_join_image_util_JoinImage_imgToGray( 
        JNIEnv* env, jobject obj, jintArray buf, int w, int h) { 
    LOGE("==imgToGray=="); 
 
    jint * cbuf; 
    cbuf = (*env)->GetIntArrayElements(env, buf, 0); // 获取int数组元素 
   
    int alpha = 0xFF; // 不透明值 
    int i, j, color, red, green, blue; 
    for (i = 0; i < h; i++) { 
        for (j = 0; j < w; j++) { 
            color = cbuf[w * i + j]; // 获得color值 
            red = (color >> 16) & 0xFF; // 获得red值 
            green = (color >> 8) & 0xFF; // 获得green值 
            blue = color & 0xFF; // 获得blue值 
            color = (red * 38 + green * 75 + blue * 15) >> 7; // 灰度算法(16位运算下7位精度) 
            color = (alpha << 24) | (color << 16) | (color << 8) | color; // 由ARGB组成新的color值 
            cbuf[w * i + j] = color; // 设置新color值 
        } 
    } 
 
    int size = w * h; 
    jintArray result = (*env)->NewIntArray(env, size); // 新建一个jintArray 
    (*env)->SetIntArrayRegion(env, result, 0, size, cbuf); // 将cbuf转存入result 
    (*env)->ReleaseIntArrayElements(env, buf, cbuf, 0); // 释放int数组元素 
    return result; 
} 




本文欢迎转载,但请注明出处与作者
出处:http://blog.sina.com.cn/staratsky
作者:流星
分享到:
评论

相关推荐

    tess-two-9.1.0-jni-libs.tar.gz

    本文将深入探讨OCR(Optical Character Recognition,光学字符识别)技术,特别是开源库tess-two在Android平台上的应用。tess-two是一个Android版的Tesseract OCR引擎,它为开发者提供了在移动设备上识别图像中的...

    Android JNI图像处理经典例子

    总之,Android JNI图像处理经典例子提供了一个学习如何结合Java和C/C++来优化图像处理流程的平台。通过这种方式,开发者能够提升应用的性能,尤其是在处理大量图像数据时,同时还能深入理解Android的跨语言编程。...

    android使用JNI图片转黑白图片实现二值化

    在Android开发中,有时我们需要对图像进行高效处理,例如将彩色图片转换为黑白图片,或者进一步进行二值化处理。二值化是图像处理的一种重要技术,它将图像中的像素点灰度值转化为两个固定值,通常是0和255,以达到...

    android-ocr-master,android-ocr-master

    2. **图像处理模块**:在识别前,通常需要对图像进行预处理,如灰度化、二值化、噪声去除等,以提高识别率。项目可能包含了这些图像处理算法的实现。 3. **用户界面**:项目提供了用户友好的界面,让用户可以方便地...

    通过jni实现图像处理的demo

    在这个特定的示例中,Java层会有一个接口,用于触发图像的灰度化处理。这个接口可能会包含一个方法,接受Bitmap对象作为参数,返回处理后的Bitmap。Bitmap是Android中用于存储和显示图像的数据结构,它可以是ARGB...

    android使用JNI图片转黑白图片实现点阵图(二值化)

    为android提供的二值化jni库,和完整demo,比Java代码的效率高10s! 一个基于jni的图像处理工具 包括二值化 灰度化 膨胀 腐蚀 等等 是android上图像处理的好例子 还能提高处理速度!实现点阵图的转化

    安卓OCR图像识别相关-驾驶证识别识别图像算法利用jni调用c代码.rar

    本压缩包文件"安卓OCR图像识别相关-驾驶证识别识别图像算法利用jni调用c代码.rar"包含了关于如何在Android平台上实现驾驶证图像的OCR识别的资源,主要涉及了JNI(Java Native Interface)和C/C++原生代码的调用。...

    Android平台的OpenCV图片灰度处理

    在Android平台上进行图像处理时,OpenCV是一个非常强大的开源库,它提供了丰富的图像处理功能,包括但不限于图像转换、滤波、特征检测等。本实例主要关注的是如何利用OpenCV将彩色图片转换为灰度图片,这是一个基本...

    android-image-filter-ndk,使用android ndk在c中处理位图的android示例项目.zip

    《Android NDK与C语言实现图像过滤器的详解》 Android NDK(Native Development ...通过学习该项目,开发者不仅可以掌握Android NDK的使用,还能深入理解图像处理的原理和技巧,为开发高性能的图像应用打下坚实基础。

    Android高级应用源码-最全的OCR图像识别技术源码内有说明.rar

    图像预处理是关键步骤,包括灰度化、二值化、噪声去除等,以提高识别准确率。 4. 图像处理: 在OCR过程中,图像处理是必不可少的步骤。图像预处理旨在优化图像质量,使其更适合OCR识别。这可能包括调整图像亮度和...

    android生成8级灰度图像

    在Android平台上,生成八级灰度图像是一种常见的图像处理任务,尤其在低功耗设备或者简单显示需求的应用中。八级灰度图像指的是使用8种不同的灰度级别来表示图像,每个像素仅用一个字节表示,从0(纯黑)到255(纯白...

    saliency-android:opencv-显着性-android

    在Android平台上,实现图像处理和计算机视觉功能时,OpenCV是一个强大的开源库。"saliency-android:opencv-显着性-android"项目专注于利用OpenCV为Android设备提供图像的显著性检测功能。显著性检测是一种计算机视觉...

    AndroidImage图片二值化jni

    "AndroidImage图片二值化jni"是一个利用JNI(Java Native Interface)技术实现的Android图像处理示例项目,它提供了包括二值化、灰度化、膨胀和腐蚀等图像处理功能。这些功能对于提升图像处理速度,尤其是在处理大量...

    jni测试封装aar图像处理demo

    2. **编写C/C++代码**:使用JNI接口,导入OpenCV库,实现图像处理功能,如灰度化、边缘检测、色彩转换等。 3. **编译JNI库**:使用NDK(Android Native Development Kit)将C/C++代码编译为.so(动态链接库)文件。...

    Android将camera获取到的YuvData在jni中转化为Mat方法

    在jni中,可以使用OpenCV库来进行实时图像处理,例如使用Canny边缘检测算法来处理图像,并将其转化为灰度图像或彩色图像。使用jni可以减少上层转化图像格式的过程,提高图像处理的效率。 八、 Mat构造函数的应用 ...

    opencv-4.9.0-android

    - 图像处理:包括滤波、边缘检测(如Canny、Sobel、Laplacian)、色彩转换(如BGR到灰度、HSV等)、直方图均衡化等。 - 特征检测:如SIFT、SURF、ORB、FAST等,用于图像匹配和物体识别。 - 机器学习:支持SVM、...

    Android+OpenCV -源码IDdect.zip

    在Android平台上,结合OpenCV库进行图像处理和识别任务是一种常见的技术实践,尤其在身份证号码的识别场景中。OpenCV(开源计算机视觉库)是一个强大的工具,它提供了丰富的图像处理和计算机视觉算法,使得开发者...

    opencv-3.4.3-android-sdk.zip

    《OpenCV 3.4.3在Android平台的应用与开发详解》 OpenCV(Open Source Computer Vision Library)是一个开源...通过深入学习OpenCV的API和算法,开发者可以构建出具有智能化视觉功能的Android应用,满足各种创新需求。

    图片灰度化示例(android ndk)

    在Android开发中,有时我们需要对图像进行处理,例如将彩色图像转换为灰度图像。这里我们探讨的主题是如何利用Android NDK(Native Development Kit)和C++来实现这一功能。NDK允许开发者在Android应用中使用原生...

Global site tag (gtag.js) - Google Analytics