OpenCV4入门158:绿幕扣图

索引地址:系列索引

蓝幕和绿幕都是拍摄特技镜头的背景幕布,演员在蓝幕、绿幕前表演,由摄影机拍摄下来,画面在电脑中处理,处理掉背景的蓝色或绿色,换上其他背景。

OpenCV4入门069:颜色圆检测中我们介绍过inrange函数,很方便的处理颜色。

green screen

我们需要做的就是把非绿色的部分提取出来。

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <string>
#include <vector>

int main()
{
cv::Mat srcImage = cv::imread("seven.jpg");
if (!srcImage.data)
return -1;
cv::imshow("srcImage", srcImage);
// 中值滤波
cv::medianBlur(srcImage, srcImage, 3);
// 转换成hsv颜色空间
cv::Mat hsvImage;
cv::cvtColor(srcImage, hsvImage, cv::COLOR_BGR2HSV);
cv::imshow("hsvImage", hsvImage);

//根据像素的范围进行过滤,把符合像素范围的保留,不符合的赋值0或者255
//根据hsv颜色表找出最大值和最小值
// 颜色阈值化处理
cv::Mat mask=srcImage.clone();
cv::inRange(hsvImage, cv::Scalar(35, 43, 46),
cv::Scalar(77, 255, 255), mask);
cv::imshow("inrange", mask);

cv::bitwise_not(mask,mask);

std::vector<cv::Mat> channels;
split(srcImage,channels);
//只在mask区域做与运算
cv::bitwise_and(channels[0], mask,channels[0]);
cv::bitwise_and(channels[1], mask,channels[1]);
cv::bitwise_and(channels[2], mask,channels[2]);
cv::Mat result;
merge(channels,result);

cv::imshow("mask", mask);

cv::imshow("result", result);

cv::waitKey(0);
return 0;
}

我们先把RGB图片转换为HSV格式,然后使用inRange将绿色过滤掉得到黑白图(一通道),将黑白图反转作为掩膜。

因为掩膜是一通道的,而原始图片是三通道的,我们需要将三通道拆分然后与掩膜与操作,在将三个结果合并为结果图片。

结果为

result

OpenCV4入门158:绿幕扣图
https://feater.top/opencv/opencv-remove-green-screen
作者
JackeyLea
发布于
2022年5月26日
许可协议