利用OpenCV实现绿幕视频背景替换
创作时间:
作者:
@小白创作中心
利用OpenCV实现绿幕视频背景替换
引用
1
来源
1.
https://www.zhangshengrong.com/p/w4N7DxxgXr/
本文将详细介绍如何使用OpenCV C++实现绿幕视频背景替换。通过将视频转换为HSV色彩空间,使用inRange函数进行颜色范围筛选,最后通过像素赋值实现背景替换。文章包含完整的代码示例和步骤说明,适合有一定编程基础的读者学习参考。
前言
本文将使用OpenCV C++ 进行绿幕视频背景替换。
一、图像预处理
背景
绿幕视频
首先,我们需要使用resize API将背景图尺寸修改与视频尺寸大小。这样才能进行后续的像素赋值操作。
Mat bg = imread("background.jpg"); //背景图
VideoCapture capture; //读取待处理的绿幕视频
capture.open("5.flv");
if (!capture.isOpened())
{
cout << "Can not open video!" << endl;
system("pause");
return -1;
}
int width = capture.get(CAP_PROP_FRAME_WIDTH);
int height = capture.get(CAP_PROP_FRAME_HEIGHT);
resize(bg, bg, Size(width, height), 1, 1, INTER_CUBIC); //将背景图resize成视频尺寸大小
二、HSV色彩空间转换
1. cvtColor色彩空间转换
cvtColor(frame, HSV, COLOR_BGR2HSV); //将原图转换成HSV色彩空间
2. inRange抠图
经百度查表,我们可以获取绿色HSV颜色分量范围
//绿色HSV颜色分量范围
int hmin = 35, smin = 43, vmin = 46;
int hmax = 77, smax = 255, vmax = 255;
由于我们已经将原图转换为HSV色彩空间,故可以使用inRange API将前景从绿幕中抠出来。inRange将两阈值内的像素置为255(即绿色被置为白色),阈值外的像素置为0(其他颜色被置为黑色)。故由此我们可以将前景抠出来。
//经过inRange API处理,输出一张二值图像,即将前景从绿幕中扣出来啦
inRange(HSV, Scalar(hmin, smin, vmin), Scalar(hmax, smax, vmax), mask);
mask图像,即从绿幕中抠出来的前景图。
三、背景替换
我们通过修改图像像素值达到替换背景目的。通过遍历视频图像像素值,当mask像素值为0时,表示此时图像像素为前景,将绿幕视频当前像素点赋给目标图像dst;当mask像素值为255时,表示此时图像像素为背景,将背景图当前像素点赋给目标图像dst。
Mat Replace_Background(Mat frame, Mat mask, Mat bg)
{
Mat dst = Mat::zeros(frame.size(), frame.type());
for (int i = 0; i < frame.rows; i++)
{
for (int j = 0; j < frame.cols; j++)
{
int p = mask.at<uchar>(i, j); //传入的mask是张二值图,p为当前mask像素值
if (p == 0)
{ //代表mask此时为前景,将绿幕视频中的前景像素赋给dst
dst.at<Vec3b>(i, j) = frame.at<Vec3b>(i, j);
}
else if (p == 255)
{
//代表mask此时为背景,将背景图像素赋给dst
dst.at<Vec3b>(i, j) = bg.at<Vec3b>(i,j);
}
}
}
return dst;
}
最终效果如图所示。
四、源码
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
Mat Replace_Background(Mat frame, Mat mask, Mat bg)
{
Mat dst = Mat::zeros(frame.size(), frame.type());
for (int i = 0; i < frame.rows; i++)
{
for (int j = 0; j < frame.cols; j++)
{
int p = mask.at<uchar>(i, j); //传入的mask是张二值图,p为当前mask像素值
if (p == 0)
{ //代表mask此时为前景,将绿幕视频中的前景像素赋给dst
dst.at<Vec3b>(i, j) = frame.at<Vec3b>(i, j);
}
else if (p == 255)
{
//代表mask此时为背景,将背景图像素赋给dst
dst.at<Vec3b>(i, j) = bg.at<Vec3b>(i,j);
}
}
}
return dst;
}
int main()
{
Mat bg = imread("background.jpg"); //背景图
VideoCapture capture; //读取待处理的绿幕视频
capture.open("5.flv");
if (!capture.isOpened())
{
cout << "Can not open video!" << endl;
system("pause");
return -1;
}
int width = capture.get(CAP_PROP_FRAME_WIDTH);
int height = capture.get(CAP_PROP_FRAME_HEIGHT);
resize(bg, bg, Size(width, height), 1, 1, INTER_CUBIC); //将背景图resize成视频尺寸大小
Mat frame, HSV, mask, dst;
//绿色HSV颜色分量范围
int hmin = 35, smin = 43, vmin = 46;
int hmax = 77, smax = 255, vmax = 255;
while (capture.read(frame))
{
cvtColor(frame, HSV, COLOR_BGR2HSV); //将原图转换成HSV色彩空间
//经过inRange API处理,输出一张二值图像,即将前景从绿幕中扣出来啦
inRange(HSV, Scalar(hmin, smin, vmin), Scalar(hmax, smax, vmax), mask);
dst = Replace_Background(frame, mask, bg);
imshow("demo", frame);
//imwrite("frame.jpg", frame);
imshow("mask", mask);
//imwrite("mask.jpg", mask);
imshow("dst", dst);
//imwrite("dst.jpg", dst);
char key = waitKey(10);
if (key == 27)
{
break;
}
}
destroyAllWindows();
capture.release();
system("pause");
return 0;
}
总结
本文使用OpenCV C++进行绿幕视频背景替换,关键步骤有以下几点。
1、将原图转换成HSV色彩空间。
2、使用inRange API将前景从绿幕中抠出来,得到一张二值图。
3、通过像素赋值操作达到背景替换效果。
到此这篇关于利用OpenCV实现绿幕视频背景替换的文章就介绍到这了,更多相关OpenCV绿幕视频背景替换内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
热门推荐
新中式风格装修案例,对称式布局尽显中庸之道!
詹姆斯年满40岁,22年职业生涯创造的记录,重新定义伟大
东北烧烤美食探秘:哈尔滨齐齐哈尔锦州的深夜小吃与独特风味解析
“看好”中国正成为共识 中国资产亮眼表现引发外资机构热捧
【位运算】:数据结构中的隐藏技能,高效解决问题的关键
平板绘画入门教程
交警大队的工作时间是多久?全面解析
园区绿色低碳生态建筑设计策略及绿色低碳景观设计策略
舌尖上的安心——食品标签解读与健康饮食选择指南
聚醚醚酮(PEEK)市场应用及行业情况
古训新解:三十而立、四十不惑、五十知天命、六十耳顺、七十从心所欲
方世玉:历史传闻与真实结局探析
方世玉:历史传闻与真实结局探析
车辆指示灯故障标志颜色含义
减肥不吃晚饭?小心胖上加胖!
世界海啸日|掀起滔天巨浪的海啸,为何在我国并不多见?
湖南美食推荐:7道必尝湘菜,吃出地道风味!
SMR技术全解析:大容量机械硬盘的未来趋势
中医理论在感冒防治中的应用与实践
打造“宝藏”专科 精准治疗糖尿病
云服务器的公网IP有何重要性,你真的了解吗?
探索与理解:艾滋病患者的心理特点与社会融入之路
忧遁草的功效与作用:一种具有多种功效的草药
2025北京邮电大学研究生学费标准及各专业收费详情
汽车双离合变速箱:干式与湿式的深度剖析
增强法律意识 谨防上当受骗 遵守考场纪律 做到诚信考试
河东村:绿水青山人间胜境
地质工程的就业方向分析
妈妈生日送花指南:如何挑选一束既庄重又温馨的生日花束?
连吃5个柿子长胃结石?这些柿子禁忌,你真的需要担心吗?