【学习OpenCV4】教你替换绿幕背景


绿幕图像的背景替换需要经历①色彩空间转换、②提取绿幕区域、③反转绿幕区域、④复制图像,其中遇到的各种函数和代码也都在本文有详细介绍。

一、色彩空间转换

  要去除绿幕图像中的绿幕,首先需要将图像转换到hsv色彩空间,这样方便后续对图像的处理。使用 cvtcolor() 函数可以完成色彩空间的转换。

void cv::cvtColor(
	InputArray 	src,		//输入图像矩阵
	OutputArray dst,		//输出图像矩阵
	int 		code,		//转换方式
	int 		dstCn = 0	//目标图像通道数
)	

一般的使用方法如下,图像转换至hsv色彩空间的示例程序:

void MyDemo::inRange_Demo(Mat& image) {
	Mat hsv;	//存储转换后的hsv图像
	cvtColor(image, hsv, COLOR_BGR2HSV);//进行色彩空间转换
	imshow("hsv_image", hsv);
}

二、提取绿幕区域

  图像转换到hsv色彩空间后,就可以进行色彩区域的提取了,这里使用的函数是 inRange()

void inRange(
	InputArray 	src,	//输入图像
	InputArray	lowerb,	//下边界数组阈值
	InputArray	upperb,	//上边界数组阈值
	OutputArray dst		//输出图像
);

其中,由于HSV的取值范围为H(0-180)、S(0-255)、V(0-255)。因此上下边界数组阈值可以通过如下表格获取

绿
hmin0000/15611263578100125
hmax18018018010/18025347799124155
smin00043434343434343
smax2554330255255255255255255255
vmin04622146464646464646
vmax46220255255255255255255255255

  由于本文要替换绿幕,所以选择绿色的阈值,分别是:hmin=35、hmax=77、smin=43、smax=255、vmin=46、vmax=255。因此可以得到下边界数组为 Scalar(35, 43, 46) ,上边界数组为 Scalar(77, 255, 255)

  因此提取绿幕的程序如下:

void MyDemo::inRange_Demo(Mat& image) {
   Mat hsv;	//存储转换后的hsv图像
   cvtColor(image, hsv, COLOR_BGR2HSV);//进行色彩空间转换
   Mat mask;	//存储提取绿幕区域后的图像
   inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);
   imshow("mask", mask);
}

三、替换背景

  前面已经完成了对绿幕区域的提取,接下来只需要对提取的区域反转,选择人物的区域,进而将人物复制到新背景即可。
  反转选择区域使用的是 bitwise_not() 函数。
  复制图像使用的是 image.copyTo(newimage,mask) 方法,作用是把mask和image重叠以后把mask中像素值为0(黑色)的点对应的image中的点变为透明,而保留其他点,将保留的点拷贝到newimage中。

void MyDemo::inRange_Demo(Mat& image) {

	//转换色彩空间
	Mat hsv;
	cvtColor(image, hsv, COLOR_BGR2HSV);

	//提取绿幕区域
	Mat mask;
	inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);
	imshow("mask", mask);

	//反转提取人物区域	
	bitwise_not(mask, mask);

	//人物复制到新背景中
	Mat bg = imread("E:/Program/OpenCV/vcworkspaces/opencv_452/img/plantbg.jpg");//背景图片
	image.copyTo(bg, mask);
	imshow("Finished", bg);
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Huffiee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值