android端基于openCV给图片打马赛克

2024-06-15 10:48

本文主要是介绍android端基于openCV给图片打马赛克,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近一直在捣腾openCV,看到别人朋友圈总喜欢给图片打一点马赛克,充满神秘感。准备用openCV来实现打码,其实足够模糊就能实现马赛克效果。查看API发现ImgProc模块提供四种模糊方法:高斯模糊、均值模糊、中值模糊、双边滤波。在这里主要比较高斯模糊、均值模糊以及自定义覆盖层的实现效果。

首先,各种初始化:openCV库、模糊线程、人脸检测器。

    /*** 初始化openCV*/private void initOpenCV(){boolean result = OpenCVLoader.initDebug();if(result){Log.i(TAG, "initOpenCV success...");}else {Log.e(TAG, "initOpenCV fail...");}}/*** 初始化mat*/private void initMat(){mat = new Mat();bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.beauty);Utils.bitmapToMat(bitmap, mat);}/*** 初始化线程*/private void initThread(){blurThread = new BlurThread(mHandler, blurMat);blurThread.start();blurThread.setRunning(true);}/*** 初始化人脸检测器* @param context context*/public void initDetector(Context context){mFaceRect = new MatOfRect();mFaceDetector = new ObjectDetector(context, R.raw.lbpcascade_frontalface,6, 0.2F, 0.2F,new Scalar(0, 0, 255, 0));}
使用人脸检测器去检测人脸,得到待打码区域:

    /*** 检测人脸*/private void detectFace(){Mat mGray = new Mat();Imgproc.cvtColor(mat, mGray, Imgproc.COLOR_RGBA2GRAY);Rect[] faceRect = mFaceDetector.detectObject(mGray, mFaceRect);if(faceRect != null && faceRect.length > 0){Rect face = faceRect[0];//矩形标识Imgproc.rectangle(mat, face.tl(), face.br(),mFaceDetector.getRectColor(), 3);//待打码区域blurMat = mat.submat((int) face.tl().y, (int) face.br().y, (int) face.tl().x, (int) face.br().x);}mGray.release();mHandler.obtainMessage(100).sendToTarget();}


1、高斯模糊

高斯模糊是采用高斯核函数,创建高斯滤波器,遍历待滤波区域:每一个像素与给定像素矩阵模板相乘,求线性加权平均点。

    //高斯模糊private void gaussianBlur(int width, int height,double sigmaX){Imgproc.GaussianBlur(blurMat, blurMat, new Size(width, height), sigmaX);}


2、均值模糊

均值模糊是对给定像素矩阵取平均值,算法比高斯模糊简单点,耗时相对短一点。

    //均值模糊private void normalBlur(int width, int height){Imgproc.blur(blurMat, blurMat, new Size(width, height));}

3、深度模糊(自定义覆盖层)

自定义模糊算法相对简单:遍历待处理区域,重新赋值为指定颜色值。

    //自定义模糊private void customBlur(int color){//ARGB转成RGBApixelColor[2] = color & 0xFF;//BluepixelColor[1] = (color >> 8) & 0xFF;//GreenpixelColor[0] = (color >> 16) & 0xFF;//RedpixelColor[3] = (color >> 24) & 0xFF;//Alphafor (int x=0; x<blurMat.rows(); x++){for (int y=0; y<blurMat.cols(); y++){blurMat.put(x, y, pixelColor);}}}

如果需要在预览时,可采用均值模糊进行实时打码(高斯模糊耗时比较长,引起预览卡顿):

    @Overridepublic Mat onCameraFrame(CvCameraViewFrame inputFrame) {mRgba = inputFrame.rgba();mGray = inputFrame.gray();// 检测人脸Rect[] faceRect = mFaceDetector.detectObject(mGray, mFaceRect);if(faceRect != null && faceRect.length > 0){Rect face = faceRect[0];//采用均值模糊进行打码Mat blurMat = mRgba.submat((int) face.tl().y, (int) face.br().y, (int) face.tl().x, (int) face.br().x);Imgproc.blur(blurMat, blurMat, new Size(99, 99));}return mRgba;}
好了,关于采用高斯模糊、均值模糊以及自定义覆盖层给图片打码分析完毕。如果各位有什么问题或建议,欢迎交流,如果觉得本篇文章对您有所帮助,麻烦点个赞。。。


这篇关于android端基于openCV给图片打马赛克的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1063239

相关文章

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

Python如何将OpenCV摄像头视频流通过浏览器播放

《Python如何将OpenCV摄像头视频流通过浏览器播放》:本文主要介绍Python如何将OpenCV摄像头视频流通过浏览器播放的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完... 目录方法1:使用Flask + MJPEG流实现代码使用方法优点缺点方法2:使用WebSocket传输视

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪