2023-06-16 Android app 使用opencv 调用jni在图片上添加文字,对图片进行模糊处理,源码实例学习。

一、要理解还是得自己看代码

       1.1 完整的测试代码路径如下

https://download.csdn.net/download/qq_37858386/87916944

       1.2 代码架构 

       1.3 app 运行效果

二、android studio 添加 opencv module可以参考下面的文章,比较详细。

Android + OpenCV 入门教程笔记(保姆级)_opencv android_派的十二位的博客-CSDN博客

三、按上面的添加opencv 模块后,添加文字,方法一,不需要另外添加jni。这个方法主要参考下面文章Android App开发超实用实例 | OpenCV在Android手机实现在图像上添加文本_opencv手机版_TiAmo zhang的博客-CSDN博客

1、添加下面的代码就可以在图片上添加文字。

        myImageView = (ImageView) findViewById(R.id.img_picture);
        myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.win);
       // myImageView.setImageBitmap(myBitmap);

        Bitmap myNewBitmap=Bitmap.createBitmap(myBitmap.getWidth(),
                myBitmap.getHeight(),Bitmap.Config.RGB_565); //根据原始图像创建空Bitmap
        Mat myMat=new Mat();
        Utils.bitmapToMat(myBitmap,myMat);                //将原始图像保存至myMat
        Point myPoint=new Point(0, 100);                //定义绘制文本的起始位置
        Scalar myScalar=new Scalar(255,0,0,0);              //设置绘制文本的颜色
        //在图像上添加文本(仅支持英文、符号等,中文暂不支持)
        Imgproc.putText(myMat,"I Love OpenCV",myPoint,
                1,5,myScalar,3);
        //将添加文本之后的图像输出至myNewBitmap
        Utils.matToBitmap(myMat,myNewBitmap);
        //通过ImageView控件显示叠加文本之后的图像

        //myNewBitmap.
        myImageView.setImageBitmap(myNewBitmap);


    static{
        System.loadLibrary("opencv_java4");
    }

2、效果图如下。

四、方法二、使用jni 调用opencv 实现在图片上添加文字。主要参考下面文章【安卓随笔】引入OpenCV进行NDK开发之图片传递(案例:文字水印)_vicemiami的博客-CSDN博客

      1、java 主要代码


                Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.win);
                int w = bmp.getWidth();
                int h = bmp.getHeight();
                int[] pixels = new int[w * h];
                bmp.getPixels(pixels, 0, w, 0, 0, w, h);
                String content = "I love New zealand";
                int[] resultInt = addText2Picture(pixels, w, h, content);
                if (resultInt != null) {
                    Bitmap resultImg = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
                    resultImg.setPixels(resultInt, 0, w, 0, 0, w, h);
                    myImageView.setImageBitmap(resultImg);
                }
            }

      2、jni 代码

JNIEXPORT jintArray JNICALL
Java_com_hypernano_opencvdemo_MainActivity_addText2Picture(
        JNIEnv *env,
        jobject, jintArray pixels_,
        jint w, jint h, jstring textString) {

    const char *text = env->GetStringUTFChars(textString, 0);
    string content = text;

    jint *pixels = env->GetIntArrayElements(pixels_, NULL);
    if (pixels == NULL) {
        return NULL;
    }

    Mat src(h, w, CV_8UC4, pixels);
    int width = src.cols;
    int height = src.rows;
    int margin = 10;
    int baseline;
    Size srcSize = getTextSize(content, FONT_HERSHEY_COMPLEX, 2, 2, &baseline);
    cv::Point point;
    point.x = width - srcSize.width - margin;
    point.y = height - margin;
    //Scalar BGR
    putText(src, content, point, FONT_HERSHEY_COMPLEX, 2, cv::Scalar(94, 206, 165, 255), 2, 8, 0);
    int size = w * h;
    jintArray result = env->NewIntArray(size);
    env->SetIntArrayRegion(result, 0, size, pixels);
    env->ReleaseIntArrayElements(pixels_, pixels, 0);
    env->ReleaseStringUTFChars(textString, text);
    return result;
}

3、效果图

五、对图片进行模糊处理效果,主要参考下面的文章

Android引入OpenCV的示例_Android_脚本之家

1、java部分的主要代码

                Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.win);
                int w = srcBitmap.getWidth();
                int h = srcBitmap.getHeight();
                int[] pixels = new int[w*h];
                srcBitmap.getPixels(pixels,0,w,0,0,w,h);
                int[] outPixels = getBlurImage(pixels ,w,h);
                Bitmap destBitmap = Bitmap.createBitmap(w,h, Bitmap.Config.ARGB_8888);
                destBitmap.setPixels(outPixels,0,w,0,0,w,h);
                myImageView = (ImageView) findViewById(R.id.img_picture);
                myImageView.setImageBitmap(destBitmap);

2、jni 部分主要代码

JNIEXPORT jintArray JNICALL
//Java_com_live_longsiyang_opencvdemo_OpenCVNativeManager_getBlurImage
Java_com_hypernano_opencvdemo_MainActivity_getBlurImage
    (JNIEnv *env, jobject thiz,jintArray pixels_, jint w,jint h) {

    int colorType = CV_8UC4;
    jint *pixels = env->GetIntArrayElements(pixels_, NULL);

    Mat imgMat(h, w, colorType, pixels);
    Mat out(h, w, colorType);
    blur(imgMat, out, Size(20, 20));
    env->ReleaseIntArrayElements(pixels_, pixels, 0);
    int *outIntImage = new int[w * h];
    for (int i = 0; i < w * h; i++) {
        int a, r, g, b;
        for (int j = 0; j < 4; j++) {
            a = out.data[i * 4 + 3];
            r = out.data[i * 4 + 2];
            g = out.data[i * 4 + 1];
            b = out.data[i * 4 + 0];
            outIntImage[i] = (int) out.data[i * 4 + j];
        }
        outIntImage[i] = MAKE_ARGB(a,r,g,b);

    }
    jintArray result = env->NewIntArray(w * h);
    env->SetIntArrayRegion(result, 0, w * h, outIntImage);
    return result;

}

3、效果图,可以看到图片已经模糊

六、参考文章

android 图片添加暗水印 - 掘金

Android引入OpenCV的示例_Android_脚本之家

用opencv在图片上面添加水印_添加水印opencv qt_三火哥的博客-CSDN博客

Android OpenCV实现图片叠加,水印_xkyle的博客-CSDN博客

Android + OpenCV 入门教程笔记(保姆级)_opencv android_派的十二位的博客-CSDN博客

OpenCV download | SourceForge.net

安卓用jni对接opencv踩坑记_"the imported target \"libcpufeatures\" references_IceGost的博客-CSDN博客

Android 配置 OpenCV环境(Android Stdio 4.1.3 openCV 4.5.5)_opencv环境 androis_HGGshiwo的博客-CSDN博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android使用JNI调用OpenCV库来实现摄像头功能是可行的。以下是调用摄像头的简单步骤: 首先,你需要在Android项目中集成OpenCV库。可以通过将OpenCV添加到Gradle依赖项或手动导入库文件来完成。 其次,创建一个JNI接口,将Java代码与C/C++代码进行绑定。JNI接口允许在Java和C/C++之间进行双向通信。 然后,在C/C++代码中编写与摄像头相关的功能。可以使用OpenCV提供的函数和类来处理视频流。例如,你可以使用VideoCapture类打开摄像头并获取图像帧。 接下来,在JNI接口中实现调用摄像头的功能。通过JNI接口,将Java代码的请求传递给C/C++函数来执行摄像头操作。你可以设置一个循环,不断从摄像头读取图像帧并进行处理。 最后,在Java代码调用JNI接口中的方法来启动摄像头。可以使用SurfaceView来显示摄像头捕获的图像。你可以使用Camera类来控制摄像头的预览以及其他设置。 需要注意的是,在JNI和C/C++代码处理摄像头操作时,要遵循正确的线程管理和图像处理技术,以确保流畅的手机摄像头应用程序。 总之,通过JNI调用OpenCV库,可以很方便地在Android上实现摄像头功能。项目中要同时涉及Java和C/C++代码,需要进行正确的接口绑定和线程管理。这样,你可以轻松地使用OpenCV函数和类来处理摄像头操作并实现自己的摄像头应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值