证件照背景替换
K-Means
背景融合 – 高斯模糊
遮罩层生成
#include <opencv2/opencv.hpp>
#include <iostream> using namespace cv;
using namespace std; Mat mat_to_samples(Mat &image);
int main(int argc, char** argv) {
Mat src = imread("D:/images/toux.jpg");
if (src.empty()) {
printf("could not load image...\n");
return -;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src); // 组装数据
Mat points = mat_to_samples(src); // 运行KMeans
int numCluster = ;
Mat labels;
Mat centers;
TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, , 0.1);
kmeans(points, numCluster, labels, criteria, , KMEANS_PP_CENTERS, centers); // 去背景+遮罩生成
Mat mask = Mat::zeros(src.size(), CV_8UC1);
int index = src.rows * + ;
int cindex = labels.at<int>(index, );
int height = src.rows;
int width = src.cols;
//bian
for (int row = ; row < height; row++) {
for (int col = ; col < width; col++) {
index = row * width + col;
int label = labels.at<int>(index, );
if (label == cindex) { // 背景
mask.at<uchar>(row, col) = ;
}
else {
mask.at<uchar>(row, col) = ;
}
}
}
//imshow("mask", mask); // 腐蚀 + 高斯模糊
Mat k = getStructuringElement(MORPH_RECT, Size(, ), Point(-, -));
erode(mask, mask, k);
//imshow("erode-mask", mask);
GaussianBlur(mask, mask, Size(, ), , );
//imshow("Blur Mask", mask); // 通道混合
RNG rng();
Vec3b color;
color[] = ; // rng.uniform(0, 255);
color[] = ; // rng.uniform(0, 255);
color[] = ; // rng.uniform(0, 255);
Mat result(src.size(), src.type()); double w = 0.0;
int b = , g = , r = ;
int b1 = , g1 = , r1 = ;
int b2 = , g2 = , r2 = ; for (int row = ; row < height; row++) {
for (int col = ; col < width; col++) {
int m = mask.at<uchar>(row, col);
if (m == ) {
result.at<Vec3b>(row, col) = src.at<Vec3b>(row, col); // 前景
}
else if (m == ) {
result.at<Vec3b>(row, col) = color; // 背景
}
else {
//权重
w = m / 255.0;
b1 = src.at<Vec3b>(row, col)[];
g1 = src.at<Vec3b>(row, col)[];
r1 = src.at<Vec3b>(row, col)[]; b2 = color[];
g2 = color[];
r2 = color[]; b = b1 * w + b2 * (1.0 - w);
g = g1 * w + g2 * (1.0 - w);
r = r1 * w + r2 * (1.0 - w); result.at<Vec3b>(row, col)[] = b;
result.at<Vec3b>(row, col)[] = g;
result.at<Vec3b>(row, col)[] = r;
}
}
}
imshow("背景替换", result); waitKey();
return ;
} Mat mat_to_samples(Mat &image) {
int w = image.cols;
int h = image.rows;
int samplecount = w * h;
int dims = image.channels();
Mat points(samplecount, dims, CV_32F, Scalar()); int index = ;
for (int row = ; row < h; row++) {
for (int col = ; col < w; col++) {
index = row * w + col;
Vec3b bgr = image.at<Vec3b>(row, col);
points.at<float>(index, ) = static_cast<int>(bgr[]);
points.at<float>(index, ) = static_cast<int>(bgr[]);
points.at<float>(index, ) = static_cast<int>(bgr[]);
}
}
return points;
}

opencv::证件照背景替换的更多相关文章

  1. PS更换证件照背景颜色

    同学们大家好,我是阿宝老师,今天给大家讲一下如何使用PS更换证件照背景色. 目前使用PS更换证件照底片有三种方式,这三种方式虽有不同,但是最终目的都是将人像从背景中抠出来.扣取人像有三种方法可供选取, ...

  2. opencv高斯背景建模

    #include <iostream> #include <string> #include <opencv2/opencv.hpp> int main(int a ...

  3. 如何利用PS将照片背景替换为白色

    需求:将照片中的蓝底换成白底: 操作步骤: 1.打开图片,点击背景图层: 2.利用套索,选中除背景外的区域: 3.右键,反选: 4.填充为“白色”,确定,保存:

  4. [OpenCV] Samples 13: opencv_version

    cv::CommandLineParser的使用. I suppose CommandLineParser::has("something") should be true whe ...

  5. 如何更改图片的背景色(PS、证件照之星)

    如何更改图片的背景色(PS.证件照之星) 1.1  证照之星教你如何给证件照换背景 证照之星教你如何给证件照换背景?这个问题困扰很多人,如果你不了解证照之星,一款专业的证件照片制作软件,你肯定就无法自 ...

  6. [OpenCV] Samples 15: Background Subtraction and Gaussian mixture models

    不错的草稿.但进一步处理是必然的,也是难点所在. Extended: 固定摄像头,采用Gaussian mixture models对背景建模. OpenCV 中实现了两个版本的高斯混合背景/前景分割 ...

  7. opencv3更换图片背景

    #include <opencv2/opencv.hpp>#include <iostream> using namespace std;using namespace cv; ...

  8. 如何在pyqt中通过OpenCV实现对窗口的透视变换

    窗口的透视变换效果 当我们点击UWP应用中的小部件时,会发现小部件会朝着鼠标点击位置凹陷下去,而且不同的点击位置对应着不同的凹陷情况,看起来就好像小部件在屏幕上不只有x轴和y轴,甚至还有一个z轴.要做 ...

  9. Kinect For Windows V2开发日志七:照片合成与背景消除

    上一篇里讲到了Kinect可以从环境中区分出人体来.因此可以利用这个功能,来把摄像头前的人合成进照片里,和利用Photoshop不同的是,这样合成进去的人是动态且实时的. 简单的思路 BodyInde ...

随机推荐

  1. Asp .Net Core Excel导入和导出

    ASP .Net Core使用EPPlus实现Api导入导出,这里使用是EPPlus 4.5.2.1版本,.Net Core 2.2.在linux上运行的时候需要安装libgdiplus . 下面我们 ...

  2. RabbitMQ与Spring的框架整合之Spring Cloud Stream实战

    1.RabbitMQ与Spring Cloud Stream整合实战.SpringCloud Stream整体结构核心概念图,如下所示: 图示解释:Outputs输出,即消息的发送端.Inputs输入 ...

  3. SAP 表汇总

    SAP 表整理:VBKPF-预制凭证抬头表: VBKPF-预制凭证抬头表 VBKPF-预制凭证抬头表 VBSEG-预制凭证行项目表: VBSEG-预制凭证行项目表 VBSEG-预制凭证行项目表 VBS ...

  4. 更改组织属性-以更改maxrecordsforexporttoexcel为例

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复232或者20161101可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  5. tomcat9启动后控制台输出乱码问题

    修改Tomcat9下 /conf/logging.properties 文件 找到java.util.logging.ConsoleHandler.encoding=utf-8 改成GBK 或者注释掉

  6. Saltstack_使用指南17_salt-ssh

    1. 主机规划 salt 版本 [root@salt100 ~]# salt --version salt (Oxygen) [root@salt100 ~]# salt-minion --versi ...

  7. dubbo解决本地开发直连

    问题: 在如今的分布式项目开发中,zookeeper + dubbo是最常见的,通常的使用是用zookeeper做注册中心,dubbo做rpc,然后服务部署就可以实现相互之间的远程通信.所以开发项目时 ...

  8. PHP转Go系列:map映射

    映射的定义 初识映射会很懵,因为在PHP中没有映射类型的定义.其实没那么复杂,任何复杂的类型在PHP中都可以用数组表示,映射也不例外. $array['name'] = '平也'; $array['s ...

  9. HTTPS配置,SSL证书配置

    阿里云SSL证书配置: Appache服务器:https://help.aliyun.com/knowledge_detail/95493.html Tomcat服务器:https://help.al ...

  10. ssm-restful风格

    码云 https://gitee.com/MarkPolaris/ssm-test02