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

news2024/12/22 18:58:01

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

       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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/654413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试真题 JavaScript 实现【计算最大乘积】【2022Q4 100分】,附详细解题思路

一、题目描述 给定一个元素类型为小写字符串的数组&#xff0c;请计算两个没有相同字符的元素长度乘积的最大值&#xff0c; 如果没有符合条件的两个元素&#xff0c;返回0。 二、输入描述 输入为一个半角逗号分隔的小写字符串的数组&#xff0c;2 < 数组长度<100&am…

Linux之RPM管理工具

目录 Linux之RPM管理工具 定义 作用 RPM软件包 RPM软件包的经典命名格式 RPM安装 语法格式 参数及作用 有关rpm包相关网站 RPM查询功能 语法格式 参数及作用 案例 rpm软件包安装 软件包升级 rpm软件包卸载 rpm卸载 强制卸载 rpm包签名验证 用途 查看签名 …

程序员如何转型成为个人开发者

作者&#xff1a;哈桑c&#xff08;CSDN平台&#xff09; 文章目录 1、什么是个人开发者&#xff1f;2、个人开发者如何赚钱&#xff1f;3、程序员如何转型成为个人开发者&#xff1f;4、成为个人开发者需要学习哪些技能&#xff1f;结语 1、什么是个人开发者&#xff1f; 个人…

redhat安装oracle11g单实例软件建库

1、打开xmanager-passive 2、oracle 用户登录&#xff0c;开始安装 [rootrhel64 database]# su - oracle [oraclerhel64 ~]$ evn |grep oracle -bash: evn: command not found [oraclerhel64 ~]$ evn | grep oracle -bash: evn: command not found [oraclerhel64 ~]$ env | g…

首次使用云服务器搭建网站(三)

上回说到&#xff0c;我们已经搞定了服务器问题和网站模板问题&#xff0c;接下来只需要上传模板即可。 一、上传网站代码 1、打开宝塔面板&#xff0c; 点开文件、这里就是我们服务器的所有文件了。 2、依次点击WWW文件夹、wwwroot文件夹、域名文件夹&#xff0c;进入…

Python之私有属性、私有方法、装饰器及属性和类的命名规则

一、私有属性和私有方法(实现封装) Python对于类的成员没有严格的访问控制限制&#xff0c;这与其他面向对象语言有区别。关于私有属性和私有方法&#xff0c;有如下要点&#xff1a; 通常我们约定&#xff0c;两个下划线开头的属性是私有的(private)。其他为公共的(public)。…

Centos环境 使用docker 部署MySQL 8.X详细版本

文章目录 安装docker配置docker 阿里镜像加速阿里云容器镜像服务ACR配置镜像源 安装部署MySQL拉取MySQL镜像创建挂载文件测试部署部署MySQL进入容器将它的mysql配置同步给宿主机删除test1测试容器 正式部署MySQL查看正式部署的容器状态配置远程连接字符集以及关闭跳过密码验证等…

Aop详解

AOP简介 AOP是一种编程思想&#xff0c;就如同面向对象这种编程思想一样&#xff0c;是一种编程范式&#xff0c;用来指导开发者如何组织程序更好的运行 AOP&#xff08;面向切面编程&#xff09; 作用&#xff1a;在不改变原代码的前提下&#xff0c;为其增加功能。 连接点…

基于 Yeoman 脚手架技术构建前端项目的实践

NodeJ、CLI 基于 Yeoman 脚手架技术构建前端项目的实践 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details…

torch.optim.lr_scheduler.OneCycleLR 学习与理解

一、功能和参数 1.1、通过图像直观地理解 OneCycleLR 的过程&#xff1a; 补充&#xff1a; 生成该图像的代码&#xff1a; 来自&#xff1a;torch.optim.lr_scheduler.OneCycleLR用法_dxz_tust的博客-CSDN博客 import cv2 import torch.nn as nn import torch from torchv…

Nodejs二、内置模块

零、文章目录 Nodejs二、内置模块 1、fs 文件系统模块 &#xff08;1&#xff09;fs 文件系统模块是什么 fs 模块是 Node.js 官方提供的、用来操作文件的模块。它提供了一系列的方法和属性&#xff0c;用来满足用户对文件的操作需求。 fs.readFile() &#xff1a;用来读取指…

【深度学习-第2篇】CNN卷积神经网络30分钟入门!足够通俗易懂了吧(图解)

网络上有着很多关于CNN入门的教程&#xff0c;但是总还是觉得缺少足够简易、直观、全面的文章&#xff0c;能让人通读下来酣畅淋漓&#xff0c;将CNN概念尽收囊中。本篇文章就想尝试一下&#xff0c;真正地带小白同学们轻松入门。 这篇文章包含很多图片&#xff0c;为了花这些…

k8s-containerd容器运行时默认50G存储位置更换

containerd作为k8s主要的cri&#xff0c;它默认存储位置是使用的/根目录挂载的资源。当容器运行的越来越多&#xff0c;默认的50G不够使用了。有2种方法可以进行解决。 方式1、增加/根分区的磁盘空间。 方式2、修改containerd配置文件&#xff0c;修改默认配置为/home 这里我…

【汤4操作系统】深入理解信号量的使用-三大问题的变体

主要从生产者消费者、读写者、哲学家问题中的经典变体进行讲述&#xff0c;均使用伪代码实现 生产者消费者变体 顾客看作是生产出的产品&#xff0c;理发师看作是消费者&#xff0c;沙发有空位&#xff0c;顾客就进去&#xff0c;沙发有顾客&#xff0c;理发师就去理发 和生产者…

Redis客户端 - Jdies快速入门

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis客户端 - Jdies快速入门 | CoderMast编程桅杆Redis客户端 - Jdies快速入门 简介 Jedis is a Java client for Redis designed for performance and ease of use. Jedis是Redis 的 Java 客户端&#xff0c;专为性能和易…

Python中使用matplotlib绘制各类图表示例

折线图 折线图是一种用于表示数据随时间、变量或其他连续性变化的趋势的图表。通过在横轴上放置时间或如此类似的连续变量&#xff0c;可以在纵轴上放置数据点的值&#xff0c;从而捕捉到数据随时间发生的变化。折线图可以用于比较不同变量的趋势&#xff0c;轻松地发现不同的…

不写代码如果解决Jmeter跨线程组取参数值问题?

目录 前言 定义属性法 文件转接法 总结&#xff1a; 前言 如果你工作中已经在用jmeter做接口测试&#xff0c;或性能测试了&#xff0c;你可能会遇到一个麻烦。 那就是jmeter的变量值不能跨线程组传递。 看&#xff0c;官方就已经给出了解释&#xff1a; 这个不是jmeter的…

机器学习——识别足球和橄榄球

一、选题的背景 橄榄球起源于足球&#xff0c;二者即相似又有所区别。计算机技术发展至今&#xff0c;AI技术也有了极大的进步&#xff0c;通过机器学习不断的训练&#xff0c;AI对于足球和橄榄球的识别能力可以帮助人们对足球和橄榄球的分辨。机器学习是一种智能技术&#xff…

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql

文章目录 一、问题引入 二、问题分析 三、问题解决 ​四、总结 一、问题引入 今天是学习谷粒商城的第一天&#xff0c;既然是第一天&#xff0c;肯定就是先对项目先有个基本的了解&#xff0c;比如是项目所用到的技术栈&#xff0c;项目整体的架构等&#xff0c;还对分布…

操作系统闲谈09——内存管理算法

操作系统闲谈09——内存管理算法 Buddy伙伴系统 假设存在一段连续的页框&#xff0c;阴影部分表示已经被使用的页框&#xff0c;现在需要申请一个连续的5个页框。这个时候&#xff0c;在这段内存上不能找到连续的5个空闲的页框&#xff0c;就会去另一段内存上去寻找5个连续的页…