证件照背景替换
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. springaop\ cglib\ AspectJ

    元编程 vs 动态代理 vs isa代理 springaop的底层实现有两种,一种是jdk的动态代理,另一种是cglib,springaop没有用到aspectj,只是借鉴了它并添加了aspectj风 ...

  2. linu运行级别

    一.介绍 0:关机 1:单用户[找回丢失密码] 2:多用户状态[无网络服务] 3:多用户状态[有网络服务] 4:保留级别 5:图形界面 6:系统重启 二.命令行运行级别 比如说关机 init 0 三. ...

  3. Linux 磁盘分区、挂载

    一.分区介绍 mbr分区: 1.最多支持四个主分区 2.系统只能安装在主分区上 3.扩展分区要占一个主分区 4.mbr最大只支持2TB,但拥有最好的兼容性 gpt分区: 1.支持无限多个主分区(但操作 ...

  4. 《跟我学shiro》

    张开涛<跟我学shiro>博客系列: Shiro目录 第一章  Shiro简介 第二章  身份验证 第三章  授权 第四章  INI配置 第五章  编码/加密 第六章  Realm及相关对 ...

  5. flex下省略号的问题解决

    最近在搞微信小程序,发现flex下使用省略号是没有效果的,而且还会打乱预期的结构,查询statckoverflow知道需要在父级设置min-width:0; 但是在我的尝试下,依然不行,原来在上层父级 ...

  6. Python完全平方数

    python解题源代码如下: import math """ 简述:一个整数,它加上100和加上268后都是一个完全平方数 提问:请问该数是多少? Python解题思路分 ...

  7. pymysql连接

    import pymysql conn=pymysql.connect(host='localhost',user='root',password='123',db='sg',charset='utf ...

  8. 【5】Android Service 与 AIDL

    前言:本系列仅介绍基本大体的使用步骤,而不对每个步骤进行细致的讲解.读者可作为已经对相关内容有所了解后的快速查阅. 一.单应用内Service的使用 Service组件与Activity以IBinde ...

  9. git pull出错:cannot pull into a repository with state: merging_resolved"

    git pull 出错解放办法:1.尝试先提交现有代码到本地,再更新2.git reset —hard

  10. 2019.10.18模拟赛T3

    题目大意: 求$\sum\limits_{i=1}^n\sum\limits_{j=1}^n[lcm(i,j)>n](n\leq 10^{10})$的值. 题解: 这题貌似有n多种做法... 为 ...