opencv::证件照背景替换
证件照背景替换
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::证件照背景替换的更多相关文章
- PS更换证件照背景颜色
同学们大家好,我是阿宝老师,今天给大家讲一下如何使用PS更换证件照背景色. 目前使用PS更换证件照底片有三种方式,这三种方式虽有不同,但是最终目的都是将人像从背景中抠出来.扣取人像有三种方法可供选取, ...
- opencv高斯背景建模
#include <iostream> #include <string> #include <opencv2/opencv.hpp> int main(int a ...
- 如何利用PS将照片背景替换为白色
需求:将照片中的蓝底换成白底: 操作步骤: 1.打开图片,点击背景图层: 2.利用套索,选中除背景外的区域: 3.右键,反选: 4.填充为“白色”,确定,保存:
- [OpenCV] Samples 13: opencv_version
cv::CommandLineParser的使用. I suppose CommandLineParser::has("something") should be true whe ...
- 如何更改图片的背景色(PS、证件照之星)
如何更改图片的背景色(PS.证件照之星) 1.1 证照之星教你如何给证件照换背景 证照之星教你如何给证件照换背景?这个问题困扰很多人,如果你不了解证照之星,一款专业的证件照片制作软件,你肯定就无法自 ...
- [OpenCV] Samples 15: Background Subtraction and Gaussian mixture models
不错的草稿.但进一步处理是必然的,也是难点所在. Extended: 固定摄像头,采用Gaussian mixture models对背景建模. OpenCV 中实现了两个版本的高斯混合背景/前景分割 ...
- opencv3更换图片背景
#include <opencv2/opencv.hpp>#include <iostream> using namespace std;using namespace cv; ...
- 如何在pyqt中通过OpenCV实现对窗口的透视变换
窗口的透视变换效果 当我们点击UWP应用中的小部件时,会发现小部件会朝着鼠标点击位置凹陷下去,而且不同的点击位置对应着不同的凹陷情况,看起来就好像小部件在屏幕上不只有x轴和y轴,甚至还有一个z轴.要做 ...
- Kinect For Windows V2开发日志七:照片合成与背景消除
上一篇里讲到了Kinect可以从环境中区分出人体来.因此可以利用这个功能,来把摄像头前的人合成进照片里,和利用Photoshop不同的是,这样合成进去的人是动态且实时的. 简单的思路 BodyInde ...
随机推荐
- C#构造函数、属性的应用
using System; using System.Collections.Generic; using System.Text; namespace test { class Program { ...
- 汇总:ASP.NET Core中HttpContext获取传参数据,有哪些方式
一.原生方式: 1.POST(以ajax请求为案例,教大家用法) $.ajax({ type: "post", dataType: "json", cache: ...
- Web前端基础(13):JavaScript(七)
1. BOM JavaScript基础分为三部分: ECMAScript:JavaScript的语法标准.包括变量.表达式.运算符.函数.if语句.for语句等. DOM:文档对象模型,操作网页上的元 ...
- Oracle merge into的优势
简介 Oracle merge into命令,顾名思义就是“有则更新,无则插入”,这个也是merge into 命令的核心思想,在实际开发过程中,我们会经常遇到这种通过两表互相关联匹配更新其中一个表的 ...
- SSM框架之Mybatis(5)数据库连接池及事务
Mybatis(5)数据库连接池及事务 1.Mybatis连接池 Mybatis 中也有连接池技术,但是它采用的是自己的连接池技术.在 Mybatis 的 SqlMapConfig.xml 配置文 ...
- Cobalt Strike系列教程第五章:截图与浏览器代理
Cobalt Strike系列教程分享如约而至,新关注的小伙伴可以先回顾一下前面的内容: Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...
- iOS多线程定时器
在使用定时器时,我们经常使用NSTimer,但是由于NSTimer会受RunLoop影响,当RunLoop处理的任务很多时,就会导致NSTimer的精度降低,所以在一些对定时器精度要求很高的情况下,应 ...
- mysql忧化参数
转自 https://blog.51cto.com/tongcheng/1710265以下参数是在mysql-5.6.27中使用,可能mysql版本不同使用方法不一样1.线程参数innodb_read ...
- mysql5.7 Multiple-Column Indexes 多列索引(二)
场景一: 复合索引的替代方法,对多列字段拼接做hash,引入一个hashed 字段,对此字段添加索引,可以做到复合索引查询速度快,例: SELECT * FROM tbl_name WHERE has ...
- Scrapy 下载图片时 ModuleNotFoundError: No module named'PIL'
使用scrapy的下载模块需要PIL(python图像处理模块)的支持,使用pip安装即可