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)——视频背景替换相关推荐

  1. OpenCV C++案例实战六《绿幕视频背景替换》

    OpenCV C++案例实战六<绿幕视频背景替换> 前言 一.图像预处理 二.HSV色彩空间转换 1. cvtColor色彩空间转换 2. inRange抠图 三.背景替换 四.源码 总结 ...

  2. C++OpenCV系统学习(17)——图像分割与抠图(4)Grabcut

    1.Grabcut介绍 1.1Grabcut概述 Graph cuts是一种十分有用和流行的能量优化算法,在计算机视觉领域普遍应用于前背景分割(Image segmentation).立体视觉(ste ...

  3. OpenCV系统学习(基本了解完)

    1.下载安装.http://blog.csdn.net/poem_qianmo/article/details/19809337 2.框架架构http://blog.csdn.net/poem_qia ...

  4. C++OpenCV系统学习(3)——图像混合、调整亮度与对比度

    1.图像混合 1.1线性混合 f0和f1分别表示两张图像,g(x)是混合后的图像. 1.2相关API addWeight(src1,alpha,src2,beta,gamma,dst,dtype), ...

  5. Python OpenCV学习笔记之:使用MOG2视频背景消除

    为什么80%的码农都做不了架构师?>>>    # -*- coding: utf-8 -*- """ 视频背景消除 """ ...

  6. opencv opencl加速_回放 | OpenCV Webinar 3:OpenCV深度学习应用与原理分析

    OpenCV DNN模块提供了深度学习的推理,支持Caffe.Tensoflow.Torch.Darknet.ONNX等格式的模型,无需用户安装对应的深度学习框架,也无需进行模型格式转换,直接调用DN ...

  7. 城市道路积水识别监测系统 OpenCv深度学习

    城市道路积水识别监测系统利用OpenCv深度学习模型以及yolo网络架构,对城市道路积水识别检测如果发现道路积水立即抓拍预警.YOLO网络仅使用卷积层, 属于全卷积网络.这在减少了参数变量的同时, 加 ...

  8. Opencv图像分割小案例 --- 绿幕背景视频抠图

    基于HSV色彩空间的实时背景替换: 注:新更换的背景图必须和原视频的背景图尺寸一样.  相关API: 1. inRange()函数 opencv中的inRange()函数可实现二值化功能(这点类似th ...

  9. Opencv C++ 学习视频整理源代码(1)

    0.代码基本框架 #include <opencv2/opencv.hpp> #include <opencv2/tracking.hpp> #include <iost ...

最新文章

  1. 机器学习(15)精确率召回率F1-score(查看癌症预测结果的精确率、召回率)
  2. streaming优化:spark.default.parallelism调整处理并行度
  3. Python知识点笔记-列表list、元组tuple和dict类型
  4. IT兄弟连 JavaWeb教程 jQuery对AJAX的支持经典案例
  5. 雷军微博抽奖送的那台蔚来ES6 时隔10个月终于提到车了
  6. Spring学习总结(22)——spring-framework-bom解决spring的不同模块依赖版本不同问题...
  7. 【C/C++】size_t 数据类型
  8. java通讯录管理系统答辩_java版通讯录管理系统
  9. 如何用计算机计算社会,五险一金计算器到底该怎么用
  10. SSM仓库管理系统毕业设计-附源码061015
  11. nirsoft,很好的工具库
  12. 终于把AI换脸的原理搞清了
  13. Windows10安装Linux子系统Ubuntu 20.04LTS,轻松使用生信软件,效率秒杀虚拟机(转载)
  14. 对象存储2:数据存储类型-文件存储、块存储、对象存储详解
  15. android系统电视机排行榜,智能电视机排行榜前十名
  16. 复杂网络之社区发现算法
  17. 给定一个 32 位有符号整数,将整数中的数字进行反转。
  18. 面试-vue组件间通信
  19. 【玩转python】python实现代替QQ邮箱发出邮件(附源码,新手也能用!)
  20. Linux内核深度解析epub,Unix内核源码剖析 高清pdf版 含epub+mobi

热门文章

  1. 计算机管理系统工具 下没有用户名密码,电脑设置管理系统用户账户,更改用户名,设置密码等...
  2. UIQ的CEikEdwin文本框怎么设置自动滚动(转)
  3. HTML学生作业网页:使用HTML+CSS技术实现非遗文化网页设计题材【汉服文化—共12个页面】
  4. manjaro安装搜狗输入法(最简单,轻松三步)
  5. 浙江大华流媒体服务器型号,大华DAHUA网络视频存储服务器DH-EVS7024S-DY产品中心_DAV数字音视工程网...
  6. Symantec Backup Exec Agent For Linux防火墙问题
  7. 六、hibernate表与表之间的关系(多对多关系)
  8. iso映像_如何在Windows 7中刻录ISO映像
  9. 2014年国务院批准放假调休日期的具体安排通知
  10. PostgreSQL远程数据库连接 PostgreSQL pg_hba.conf 文件简析