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

实现步骤

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

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

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

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

alpha融合实现

cpp 复制代码
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);
            }       
        }
    }
}

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

cpp 复制代码
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);
            }       
        }
    }
}
相关推荐
lijgvnns21 分钟前
散户做股票研究与复盘,主流AI工具的场景化使用指南
大数据·人工智能·数据挖掘
weixin_4462608521 分钟前
学习协调偏好用于多目标多智能体强化学习
人工智能·多智能体
财经资讯数据_灵砚智能22 分钟前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年6月15日
大数据·人工智能·python·信息可视化·自然语言处理
云和数据.ChenGuang24 分钟前
人工智能机器学习的偏置项 剖析
人工智能·深度学习·机器学习·数据挖掘
数据皮皮侠AI25 分钟前
上市公司战略性新兴产业专利数据库(2003-2024)
大数据·人工智能·笔记·机器学习·回归
安逸sgr27 分钟前
《图解机器学习-第五章》:过拟合和欠拟合:为什么训练集很好,测试集很差?
人工智能·机器学习
库拉AI小李27 分钟前
# 数据清洗与分析:Gemini 3.5 处理 Excel 数据的实操体验
前端·人工智能·后端
Xiaofeng369330 分钟前
Claude 4.8 提示词工程:结构化输出的5个黄金模板
人工智能
成都易yisdong30 分钟前
上海某平面坐标系与CGCS2000坐标互转详解(含全域拟合点、实战案例、保密规范)
大数据·人工智能·算法
Jump 不二32 分钟前
从 CV 扩散到 NLP:详解 Google DiffusionGemma 架构、推理机制与优劣
人工智能·深度学习·自然语言处理