使用Qt与OpenCV实现证件照背景替换的图像处理流程
实验说明
本实验所用图片来源于网络,若涉及版权问题,请联系删除。
(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);
(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逻辑,实现图形界面操作与实时预览功能。