通过OpenCV对视频进行绿幕抠图
通过OpenCV对视频进行绿幕抠图
- 效果
- 代码
- 1、打开视频素材
- 2、保存视频路径及格式设置
- 3、读取一帧视频
- 4、寻找绿幕背景
- 5、融合
- 6、代码执行效果
效果
今天跟大家分享的是最近比较受大家喜欢的视频或图片的部分场景抠图替换,先不多说,先看效果:
这是原视频,在场景中有个电视机被制成了绿幕。
胆小的猫
这是另一个需要添加的视频,我们的目的是将下边的“美女”视频添加到上边视频的绿幕电视机上。
跳舞
这是最终合成之后的视频,可以看到,Tom打开电视后看到了鞠婧祎跳舞。
合成后的视频
代码
1、打开视频素材
VideoCapture capture, capture_TV;capture.open("./胆小的猫.flv");capture_TV.open("./跳舞.mp4");if ((!capture.isOpened()) || (!capture_TV.isOpened())){return -1;}
2、保存视频路径及格式设置
VideoWriter writer;writer.open("./my1.flv", writer.fourcc('F', 'L', 'V', '1'), 30, Size(1366, 768), true);//CAP_OPENCV_MJPEG
3、读取一帧视频
读的是一帧“胆小的猫”,并以此作为while循环的条件,后面的程序也都是在while循环中执行。
while (capture.read(frame)){ }
4、寻找绿幕背景
在每一帧图像中搜寻绿幕背景并筛选,如果当前帧图像不含有绿幕,则显示原图,如果含有绿幕,则读取一帧“跳舞”视频,并将其显示在绿幕上。
筛选的目的主要是避免一些绿色背景的干扰。
通过观察,在当前视频下去掉一些形态学操作并不影响效果,同时为了提高程序执行速度,所以就注销了部分代码。
//寻找绿幕cvtColor(frame, hsv, COLOR_BGR2HSV);inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), green_mask);//inRange(hsv, Scalar(50, 200, 200), Scalar(70, 255, 255), green_mask);//imshow("green_mask", green_mask);//k0 = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));//morphologyEx(green_mask, green_mask, MORPH_OPEN, k0);//k = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));//morphologyEx(green_mask, green_mask, MORPH_CLOSE, k);threshold(green_mask, green_mask_bin, 200, 255, THRESH_BINARY);findContours(green_mask_bin, contours, hierarchy, RETR_TREE, CHAIN_APPROX_NONE, Point(0, 0));vector <vector<Point>>::iterator iter = contours.begin();for (; iter != contours.end();){double g_dConArea = contourArea(*iter);if (g_dConArea < 290000 || g_dConArea > 320000){iter = contours.erase(iter);}else{++iter;}}if (contours.size() == 0){frame.copyTo(result);imshow("ImageShow2", frame);imshow("ImageShow", result);writer.write(result);}
5、融合
capture_TV.read(background);drawContours(mask, contours, -1, Scalar(255), CV_FILLED); for (int i = 0; i < (int)contours.size(); i++){Rect rect1 = boundingRect(Mat(contours[i]));resize(background, background, rect1.size());h = frame.rows;w = frame.cols;//int bg_row = 0;//dims = frame.channels();for (int row = 0; row < h; row++){uchar* current = frame.ptr<uchar>(row);//uchar* bgrow = background.ptr<uchar>(bg_row);uchar* maskrow = mask.ptr<uchar>(row);uchar* targetrow = result.ptr<uchar>(row);for (int col = 0; col < w; col++){m = *maskrow++;if (m == 255){ *targetrow++ = background.at<Vec3b>(row - rect1.y, col - rect1.x)[0];*targetrow++ = background.at<Vec3b>(row - rect1.y, col - rect1.x)[1];*targetrow++ = background.at<Vec3b>(row - rect1.y, col - rect1.x)[2];current += 3;}else if (m == 0){*targetrow++ = *current++;*targetrow++ = *current++;*targetrow++ = *current++;}}}}imshow("ImageShow2", frame);imshow("ImageShow1", background);imshow("ImageShow", result);writer.write(result);
6、代码执行效果
在MFC中通过窗口进行了显示对比,最后保存的视频在文件目录中。
程序执行
源代码下载链接:视频绿幕抠图程序源码https://download.csdn.net/download/weixin_46405486/14022257
或在此下载https://www.syjshare.com/res/EA0Z34CU
通过OpenCV对视频进行绿幕抠图相关推荐
- 视频编辑SDK,AE模版SDK,绿幕抠图SDK,AI人像分割SDK,VLOG模版SDK
蓝松短视频SDK(视频编辑.AE模版.绿幕抠图.人像分割.人体抠图.VLOG模版): 高集成度:SDK中的大部分功能,都是一行代码设置 高完整度:提供常见视频编辑UI界面,可直接使用 高独立性:蓝松S ...
- Unity3D视频绿幕抠图的实现及优化
Unity3D视频绿幕抠图的实现及优化 展开 本文是通过Shader处理绿幕的方式来实现Unity中视频(VideoPlayer)的绿幕抠图.因为项目原因,不追究细节(能用就好能用就好)orz可是我连 ...
- [小脚本] 基于opencv 的绿幕抠图
网上有一些 基于 opencv-python 的绿幕抠图算法,大多比较简单,只写明了最简单的原理,比如就是选择指定范围的颜色,然后在这个范围内的就抠掉. 但是简单的这样有一些问题,就是比如: 1)有些 ...
- html5 自动扣图,canvas像素点操作之视频绿幕抠图
本文介绍了canvas像素点操作之视频绿幕抠图,分享给大家,具体如下: 用法: context.putimagedata(imgdata, x, y, dx, dy, dwidth, dheight) ...
- html 像素 视频教程,canvas像素点操作之视频绿幕抠图
本文介绍了canvas像素点操作之视频绿幕抠图,分享给大家,具体如下: 用法: context.putImageData(imgData, x, y, dX, dY, dWidth, dHeight) ...
- opencv 绿幕抠图 python版 c++版
python版绿幕抠图 import cv2image = cv2.imread("images/green_screen.jpg") cv2.imshow("input ...
- 编程去除背景绿幕抠图,基于.NET+OpenCVSharp
摘要:本文介绍了一种使用OpenCVSharp对摄像头中的绿幕视频进行实时"抠人像.替换背景"的方式,对于项目中的算法进行了分析.本文中给出了简化OpenCVSharp中Mat.M ...
- 直播绿幕抠图的例子(绿幕抠图直播实例参考)
阿酷TONY / 2022-11-21 / 长沙 什么是绿幕抠图: 设定绿幕或绿布,做直播软件抠图,这时绿幕绿布就可以被实时的抠掉,绿色就变成透明了,只剩下绿幕外的人物,此时添加上直播的背景画质,就 ...
- 绿幕抠图在手机上使用认识.
简单介绍 疑问1: 绿幕技术在手机APP上合适吗? 毕竟带着绿布在户外不现实. 是的, 太不现实了, 我们之前不做也是这样想的, 用户量不大, 使用场景不大. 没有谁愿意在户外先支好绿布,然后再拍视频 ...
最新文章
- (1)搞一搞 seata 之 基础环境搭建
- Python之区块链入门,揭秘比特币
- .net函数查询_SQL查询语句总是先执行SELECT?你们都错了!
- Centos6.6安装Nginx
- java分部积分任务代码实现_数值积分 Java 实现
- AOL架构原则.优秀API设计.Yeoman工具
- unity, 删除animationEvent
- 录计算机,电脑屏幕上的操作怎么录制下来?
- matlab中radon函数6,matlab实用程序(六)
- 爬虫笔记——东方财富科创板数据爬取(selenium方法)
- 图论科学家教你如何安排婚礼座次
- Python学习路线,Python教程,Python入门,Python自学课程,Python学习网站
- 原码、反码、补码、移码存在的意义
- Notepad++增加读取二进制文件的功能——HexEditor的所有
- OIS利率查询_图表加数据OIS隔夜基准利率掉期
- windows命令行连接远程服务器MongoDB
- 深入了解,学习线索二叉树
- R语言导出CSV出现乱码的处理
- 实验6 图及其应用——图的遍历
- Head First 中BeatBox code,(内部类的使用)
热门文章
- js打开页面自动复制文本到剪贴板_浏览器剪贴板API的应用
- 年会模板汇总:PPT、策划案、游戏节目、流程、邀请函、背景音乐、主题词
- html怎么把字做成动画效果,如何使用HTML5 css3实现粒子效果文字动画特效(附完整代码)...
- 用于编辑计算机程序的语言是,编辑语言
- ubuntu codeblocks
- 最新百度爬虫页面生成自动SEO优化系统+视频教程
- Android Nes模拟器,nes/fc任天堂/小霸王游戏SDK集成
- 计算机二级Python 真题(基础题)
- 《黑客与画家》书评——lisp教主驾临
- $forceUpdate的使用详解