当前位置:首页 > 技术 > 正文内容

使用Qt与OpenCV实现证件照背景替换的图像处理流程

访客 技术 2026年7月9日 15

实验说明

本实验所用图片来源于网络,若涉及版权问题,请联系删除。

(0)引入OpenCV库

#include <opencv2/opencv.hpp>

using namespace cv;

(1)加载并显示图像(RGB模式)

Mat sourceImage = imread("d:/6.png");

imshow("原始图像", sourceImage);
waitKey(0);
原始图像显示

(2)图像模糊处理(仅作参考)

Mat blurredImage;
blur(sourceImage, blurredImage, Size(50, 50));

imshow("模糊效果", blurredImage);
waitKey(0);
模糊处理结果

(3)转换为灰度图

Mat grayImage;
cvtColor(sourceImage, grayImage, COLOR_BGR2GRAY);

imshow("灰度图像", grayImage);
waitKey(0);
灰度图像 灰度图像细节

(4)二值化处理(BINARY)

Mat binaryImage;
threshold(grayImage, binaryImage, 108, 255, THRESH_BINARY);

imshow("二值化结果", binaryImage);
waitKey(0);
二值化效果 注意:由于RGB对光照变化敏感,边界分割不够理想。为此采用更稳定的颜色空间HSV进行优化。

(5)转至HSV色彩空间

Mat hsvImage;
cvtColor(sourceImage, hsvImage, COLOR_BGR2HSV);

imshow("HSV色彩空间", hsvImage);
waitKey(0);
HSV图像

(6)提取蓝色区域掩码

Mat blueMask;
inRange(hsvImage, Scalar(100, 43, 46), Scalar(124, 255, 255), blueMask);

imshow("蓝色区域掩码", blueMask);
waitKey(0);
蓝色掩码

(7)取反掩码以保留前景

bitwise_not(blueMask, blueMask);

imshow("前景掩码", blueMask);
waitKey(0);
取反后掩码

(8)创建红色背景图像

Mat redBackground = Mat::zeros(sourceImage.size(), sourceImage.type());
redBackground = Scalar(40, 40, 200); // BGR格式: (B=40, G=40, R=200)

imshow("红色背景", redBackground);
waitKey(0);
红色背景

(9)将原图内容按掩码拷贝到新背景上

sourceImage.copyTo(redBackground, blueMask);

imshow("最终结果:红底证件照", redBackground);
waitKey(0);
最终合成结果 提示:选择测试图像时,应确保人物服装颜色与背景差异明显,避免因色相接近导致识别失败。

常用颜色在HSV中的范围(OpenCV标准)

颜色 下限 (Scalar) 上限 (Scalar) 备注
红色 (0, 43, 46) (10, 255, 255) 需合并两个区间
红色 (170, 43, 46) (180, 255, 255) 跨色环两端
橙色 (11, 43, 46) (25, 255, 255)
黄色 (26, 43, 46) (34, 255, 255)
绿色 (35, 43, 46) (77, 255, 255)
青色 (78, 43, 46) (99, 255, 255)
蓝色 (100, 43, 46) (124, 255, 255)
紫色 (125, 43, 46) (155, 255, 255)
粉红色 (156, 43, 46) (169, 255, 255)
白色 (0, 0, 221) (180, 30, 255) 低饱和度+高亮度
黑色 (0, 0, 0) (180, 255, 46) 低亮度
灰色 (0, 0, 46) (180, 43, 220) 中等明度+低饱和度

完整实验可基于Qt框架集成上述OpenCV逻辑,实现图形界面操作与实时预览功能。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

PHP 8.5 新特性

PHP 8.5 是在 2025 年 11 月 20 日发布的一个重要版本,带来不少实用的新语法、库增强和调试/性能改进。下面按类别整理主要新特性: 1. 新语法 & 表达力增强 管道操作符(Pipe Operator |>)允许把上一个表达式的值通过管道传给下一个可调用函数,从左往右串联处理,代码更可读:$result = $input    |> trim...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。