#include <QCoreApplication>
#include "opencv2/opencv.hpp"using namespace cv;
using namespace std;
Mat src,dst;
//组装数据
Mat mat_to_samples(Mat &image);
//证件照背景替换
int  main()
{src=imread("../image/1113.jpg");if(src.empty()){printf("could not load image ...");return ;}imshow("src",src);//组装数据Mat points=mat_to_samples(src);//运行KMeansint numCluster=4;Mat labels;Mat centers;TermCriteria criteria=TermCriteria(TermCriteria::EPS+TermCriteria::COUNT,10,0.1);kmeans(points,numCluster,labels,criteria,3,KMEANS_PP_CENTERS,centers);//去背景 +遮罩Mat mask=Mat::zeros(src.size(),CV_8UC1);int index=src.rows*2+2;int cindex=labels.at<int>(index,0);int height=src.rows;int width=src.cols;src.copyTo(dst);for (int row=0;row<height;row++) {for (int col=0;col<width;col++) {index=row*width +col;int label=labels.at<int>(index,0);if(label==cindex)//背景{dst.at<Vec3b>(row,col)[0]=0;dst.at<Vec3b>(row,col)[1]=0;dst.at<Vec3b>(row,col)[2]=0;mask.at<uchar>(row,col)=0;}else{mask.at<uchar>(row,col)=255;}}}imshow("mask",mask);imshow("dst",dst);//腐蚀 + 高斯模糊Mat k=getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));//形态学操作morphologyEx(mask,mask,CV_MOP_CLOSE,k,Point(-1,-1));//erode(mask,mask,k);imshow("erode",mask);GaussianBlur(mask,mask,Size(3,3),0,0);imshow("blur mask",mask);//通道混合Vec3b color;RNG rng;color[0]=rng.uniform(0,255);color[1]=rng.uniform(0,255);color[2]=rng.uniform(0,255);color[0]=0;color[1]=255;color[2]=0;Mat result(src.size(),src.type());double w=0.0;int b=0,g=0,r=0;int b1=0,g1=0,r1=0;int b2=0,g2=0,r2=0;for (int row=0;row<height;row++) {for (int col=0;col<width;col++) {int m=mask.at<uchar>(row,col);if(m==255){result.at<Vec3b>(row,col)=src.at<Vec3b>(row,col);   //前景}else if(m==0){result.at<Vec3b>(row,col)=color;      //背景}else {w=m/255.0;b1=src.at<Vec3b>(row,col)[0];g1=src.at<Vec3b>(row,col)[1];r1=src.at<Vec3b>(row,col)[2];b2=color[0];g2=color[1];r2=color[2];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)[0]=b;result.at<Vec3b>(row,col)[1]=g;result.at<Vec3b>(row,col)[2]=r;}}}imshow("reslut",result);waitkey(0);return 0;}
//组装数据
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(10));int index=0;for (int row=0;row<h;row++) {for (int col=0;col<w;col++) {index=row*w+col;Vec3b bgr=image.at<Vec3b>(row,col);points.at<float>(index,0)=static_cast<int>(bgr[0]);points.at<float>(index,1)=static_cast<int>(bgr[1]);points.at<float>(index,2)=static_cast<int>(bgr[2]);}}return points;}

opencv证件照背景替换相关推荐

  1. 基于python的证件照_python3基于OpenCV实现证件照背景替换

    本文实例为大家分享了python3实现证件照背景替换的具体代码,供大家参考,具体内容如下 import cv2 import numpy as np img=cv2.imread('zjz.jpg') ...

  2. OpenCV之图像分割(五) 证件照背景替换

    算法设计步骤: 代码与注释: /* 流程处理思路: 先通过Kmeans训练,目的为了得到背景像素的一个标记(个人觉得没有这个必要,性价比太低了) 利用这个标记跟证件照的原图进行一波处理,得到背景跟前景 ...

  3. 【Opencv项目实战】背景替换:帮你的证件照换个背景色

    文章目录 方法一.基于removebg的背景替换 1.1.removebg介绍 1.2.环境配置 1.3.算法详解 1.4.实战:单张图片背景替换 1.5.实战:多张图片背景替换 1.6.实战:UI自 ...

  4. 替换证件照背景颜色仅需十行Python代码

    本文教大家通过Python程序替换证件照背景颜色,以后更换证件照背景就不会再苦恼了. 本文教大家通过Python程序替换证件照背景颜色,以后更换证件照背景就不会再苦恼了. 思路: 先去掉原照片的背景颜 ...

  5. c++图片背景替换为白色_4种方法,3秒快速更换证件照背景!你还要去照相馆花冤枉钱吗?...

    搞不懂都2020年了,你们换个证件照底色还跑照相馆的吗? 那不跑照相馆,应该怎么换? "PPT啊!PS啊!手机啊!"那么多方法,还能没有一个适合你用的? 一.电脑端更换底色方法 1 ...

  6. C++OpenCV实现抠除(也可用于更换)证件照背景

    朋友找我帮忙更换证件照背景,因为mac上没装合适的软件,就想用OpenCV搞一下. 源文件我上传了一份:http://download.csdn.net/detail/cy_tec/9526134 使 ...

  7. 【Opencv项目实战】背景替换:动态背景移除与替换(cvzone+MediaPipe)

    文章目录 一.项目思路 二.环境布置 2.1.cvzone安装 2.2.MediaPipe安装 2.3.常见问题 2.4.注意事项 三.算法详解 3.1.segmentor.removeBG():去除 ...

  8. OpenCV C++案例实战六《绿幕视频背景替换》

    OpenCV C++案例实战六<绿幕视频背景替换> 前言 一.图像预处理 二.HSV色彩空间转换 1. cvtColor色彩空间转换 2. inRange抠图 三.背景替换 四.源码 总结 ...

  9. 使用 OpenCV+CVzone 进行实时背景替换

    介绍 OpenCV是一个开源计算机视觉库,可提供播放不同图像和视频流的权限,还有助于端到端项目,如对象检测.人脸检测.对象跟踪等. CVzone是一个计算机视觉包,可以让我们轻松运行像人脸检测.手部跟 ...

最新文章

  1. CSS3初体验之奇技淫巧
  2. poj 1041(欧拉回路+输出字典序最小路径)
  3. 每日一笑 | 3 X 4 = ?
  4. 用 Python 和 werobot 框架开发公众号
  5. tensorflow-reverse(反向传播)
  6. Linux(6)文件和磁盘管理
  7. eeglab使用与错误解决
  8. swiper禁用手动拖拽
  9. python哈姆雷特词频统计_python day 17 文本词频统计
  10. 思科 计算机网络 测试
  11. 英特尔下月将推出双核Atom处理器及配套主板
  12. 【docker-ce】k8s集群docker容器异常重启问题分析
  13. 《圈外课程学习记录》3.1 数据化汇报展示
  14. linux keynav 鼠标可以扔掉了键盘控制鼠标
  15. URL重写实现会话跟踪
  16. 08s01 mysql_Mysql:SQL 错误 [08S01]: Communications link failure
  17. win10亮度调节消失的解决方法
  18. 【已解决】python pymysql报错DataError (1265, Data truncated for column ‘num‘ at row 1)
  19. mysql 校对规则作用_讲讲Mysql中的校对规则究竟是怎么一回事
  20. Tomcat报错系统找不到指定的路径

热门文章

  1. oracle同义词转换不,查询时出现ora-00980:同义词转换不再有效,该怎么处理
  2. 怎么使用计算机开机关机,笔记本电脑怎么开关机_笔记本电脑正确的开关机步骤-win7之家...
  3. 老板客户让加班重做?除了画圈圈诅咒他们,你还可以这么办…
  4. stc单片机 读写flash_3.看懂单片机上的标号
  5. 聊聊新能源汽车国家平台对接
  6. VUE+ElementUI 播放音频
  7. UE4源码下载及VR模式全屏模式黑边问题详细教程
  8. 下载了最新版本flash player,还是不能安装,还是提示版本低(转)
  9. Java--Lambda
  10. hash函数应用(整理)