Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于OpenCV创建视频会议虚拟背景

基于OpenCV创建视频会议虚拟背景

作者头像
小白学视觉
发布于 2020-09-22 07:21:18
发布于 2020-09-22 07:21:18
3.6K10
代码可运行
举报
运行总次数:0
代码可运行

本期我们将使用Python和OpenCV为频会议创建虚拟背景。

虚拟背景是当前远程工作的员工中的热门话题之一。由于Covid-19的流行,许多人必须通过视频通话以便继续工作。很多视频会议的软件可以设置虚拟背景,以便用户建立更友好的氛围来接听这些电话。

作为一名程序员,当我们第一次使用这样的虚拟背景时自然很感兴趣。我们都想知道它是如何工作的,可以自己建立这样的虚拟背景吗?

接下来,我们将尝试使用PythonOpenCV使用计算机视觉技术构建虚拟背景的基本方法。(虽然效果并不是很好~)

介绍

我们的目的是拍摄视频,尝试弄清楚视频的背景和前景,删除背景部分,并用图片(虚拟背景)代替。因为在此项目中,我们将使用简单的方法,假设前景通常具有与背景不同的颜色。首先,让我们看看我们的工具是什么。

计算机视觉

计算机视觉是一个跨学科领域,涉及计算机如何处理和(或)理解图像和视频。说这是一个跨学科的领域,因为它借鉴了不同学科(计算机科学,代数,几何等)的许多概念,并将它们组合起来以解决许多不同而复杂的任务,例如对象跟踪对象检测, 对象识别,图片和视频中的对象细分

OpenCV

OpenCV是一个用于解决计算机视觉任务的库。它是开源的,可用于多种编程语言,包括Python和C ++。它具有大量的计算机视觉功能,其中一些基于数学和统计方法,而另一些则基于机器学习

建立虚拟背景

我为此尝试的方法如下。我将显示每个步骤的代码片段,并在本文结尾处,您将获得完整的代码。

1. 导入依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import cv2

2.从本地环境加载视频并初始化数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ap = cv2.VideoCapture('video6.mp4')
ret = True
frameCounter = 0
previousFrame = None
nextFrame = None
iterations = 0

3.从本地环境加载替代背景图像

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
backgroundImage = cv2.imread("image1.jpg")

4.逐帧分割视频

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while (ret):
ret, frame = cap.read()

5.每隔两帧拍摄一次

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if frameCounter % 2 == 1:
           nextFrame = frame        
if frameCounter % 2 == 0:
           frameCounter = 0
           previousFrame = frame       
frameCounter = frameCounter + 1
           iterations = iterations + 1

6.找到两个帧之间的绝对差并将其转换为灰度->获得蒙版

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if iterations > 2:
  diff = cv2.absdiff(previousFrame, nextFrame)
  mask = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)

每个图像都由像素组成,我们可以将其想象为具有行和列的2D矩阵,并且矩阵中的每个单元格都是图像中的像素(当然,对于彩色图像,我们拥有的尺寸比2大,但为简单起见,可以忽略)。

我们通过在第一个图像中逐个像素移动(因此在第一矩阵中一个单元一个像素)并从另一个图像中替换对应的像素(因此从另一个矩阵中替换对应的像素)来获得差异。

现在的诀窍是:如果在两帧之间,像素没有被修改,那么结果当然是0两帧之间的像素如何变化?如果视频是完全静态的(图像中没有任何动静),则所有像素的每一帧之间的差将为0,因为没有任何更改。但是,如果某物在图像中移动,那么我们可以通过检测像素差异来识别某物在图像中的移动位置。我们可以假设,在视频会议中,移动的事物位于前台(即您),而静态部分是背景。

那么0到底有什么重要呢?图像将为每个像素显示为0的黑色,我们将利用这一优势。

7.找到蒙版中超出阈值的单元格-我选择3作为阈值,当然也可以使用不同的值。较大的值将从背景中删除更多内容,但也可能从前景中删除更多内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
th = 3
isMask = mask > th
nonMask = mask <= th

8.创建一个空白图像(每个单元格为0),其大小为两个框架中任何一个的大小

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
result = np.zeros_like(nextFrame, np.uint8)

9.调整背景图像的大小,使其具有与框架相同的大小

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
resized = cv2.resize(backgroundImage, (result.shape[1], result.shape[0]), interpolation = cv2.INTER_AREA)

10.对于蒙版中大于阈值的每个单元,请从原始帧进行复制

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
result[isMask] = nextFrame[isMask]000000000000

11.对于蒙版中低于阈值的每个单元,请从替代背景图像进行复制

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
result[nonMask] = resized[nonMask]

12.将结果框保存到本地环境

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cv2.imwrite("output" + str(iterations) + ".jpg", result)

结果与结论

那么结果如何呢?老实说,我对结果感到有些失望。然后,我做了更多的研究,其原因变得更加明显。为此,您需要一种更高级的方法,并且大公司在此类问题上投入了大量资源也就不足为奇了。

这是我尝试的视频的屏幕截图。这基本上是我的手在墙前移动的视频。

虚拟背景Python和OpenCV教程-输入

这是输出图像的屏幕截图。作为背景,我在罗马尼亚的拉斯诺夫使用了我的照片。

虚拟背景Python和OpenCV教程-输出

结果并不满意,但是我们也从这个项目中学到的东西。

创建虚拟背景的其他方法

如果认为问题非常复杂,并且需要的智能水平,那么答案可能是机器学习。

已有深度学习模型可以执行此类任务。但是,这样的模型需要训练大量的数据集和大量的处理能力,在撰写本文时,我还没有这些能力做这种尝试。这种深度学习模型要解决的任务称为图像分割

另一种方法是计算机视觉方法,用于查找相机和图像中的对象之间的距离。然后,建立一个阈值,以将前景与背景分开。之后,可以使用与移除背景相同的蒙版,并引入一个新的蒙版。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小白学视觉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
你好,请问完整的源码在哪里呢?怎么看不到
你好,请问完整的源码在哪里呢?怎么看不到
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
使用OpenCV进行检测、跟踪移动物体
本文关键词:OpenCV、Python、背景减除器、KNN、MOG2、目标检测与追踪
小白学视觉
2024/09/25
2340
使用OpenCV进行检测、跟踪移动物体
计算机视觉 | Python OpenCV 3 使用背景减除进行目标检测
背景减除(Background Subtraction)是许多基于计算机视觉的任务中的主要预处理步骤。如果我们有完整的静止的背景帧,那么我们可以通过帧差法来计算像素差从而获取到前景对象。但是在大多数情况下,我们可能没有这样的图像,所以我们需要从我们拥有的任何图像中提取背景。当运动物体有阴影时,由于阴影也在移动,情况会变的变得更加复杂。为此引入了背景减除算法,通过这一方法我们能够从视频中分离出运动的物体前景,从而达到目标检测的目的。 OpenCV已经实现了几种非常容易使用的算法。 环境 Python 3.6
用户1332428
2018/03/09
3.9K0
计算机视觉 | Python OpenCV 3 使用背景减除进行目标检测
图片中的人物和背景分离
链接:https://cloud.tencent.com/developer/article/2467199这篇文章详细介绍了通过API接口创建企微获客链接时出现了中文乱码问题,对于这种中文乱码的问题,一般来说通常可以通过设置请求头内容类型的方式来解决
七条猫
2024/11/27
1880
OpenCV 入门之旅
OpenCV 是一个强大的图片处理工具,尤其是随着人工智能、图片识别等行业的兴起,这个第三方库也越来越受到重视,今天我们就一起来开启 OpenCV 之旅
周萝卜
2021/12/01
2.1K0
OpenCV 入门之旅
独家 | 无人驾驶项目实战: 使用OpenCV进行实时车道检测
大约十年前,我瞥见了第一辆自动驾驶汽车,当时Google仍在对初代无人车进行测试,而我立刻被这个想法吸引了。诚然,在将这些概念开源给社区之前,我必须等待一段时间,但是这些等待是值得的。
数据派THU
2020/07/09
1.8K0
独家 | 无人驾驶项目实战: 使用OpenCV进行实时车道检测
OpenCV: 分水岭算法的图像分割及Grabcut算法交互式前景提取
任何灰度图像都可以看作是一个地形表面,其中高强度的像素表示山峰,低强度表示山谷。可以用不同颜色的水(标签)填充每个孤立的山谷(局部最小值)。随着水位的上升,根据附近的山峰(坡度),来自不同山谷的水明显会开始合并,颜色也不同。为了避免这种情况,要在水融合的地方建造屏障。继续填满水,建造障碍,直到所有的山峰都在水下。然后创建的屏障将返回分割结果。这就是Watershed(分水岭算法)背后的“思想”。
用户3578099
2023/09/01
1.2K0
OpenCV: 分水岭算法的图像分割及Grabcut算法交互式前景提取
OpenCV3 和 Qt5 计算机视觉:6~10
它始终以未经处理的原始图像开始,这些图像是使用智能手机,网络摄像头,DSLR 相机,或者简而言之,是能够拍摄和记录图像数据的任何设备拍摄的。 但是,通常以清晰或模糊结束。 明亮,黑暗或平衡; 黑白或彩色; 以及同一图像数据的许多其他不同表示形式。 这可能是计算机视觉算法中的第一步(也是最重要的步骤之一),通常被称为图像处理(目前,让我们忘记一个事实,有时计算机视觉和图像处理可互换使用;这是历史专家的讨论。 当然,您可以在任何计算机视觉过程的中间或最后阶段进行图像处理,但是通常,用大多数现有设备记录的任何照片或视频首先都要经过某种图像处理算法。 这些算法中的某些仅用于转换图像格式,某些用于调整颜色,消除噪点,还有很多我们无法开始命名。 OpenCV 框架提供了大量功能来处理各种图像处理任务,例如图像过滤,几何变换,绘图,处理不同的色彩空间,图像直方图等,这将是本章的重点。
ApacheCN_飞龙
2023/04/27
2.8K0
使用 OpenCV+CVzone 进行实时背景替换
OpenCV是一个开源计算机视觉库,可提供播放不同图像和视频流的权限,还有助于端到端项目,如对象检测、人脸检测、对象跟踪等。
AI算法与图像处理
2021/09/06
2.5K0
使用 OpenCV+CVzone 进行实时背景替换
基于OpenCV的车辆变道检测
本期教程我们将和小伙伴们一起研究如何使用计算机视觉和图像处理技术来检测汽车在行驶中时汽车是否在改变车道!大家一定听说过使用OpenCV 的haar级联文件可以检测到面部、眼睛等,但是如果目标是汽车,公共汽车呢?
小白学视觉
2020/12/07
1.3K0
基于OpenCV的车辆变道检测
基于OpenCV的图像融合
Python是一种通用的编程语言,在分析数据方面非常流行,它还可以让帮助我们快速工作并更有效地集成系统。
AI算法与图像处理
2020/12/17
1.1K0
树莓派计算机视觉编程:11~13
本章是我们在前面各章中学习和展示的所有计算机视觉概念的最终总结。 在本章中,我们将使用我们较早学习的计算机视觉操作来实现一些实际项目。 我们还将学习一些新概念,例如背景减法和光流计算,然后在小型应用中进行演示。 本章包含许多动手的编程示例,以及有关代码和新功能的详细说明。
ApacheCN_飞龙
2023/04/27
1.5K0
图像分割应用:背景虚化!学会这招,又发现新大陆
背景模糊效果是一种常见的图像效果,主要用于拍摄特写镜头上。它可以给我们的图像增加了一种深度感,突出关注图像的某一部分。
AI算法与图像处理
2021/03/13
1.5K0
使用opencv实现实例分割,一学就会|附源码
无论是从酒店房间接听电话、在办公里楼工作,还是根本不想在家庭办公室等情况,电话会议模糊功能都可以让会议与会者专注于自己,这样的功能对于在家工作并希望保护其家庭成员隐私的人特别有用。 为了实现这样的功能,微软利用计算机视觉、深度学习以及实例分割技术实现。 在之前的博文中,介绍了如何利用YOLO以及OpenCV实现目标检测的功能,今天将采用Mask R-CNN来构建视频模糊功能。
用户3578099
2019/08/15
2.4K0
基于OpenCV修复表格缺失的轮廓--如何识别和修复表格识别中的虚线
通过扫描或照片对文档进行数字化处理时,错误的设置或不良的条件可能会影响图像质量。在识别的情况下,这可能导致表结构损坏。某些图标的处理结果可能只是有轻微的瑕疵,甚至只是一些小孔,但是无法将其识别为连贯的系统。有时在创建在单元格时,表的某些侧面可能也没有线的存在。表和单元格类型多种多样,因此通常所提出的代码可能并不适合所有情况。尽管如此,如果我们能对提取的表格进行少量修改,大部分程序仍然可以使用。大多数表格识别算法是基于表格的结构。由于没有完整的边线会使一些单元格无法被识别,导致不良的识别率,因此我们需要想办法修复这些丢失的线段。
AI算法与图像处理
2021/01/20
4.7K0
基于计算机视觉和OpenCV:创建一个能够计算道路交通流量的应用
本文将介绍如何在不需要大量的深度学习算法的情况下,基于计算机视觉来计算道路交通流量。本教程只使用Python和OpenCV,在背景差分算法的帮助下,实现非常简单的运动检测方法。 本项目所需要的代码: https://github.com/creotiv/object_detection_projects/tree/master/opencv_traffic_counting 主要内容 1.了解用于前景检测的背景差分算法的主旨 2.OpenCV图像滤波器 3.物体轮廓的检测 4.为进一步的数据操作构建处理
AiTechYun
2018/03/05
9800
基于计算机视觉和OpenCV:创建一个能够计算道路交通流量的应用
OpenCV 即时入门(全)
欢迎使用《OpenCV 即时入门》。 本书是专门为向您提供设置 OpenCV 所需的所有信息而创建的。 您将学习 OpenCV 的基础知识,开始构建第一个程序,并发现一些使用 OpenCV 的技巧。
ApacheCN_飞龙
2023/04/27
1.6K0
【01】opencv项目实践第一步opencv是什么-opencv项目实践-opencv完整入门以及项目实践介绍-opencv以土壤和水滴分离的项目实践-人工智
图像增强:首先对原始高清图像进行增强处理。常见的处理方法包括直方图均衡化、对比度增强等,以提高图像的可视化效果,突出水膜与背景之间的差异。
卓伊凡
2025/01/29
2090
使用OpenCV和Python构建运动热图视频
OpenCV(或称为“ 开源计算机视觉”)是英特尔于1999年开发的一个库,主要针对计算机视觉和实时视频操作,它使用C ++编写,但受不同语言(包括Python)的支持。
代码医生工作室
2020/01/16
1.4K0
使用OpenCV和Python构建运动热图视频
OpenCV视频分析背景提取与前景提取
OpenCV中支持的两种背景提取算法都是基于模型密度评估,然后在像素级对图像进行前景与背景分类的方法,它们具有相同的假设前提 – 各个像素之间是没有相关性的,跟它们算法思想不同的方法主要是基于马尔可夫随机场理论,认为每个像素跟周围的像素是有相关性关系,但是基于马尔可夫随机场的方法速度与执行效率都堪忧!所以OpenCV中没有实现。
OpenCV学堂
2019/05/22
5.1K0
OpenCV视频分析背景提取与前景提取
ApacheCN 计算机视觉译文集 20211110 更新
OpenCV3 和 Qt5 计算机视觉 零、前言 一、OpenCV 和 Qt 简介 二、创建我们的第一个 Qt 和 OpenCV 项目 三、创建一个全面的 Qt + OpenCV 项目 四、Mat和QImage 五、图形视图框架 六、OpenCV 中的图像处理 七、特征和描述符 八、多线程 九、视频分析 十、调试与测试 十一、链接与部署 十二、Qt Quick 应用 精通 Python OpenCV4 零、前言 第 1 部分:OpenCV 4 和 Python 简介 一、设置 OpenCV 二、Ope
ApacheCN_飞龙
2022/05/07
1.1K0
推荐阅读
相关推荐
使用OpenCV进行检测、跟踪移动物体
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验