C++OpenCV系统学习(17)——图像分割与抠图(6)——视频背景替换
1.关键知识点
- 分割算法选择
- 背景融合-高斯模糊
- 遮罩层生成
1.1分割算法的选择
- GMM/Kmeans:对视频的第一帧做trainning,对其他帧只做预言不做trainning。
- .基于色彩的处理方式
- RGB与HSV空间
最终看哪个方法失效更好。对视频的第一帧做trainning,对其他帧只做预言不做trainning。
1.2知识点补充
1.2.1概括
HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。
- 色调H:用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
- 饱和度S:取值范围为0.0~1.0;
- 亮度V:取值范围为0.0(黑色)~1.0(白色)。
RGB和CMY颜色模型都是面向硬件的,而HSV(Hue Saturation Value)颜色模型是面向用户的。HSV模型的三维表示从RGB立方体演化而来。设想从RGB沿立方体对角线的白色顶点向黑色顶点观察,就可以看到立方体的六边形外形。六边形边界表示色彩,水平轴表示纯度,明度沿垂直轴测量。
1.2.2HSV颜色分量范围
一般对颜色空间的图像进行有效处理都是在HSV空间进行的,然后对于基本色中对应的HSV分量需要给定一个严格的范围,下面是通过实验计算的模糊范围(准确的范围在网上都没有给出)。
H: 0— 180
S: 0— 255
V: 0— 255
此处把部分红色归为紫色范围:
2.完整程序
#include <opencv2/opencv.hpp>
#include<iostream>using namespace std;
using namespace cv;Mat replace_and_blend(Mat& frame, Mat& mask);
Mat background_01;
Mat background_02;int main()
{background_01 = imread("F:\\opencv\\opencv\\sources\\samples\\data\\leuvenA.jpg");background_02 = imread("F:\\opencv\\opencv\\sources\\samples\\data\\leuvenB.jpg");VideoCapture capture;capture.open("F:\\opencv\\opencv\\sources\\samples\\data\\Megamind.avi");if (!capture.isOpened()){printf("could not find the video file...\n");return -1;}namedWindow("input video", WINDOW_AUTOSIZE);namedWindow("new video", WND_PROP_AUTOSIZE);Mat frame,hsv,mask;int count = 0;while (capture.read(frame)){cvtColor(frame, hsv, COLOR_BGR2HSV);inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);//形态学操作Mat k = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));morphologyEx(mask, mask, MORPH_CLOSE, k);erode(mask, mask, k);GaussianBlur(mask, mask, Size(3, 3), 0, 0);Mat result = replace_and_blend(frame, mask);imshow("mask", mask);char c = waitKey(1);if (c == 27){break;}imshow("output result", result);imshow("input video", frame);}waitKey(0);return 0;
}Mat replace_and_blend(Mat& frame, Mat& mask)
{Mat result = Mat::zeros(frame.size(), frame.type());int h = frame.rows;int w = frame.cols;int dims = frame.channels();//replace and blendint m = 0;double wt = 0;int r = 0, g = 0, b = 0;int r1 = 0, g1 = 0, b1 = 0;int r2 = 0, g2 = 0, b2 = 0;for (int row = 0; row < h; row++){uchar* current = frame.ptr<uchar>(row);uchar* bgrow = background_01.ptr<uchar>(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++ = *bgrow++;*targetrow++ = *bgrow++;*targetrow++ = *bgrow++;current += 3;}else if (m == 0)//前景{*targetrow++ = *current++;*targetrow++ = *current++;*targetrow++ = *current++;bgrow += 3;}else{b1 = *bgrow++;g1 = *bgrow++;r1 = *bgrow++;b2 = *current++;g2 = *current++;r2 = *current++;//混合权重wt = m / 255.0;//混合b = b1 * wt + b2 * (1.0 - wt);g = g1 * wt + g2 * (1.0 - wt);r = r1 * wt + r2 * (1.0 - wt);*targetrow++ = b;*targetrow++ = g;*targetrow++ = r;}}}return result;
}
C++OpenCV系统学习(17)——图像分割与抠图(6)——视频背景替换相关推荐
- OpenCV C++案例实战六《绿幕视频背景替换》
OpenCV C++案例实战六<绿幕视频背景替换> 前言 一.图像预处理 二.HSV色彩空间转换 1. cvtColor色彩空间转换 2. inRange抠图 三.背景替换 四.源码 总结 ...
- C++OpenCV系统学习(17)——图像分割与抠图(4)Grabcut
1.Grabcut介绍 1.1Grabcut概述 Graph cuts是一种十分有用和流行的能量优化算法,在计算机视觉领域普遍应用于前背景分割(Image segmentation).立体视觉(ste ...
- OpenCV系统学习(基本了解完)
1.下载安装.http://blog.csdn.net/poem_qianmo/article/details/19809337 2.框架架构http://blog.csdn.net/poem_qia ...
- C++OpenCV系统学习(3)——图像混合、调整亮度与对比度
1.图像混合 1.1线性混合 f0和f1分别表示两张图像,g(x)是混合后的图像. 1.2相关API addWeight(src1,alpha,src2,beta,gamma,dst,dtype), ...
- Python OpenCV学习笔记之:使用MOG2视频背景消除
为什么80%的码农都做不了架构师?>>> # -*- coding: utf-8 -*- """ 视频背景消除 """ ...
- opencv opencl加速_回放 | OpenCV Webinar 3:OpenCV深度学习应用与原理分析
OpenCV DNN模块提供了深度学习的推理,支持Caffe.Tensoflow.Torch.Darknet.ONNX等格式的模型,无需用户安装对应的深度学习框架,也无需进行模型格式转换,直接调用DN ...
- 城市道路积水识别监测系统 OpenCv深度学习
城市道路积水识别监测系统利用OpenCv深度学习模型以及yolo网络架构,对城市道路积水识别检测如果发现道路积水立即抓拍预警.YOLO网络仅使用卷积层, 属于全卷积网络.这在减少了参数变量的同时, 加 ...
- Opencv图像分割小案例 --- 绿幕背景视频抠图
基于HSV色彩空间的实时背景替换: 注:新更换的背景图必须和原视频的背景图尺寸一样. 相关API: 1. inRange()函数 opencv中的inRange()函数可实现二值化功能(这点类似th ...
- Opencv C++ 学习视频整理源代码(1)
0.代码基本框架 #include <opencv2/opencv.hpp> #include <opencv2/tracking.hpp> #include <iost ...
最新文章
- 机器学习(15)精确率召回率F1-score(查看癌症预测结果的精确率、召回率)
- streaming优化:spark.default.parallelism调整处理并行度
- Python知识点笔记-列表list、元组tuple和dict类型
- IT兄弟连 JavaWeb教程 jQuery对AJAX的支持经典案例
- 雷军微博抽奖送的那台蔚来ES6 时隔10个月终于提到车了
- Spring学习总结(22)——spring-framework-bom解决spring的不同模块依赖版本不同问题...
- 【C/C++】size_t 数据类型
- java通讯录管理系统答辩_java版通讯录管理系统
- 如何用计算机计算社会,五险一金计算器到底该怎么用
- SSM仓库管理系统毕业设计-附源码061015
- nirsoft,很好的工具库
- 终于把AI换脸的原理搞清了
- Windows10安装Linux子系统Ubuntu 20.04LTS,轻松使用生信软件,效率秒杀虚拟机(转载)
- 对象存储2:数据存储类型-文件存储、块存储、对象存储详解
- android系统电视机排行榜,智能电视机排行榜前十名
- 复杂网络之社区发现算法
- 给定一个 32 位有符号整数,将整数中的数字进行反转。
- 面试-vue组件间通信
- 【玩转python】python实现代替QQ邮箱发出邮件(附源码,新手也能用!)
- Linux内核深度解析epub,Unix内核源码剖析 高清pdf版 含epub+mobi
热门文章
- 计算机管理系统工具 下没有用户名密码,电脑设置管理系统用户账户,更改用户名,设置密码等...
- UIQ的CEikEdwin文本框怎么设置自动滚动(转)
- HTML学生作业网页:使用HTML+CSS技术实现非遗文化网页设计题材【汉服文化—共12个页面】
- manjaro安装搜狗输入法(最简单,轻松三步)
- 浙江大华流媒体服务器型号,大华DAHUA网络视频存储服务器DH-EVS7024S-DY产品中心_DAV数字音视工程网...
- Symantec Backup Exec Agent For Linux防火墙问题
- 六、hibernate表与表之间的关系(多对多关系)
- iso映像_如何在Windows 7中刻录ISO映像
- 2014年国务院批准放假调休日期的具体安排通知
- PostgreSQL远程数据库连接 PostgreSQL pg_hba.conf 文件简析