返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >利用OpenCV实现绿幕视频背景替换
  • 636
分享到

利用OpenCV实现绿幕视频背景替换

2024-04-02 19:04:59 636人浏览 安东尼
摘要

目录前言一、图像预处理二、HSV色彩空间转换1. cvtColor色彩空间转换2. inRange抠图三、背景替换四、源码总结前言 本文将使用OpenCV c++ 进行绿幕视频背景替

前言

本文将使用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绿幕视频背景替换内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 利用OpenCV实现绿幕视频背景替换

本文链接: https://lsjlt.com/news/162157.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 利用OpenCV实现绿幕视频背景替换
    目录前言一、图像预处理二、HSV色彩空间转换1. cvtColor色彩空间转换2. inRange抠图三、背景替换四、源码总结前言 本文将使用OpenCV C++ 进行绿幕视频背景替...
    99+
    2024-04-02
  • OpenCV如何实现视频绿幕背景替换功能
    本文小编为大家详细介绍“OpenCV如何实现视频绿幕背景替换功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“OpenCV如何实现视频绿幕背景替换功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1、概述案例:...
    99+
    2023-07-05
  • OpenCV怎么实现视频绿幕背景替换功能
    本篇内容介绍了“OpenCV怎么实现视频绿幕背景替换功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、概述案例:使用OpenCV实现视频...
    99+
    2023-07-05
  • OpenCV实现视频绿幕背景替换功能的示例代码
    目录1、概述2、代码示例1、概述 案例:使用OpenCV实现视频绿幕背景替换 算法步骤: 1.初始化VideoCapture并使用其open方法加载视频 2.while循环加读取fr...
    99+
    2023-02-19
    OpenCV视频绿幕背景替换 OpenCV绿幕背景替换 OpenCV 背景替换
  • OpenCV实现背景分离(证件照背景替换)
    目录实现原理功能函数代码C++测试代码完整改进代码本文主要介绍了OpenCV实现背景分离(证件照背景替换),具有一定的参考价值,感兴趣的可以了解一下 实现原理 图像背景分离是常见的图...
    99+
    2024-04-02
  • OpenCV怎么实现AI照片背景替换
    这篇文章主要介绍“OpenCV怎么实现AI照片背景替换”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“OpenCV怎么实现AI照片背景替换”文章能帮助大家解决问题。图片1)附主程序# 日常缩...
    99+
    2023-06-26
  • python人物视频背景替换实现虚拟空间穿梭
    目录引言准备工作纯RGB背景替换自定义图像背景板替换引言 近期网上这位卖蜂蜜的小伙鬼畜挺火的,大家质疑背景造假,这里我就带着大家实现“背景造假”(PS:原视频...
    99+
    2024-04-02
  • OpenCV实战之AI照片背景替换
    目录导语正文1)附主程序2)展示其他总结导语 不少人在生活中都有抠人像图换背景的需求。那怎么抠图呢? 相信不少人第一时间就想到了 PS 抠图大法,为了学会 PS 抠图很多人还花费不少...
    99+
    2024-04-02
  • Python 照片人物背景替换的实现方法
    目录前言项目说明项目结构数据准备替换背景图代码代码说明验证一下效果总结前言 本文的github仓库地址为: 替换照片人物背景项目(模型文件过大,不在仓库中) 由于模型文件过大,没放在...
    99+
    2024-04-02
  • 如何在PHP中实现视频图片替换
    随着互联网技术的不断发展,多媒体内容已经成为了互联网中不可或缺的一部分。在现如今的互联网世界中,视频内容和图片内容已经成为了网站和应用中最为重要的展示方式,这也就使得图片和视频的处理成为了开发者们必须要面对的问题。而在这方面,PHP作为一种...
    99+
    2023-05-14
  • 怎么在HTML5中实现一个全屏视频背景
    这篇文章将为大家详细讲解有关怎么在HTML5中实现一个全屏视频背景,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。特性自动调整:Bideo.js可以根据当前浏览器窗口的大小自动调整视频尺寸,当...
    99+
    2023-06-09
  • 怎么在Html5中实现首页动态视频背景
    怎么在Html5中实现首页动态视频背景?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。html代码:<video id="v1" ...
    99+
    2023-06-09
  • Python抠图:使用OpenCV实现背景去除
    一、了解抠图和OpenCV库 抠图(Matting)是图像处理领域的重要任务之一,旨在将对象与其它部分分离。OpenCV是一个开源计算机视觉库,它提供了丰富的函数和工具进行图像编辑处理,可以简单而快速地实现抠图功能,同时可以进行更多的图像处...
    99+
    2023-09-28
    python opencv 开发语言
  • 用 Python 制作可视化 GUI 界面,一键实现证件照背景颜色的替换
    关于界面的大致模样其实和先前的相差不大,大家应该都看过上一篇的内容。界面大体的样子整体GUI的界面如下图所示:用户在使用的时候可以选择将证件照片替换成是“白底背景”或者是“红底背景”,那么在前端的界面上传完成照片之后,后端的程序便会开始执行...
    99+
    2023-05-19
    可视化 Python GUI 证件照
  • 利用Python实现普通视频变成动漫视频
    目录容我废话一下一、思路流程二、图像转动漫三、视频帧读取与视频帧写入容我废话一下 最近几个月,毒教材被曝光引发争议,那些编写度教材的人着实可恶。咱程序员也没有手绘插画能力,但咱可以借...
    99+
    2024-04-02
  • 利用Golang和FFmpeg实现视频格式转换的方法
    要利用Golang和FFmpeg实现视频格式转换的方法,你可以按照以下步骤进行操作:1. 安装FFmpeg:首先需要在计算机上安装F...
    99+
    2023-10-08
    Golang
  • 如何实现基于Vue.js 2.0自适应背景视频登录页面
    这篇文章将为大家详细讲解有关如何实现基于Vue.js 2.0自适应背景视频登录页面,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。效果: 1. 背景视频 Web ...
    99+
    2024-04-02
  • Python实现将多张图片合成视频并加入背景音乐
    实现的思路:将准备好的图片通过opencv读取出来,并将其设置好帧数等参数后合成为无声视频。 最后通过moviepy编辑视频将背景音乐加入到视频中。 开始之前还是需要说明一下非标...
    99+
    2024-04-02
  • Qt利用ffmpeg实现音视频同步
    目录一、前言二、效果图三、体验地址四、相关代码五、功能特点5.1 基础功能5.2 特色功能5.3 视频控件5.4 内核ffmpeg一、前言 用ffmpeg来做音视频同步,个人认为这个...
    99+
    2023-01-04
    Qt ffmpeg音视频同步 Qt 音视频同步 Qt ffmpeg
  • python使用mediapiple+opencv识别视频人脸的实现
    目录1、安装2、代码实现3、更新 mediapiple+threadpool+opencv实现图片人脸采集效率高于dlib1、安装 pip install mediapipe 2、代...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作