基于Qt C++和OpenCV的证件照换底色实验
机器学习基础--图像处理Project1。Qt是跨平台C++图形用户界面应用程序框架,OpenCV是跨平台的计算机视觉库
·
###实验用证件照为网图,如有侵犯联系我立删###
(0)导入OpenCV:

#include <opencv2/opencv.hpp>
using namespace cv;
(1) 显示一张图片:(RGB)
Mat img = imread("d:/6.png");//Mat 图片类型 容器对象类型-----这里是声明img为图片
imshow ("title",img);//显示一张图片(title为显示的图片的标题)
waitKey(0);//等待用户按下任意键
eg.
(2)图像模糊处理(仅了解):
Mat blurImg;//模糊图片对象
blur(img,blurImg,Size(50,50)); //模糊处理函数,Size(横向模糊尺寸,纵向模糊尺寸)
imshow("blur",blurImg);
eg.
(3) 图像灰度处理:(GRAY)
Mat grayImg;//声明灰色图片对象
cvtColor(img,grayImg,COLOR_BGR2GRAY);//颜色处理函数
imshow("gray",grayImg);
eg.

(4) 图像二值化处理:(BINARY)
Mat threImg;//二值图片对象
threshold(grayImg,threImg,108,255,THRESH_BINARY);//令区间内值为1
//二值化处理函数,threshold(来源,对象,左区间,右区间,函数名)
imshow("binary",threImg);
eg.
这里我们不难发现,在人像和背景的交接处切割效果并不理想,这是因为RGB对光照敏感:同一物体在不同光照下RGB值变化很大。
为了解决这个问题,改用HSV(Hue-Saturation-Value),它是一种比RGB更直观的颜色空间,它将颜色信息分解为:
-
H(色相):颜色类型(0-180°,OpenCV中为0-180)
-
S(饱和度):颜色鲜艳程度(0-255)
-
V(明度):颜色亮度(0-255)
HSV分离了颜色和亮度:可以通过H通道直接提取特定颜色范围(比如"红色"或"蓝色"),不受明暗影响。
(5)HSV处理:
Mat hsv;
cvtColor(image,hsv,COLOR_BGR2HSV);
imshow("2",hsv);
eg.

(6)截取蓝色空间范围:
//HSV范围之内呈白色模板 --Hue(色调)Saturation(饱和度)Value(亮度)
Mat mask;
//(源,色min,色的max,对象)
inRange(hsv,Scalar(100,43,46),Scalar(124,255,255),mask);
imshow("3",mask);
eg.

(7)取反操作:
bitwise_not(mask,mask);
imshow("4",mask);
eg.

(8).生成红色背景
// :: C++作用域分解运算符 zeros() 创建制定几行几列的矩阵 像素为0
Mat redBack = Mat::zeros(image.size(),image.type());
redBack = Scalar(40,40,200);//---Scalar(B,G,R)
imshow("5",redBack);
eg.

(9)拷贝:
image.copyTo(redBack,mask);//将mask操作到redBack上
imshow("6",redBack);
eg.

ps.选用实验用相片时要注意人物衣服的颜色和背景色不能太接近(一个色调),否则会导致实验效果不理想。这里附上原图便于读者复现:

常见颜色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) | 中低饱和度+中明度 |
更多推荐


所有评论(0)