当前位置: 首页 > news >正文

opencv进阶 ——(十一)基于RMBG实现生活照生成寸照

实现步骤

1、检测人脸,可以使用opencv自带的级联分类器或者dlib实现人脸检测

2、放大人脸范围,调整到正常寸照尺寸

3、基于RMGB算法得到人像掩码

4、生成尺寸相同的纯色背景与当前人像进行ALPHA融合即可

alpha融合实现

void alphaBlend(cv::Mat& fgImg, cv::Mat& roi, cv::Mat& mask)
{for (int i = 0; i < roi.rows; i++){for (int j = 0; j < roi.cols; j++){auto maskVal = (float)mask.at<uchar>(i, j)/255;for (size_t n = 0; n < 3; n++){   roi.at<cv::Vec3b>(i, j)[n] = fgImg.at<cv::Vec3b>(i, j)[n]*maskVal + roi.at<cv::Vec3b>(i, j)[n]*(1-maskVal);}       }}
}

如果原图是纯色背景,那么扣取的图片可能存在部分边界色,可以通过一下滤波函数处理一下边界

void filterBoundary(cv::Mat& roi, cv::Mat& mask)
{cv::Mat kernel = (cv::Mat_<double>(3, 3) << 1, 2, 1, 2, 4, 2, 1, 2, 1);kernel /= 16.0; // 归一化int sz = 1;for (int i = 0; i < roi.rows; i++){for (int j = 0; j < roi.cols; j++){auto maskVal = (float)mask.at<uchar>(i, j);if (maskVal < 255 && maskVal > 0){int left = MAX(j - sz, 0);int right = MIN(j + sz, roi.cols - 1);int top = MAX(i - sz, 0);int bottom = MIN(i + sz, roi.rows - 1);auto tmpRoi = roi(cv::Rect(left, top, right - left + 1, bottom - top + 1));cv::filter2D(tmpRoi, tmpRoi, -1, kernel);}       }}
}

相关文章:

  • 【相关概念】经济金融中的Momentum
  • Base64前端图片乱码转换
  • Qt——升级系列(Level Two):Hello Qt 程序实现、项目文件解析、Qt 编程注意事项
  • 线性回归模型
  • docker 命令 ps,inspect,top,logs详解
  • Python 使用全局变量:深入探索与实战指南
  • Pycharm SSH远程连接时出现报错,测试 SFTP 连接,连接到 ‘connect.westb.seetacloud.com‘ 失败
  • React Router v5 和 v6 中,路由对象声明方式有什么区别?
  • 腾讯云centos上安装docker
  • 在LabVIEW项目管理中,如何确保团队之间的有效沟通和协作
  • 算法题day37日(补5.23日卡:贪心算法day4)
  • 【DevOps】网络安全进阶之路:打造更安全、更可靠的网站
  • C语言笔记第10篇:内存函数
  • 【动手学深度学习】卷积神经网络(AlexNet)的研究详情
  • Java——Stream流(2/2):Stream流的中间方法、终结方法(方法、案例演示)
  • [NodeJS] 关于Buffer
  • CSS 专业技巧
  • DataBase in Android
  • eclipse(luna)创建web工程
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • happypack两次报错的问题
  • unity如何实现一个固定宽度的orthagraphic相机
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • XForms - 更强大的Form
  • 分布式熔断降级平台aegis
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 异步
  • Nginx实现动静分离
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​水经微图Web1.5.0版即将上线
  • $(selector).each()和$.each()的区别
  • (1)(1.11) SiK Radio v2(一)
  • (三分钟)速览传统边缘检测算子
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (十) 初识 Docker file
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)c++ std::pair 与 std::make
  • (转)setTimeout 和 setInterval 的区别
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .FileZilla的使用和主动模式被动模式介绍
  • .gitignore
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET/C# 使窗口永不获得焦点
  • .NET构架之我见
  • .NET面试题(二)
  • .NET项目中存在多个web.config文件时的加载顺序
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @Documented注解的作用
  • @staticmethod和@classmethod的作用与区别