之前看到码农大佬分享的文章,感觉是个小乐子,就自己动手做了个小软件,方便还没学会PS的小伙伴们临时换背景Hhhh~

资源索引:
这里是具体的步骤实现[VS2017]图像处理——给证件照换背景
这里是证件照换背景程序
这里是证件照换背景程序源码

软件操作如GIF图所示:

新建Qt的项目文件~
.h中:

#include <QWidget>
#include <QDebug>#include <QFile>
#include <QFileDialog>#include <iostream>
using namespace std;#include <opencv.hpp>
using namespace cv;public:Widget(QWidget *parent = nullptr);~Widget();Mat img,img_show,input_output;bool oldBG_Blue,oldBG_Red;bool newBG_Blue,newBG_Red,newBG_White;QImage QImg;Mat InputImg;QString file_path;string file;void DealPicture(Mat image);QImage cvMat2QImage(const cv::Mat& mat);cv::Mat QImage2cvMat(QImage image);private slots:void on_radioButton_oldBG_Red_clicked();void on_radioButton_oldBG_Blue_clicked();void on_radioButton_newBG_White_clicked();void on_radioButton_newBG_Blue_clicked();void on_radioButton_newBG_Red_clicked();void on_pushButton_DealPicture_clicked();
void on_pushButton_SelectPicture_clicked();

.cpp中:

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);oldBG_Blue = true;oldBG_Red = false;newBG_Blue = false;newBG_Red = false;newBG_White = true;ui->radioButton_oldBG_Blue->click();ui->radioButton_newBG_White->click();
}Widget::~Widget()
{delete ui;
}void Widget::DealPicture(Mat img)
{Mat img1,img2,img3,img4,img5,img6;img1 = img;//变换图片格式cvtColor(img1, img2, COLOR_BGR2HSV);//imshow("hsv image", img2);//检测背景if (oldBG_Blue){inRange(img2, Scalar(90, 70, 70), Scalar(110, 255, 255), img3);//检测蓝色背景}else if (oldBG_Red){inRange(img2, Scalar(0, 135, 135), Scalar(180, 245, 230), img3);//检测红色背景}//imshow("mask image", img3);//腐蚀Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));erode(img3, img4, element);//imshow("erode image", img4);//膨胀dilate(img4, img5, element);//imshow("dilate image", img5);//遍历换颜色Mat ergodic_img = img5;int pointR, pointG, pointB;for (int i = 0; i < ergodic_img.rows; i++){for (int j = 0; j < ergodic_img.cols ; j++){if (ergodic_img.at<uchar>(i, j) == 255){if (newBG_Blue){pointR = 67, pointG = 142, pointB = 219;//背景变为蓝色}else if (newBG_Red){pointR = 255, pointG = 0, pointB = 0; //背景变为红色}else if (newBG_White){pointR = 255, pointG = 255, pointB = 255;//背景变为白色}img1.at<cv::Vec3b>(i, j)[0] = pointB;img1.at<cv::Vec3b>(i, j)[1] = pointG;img1.at<cv::Vec3b>(i, j)[2] = pointR;}}}//imshow("result image", img);imwrite("../result.jpg", img1);img_show = img1;cv::resize(img_show, img_show, Point(221, 316));QImg = cvMat2QImage(img_show);ui->label_new->setPixmap(QPixmap::fromImage(QImg));}void Widget::on_radioButton_oldBG_Red_clicked()
{oldBG_Red = true;oldBG_Blue = false;
}void Widget::on_radioButton_oldBG_Blue_clicked()
{oldBG_Blue = true;oldBG_Red = false;
}void Widget::on_radioButton_newBG_White_clicked()
{newBG_White = true;newBG_Blue = false;newBG_Red = false;
}void Widget::on_radioButton_newBG_Blue_clicked()
{newBG_Blue = true;newBG_White = false;newBG_Red = false;
}void Widget::on_radioButton_newBG_Red_clicked()
{newBG_Red = true;newBG_White = false;newBG_Blue = false;
}void Widget::on_pushButton_DealPicture_clicked()
{img = imread(file);//imshow("input image" , img);//qDebug()<<oldBG_Blue<<"\t"<<oldBG_Red<<"\t"<<newBG_Blue<<"\t"<<newBG_Red<<"\t"<<newBG_White;DealPicture(img);
}void Widget::on_pushButton_SelectPicture_clicked()
{file_path = QFileDialog::getOpenFileName(this,"open","../");if (file_path.isEmpty() ==false){file = file_path.toStdString();img = imread(file);img_show = img;cv::resize(img_show, img_show, Point(221, 316));QImg = cvMat2QImage(img_show);ui->label_old->setPixmap(QPixmap::fromImage(QImg));}
}QImage Widget::cvMat2QImage(const cv::Mat& mat)
{// 8-bits unsigned, NO. OF CHANNELS = 1if(mat.type() == CV_8UC1){QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);// Set the color table (used to translate colour indexes to qRgb values)image.setColorCount(256);for(int i = 0; i < 256; i++){image.setColor(i, qRgb(i, i, i));}// Copy input Matuchar *pSrc = mat.data;for(int row = 0; row < mat.rows; row ++){uchar *pDest = image.scanLine(row);memcpy(pDest, pSrc, mat.cols);pSrc += mat.step;}return image;}// 8-bits unsigned, NO. OF CHANNELS = 3else if(mat.type() == CV_8UC3){// Copy input Matconst uchar *pSrc = (const uchar*)mat.data;// Create QImage with same dimensions as input MatQImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);return image.rgbSwapped();}else if(mat.type() == CV_8UC4){qDebug() << "CV_8UC4";// Copy input Matconst uchar *pSrc = (const uchar*)mat.data;// Create QImage with same dimensions as input MatQImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32);return image.copy();}else{qDebug() << "ERROR: Mat could not be converted to QImage.";return QImage();}
}
/*
cv::Mat Widget::QImage2cvMat(QImage image)
{cv::Mat mat;qDebug() << image.format();switch(image.format()){case QImage::Format_ARGB32:case QImage::Format_RGB32:case QImage::Format_ARGB32_Premultiplied:mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());break;case QImage::Format_RGB888:mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());cv::cvtColor(mat, mat, CV_BGR2RGB);break;case QImage::Format_Indexed8:mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());break;}return mat;
}
*/

.ui中:


结果展示:
原图:

改为白色背景:

改为证件蓝色背景:

改为证件红色背景:

喜欢的小伙伴记得点赞哦~!

[Qt]图像处理小软件——给证件照换背景相关推荐

  1. 如何给证件照换背景底色?如何改变图片背景色?

    在平时工作.生活中,经常要用到证件照,不同用途的证件照对底色也有不同的要求,如果不想每次都去重新拍照,就需要自己学会给照片换背景底色,接下来小编就教大家一个证件照换背景(https://www.yas ...

  2. 如何换照片背景底色?在线证件照换背景怎么换

    大家在网络中使用发电子版照片传输的场合也是越来越多了,这也就需要经常性的使用电子照片,那么不同的场景要求的证件照背景色也不一样,所以就需要我们去给证件照换底色,很多小伙伴都不知道怎么证件照换背景(ht ...

  3. 蓝底换白底边缘不干净_全网最详细的证件照换背景以及照片排版

    来源:www.16xx8.com 相信很多同学碰到过需要给背景照换颜色的时候,我们平时照的证件照,一般都是红底,人家给你拍了也不会各个颜色都给你发个电子版,这时我们遇到要蓝底的时候怎么办呢?护照要蓝底 ...

  4. 1寸照片如何修改底色?证件照换背景教程

    许多报名平台上传一寸证件照时都对背景颜色有具体要求,那么我们就需要证件照换底色来应对,本文将介绍一个快速证件照换背景(https://www.yasuotu.com/coloreplace)的方法,可 ...

  5. python如何换背景_python实现抠图给证件照换背景源码

    本文实例为大家分享了python实现抠图给证件照换背景的具体代码,供大家参考,具体内容如下 import cv2 import numpy as np import matplotlib.pyplot ...

  6. 证件照底色怎么修改?证件照换背景怎么换?

    提交报名照片时,相关方有时对照片的背景会有要求,比如要求为白色.红色.蓝色.浅蓝色等,如果自己的照片背景不符合要求就需要修改背景颜色.比如使用ps抠图来证件照换底色,其实可以试试压缩图的证件换背景(h ...

  7. Qt 绘画小软件(功能完善,免费下载)

    Qt 绘画小软件(功能完善,免费下载) 源码下载 免费下载,看评论 操作说明 快捷键 Ctrl + C 复制选中区域快捷键 Ctrl + V 粘贴选中区域快捷键 Ctrl + X 剪切选中区域快捷键 ...

  8. 什么软件能抠图换背景?这些软件大家都在用

    现在拍照.P图已经成了许多小伙伴生活中不可或缺的一部分了,例如你想分享今天干了什么.出去吃大餐或是外出旅游,大家都会掏出手机用相机将这些记录下来,之后分享到社交平台上.但是拍照后,想将图片分享出来总需 ...

  9. java面试换背景颜色_证件照换底色 证件照换背景 证件照背景颜色

    很多人都不知道怎么让证件照换底色,如果单位要求要红底证件照,而你手里只有蓝底的,怎么办?下面小编就来教你,怎么给证件照换底色换背景颜色. 小美智能证照小程序可以在线拍摄制作证件照,还支持证件照换底色, ...

最新文章

  1. java语言的主要的知识点
  2. TF之DD:利用Inception模型+GD算法生成更高质量的Deep Dream高质量图片
  3. 黑马程序员pink老师前端入门教程,零基础必看的h5(html5)+css3+移动端前端视频教程(复合选择器,元素显示模式,背景)
  4. mongodb幽灵操作的解决方案
  5. java的excel导出_java 实现excel 导出功能
  6. 内存管理tcmalloc
  7. 邂逅StringIndexOutOfBoundsException
  8. ZOJ3210 A Stack or A Queue?【序列】
  9. AIDL Service
  10. 系统学习NLP(九)--中文分词算法综述
  11. cocos2d-js 接入anysdk
  12. git+vimdiff 一次关闭所有文件
  13. 对刚入职场几年的新人有哪些建议和忠告?
  14. 超越OCR的富文档内容解析神器LayoutParser
  15. 树莓派3 Android Pie 编译适配
  16. 二、Linux 文件与目录结构、VI/VIM 编辑器(重要)
  17. Word更新所有域的代码
  18. mysql 数据文件_mysql的数据文件
  19. 杭州市中高级工程师职称评审条件
  20. 企业网络营销分析报告

热门文章

  1. 5G SCMA MPA算法
  2. 【干货】怎么将阿里云ECS的数据下载到本地
  3. AD PCB设计笔记
  4. 基于Java的快递管理系统(LMS)设计与实现 毕业论文+项目源码及数据库文件
  5. 嵌入式工程师面试知识总结
  6. 头的各个部位示意图_上臂肌群图示:肱二头肌、肱三头肌、肱肌部位图解说明...
  7. Python 识别图片字符
  8. 分享20个高质量的学习网站!
  9. git: Couldn‘t find remote ref
  10. 跳跃游戏2(求最少跳跃次数)Python解法