基于HSV色彩空间的实时背景替换:

注:新更换的背景图必须和原视频的背景图尺寸一样。 

相关API:

1. inRange()函数

opencv中的inRange()函数可实现二值化功能(这点类似threshold()函数),更关键的是可以同时

针对多通道进行操作,使用起来非常方便!主要是将在两个阈值内的像素值设置为白色(255),

而不在阈值区间内的像素值设置为黑色(0),该功能类似于之间所讲的双阈值化操作。

函数原型(C++):

    void inRange(InputArray src, InputArray lowerb,InputArray upperb, OutputArray dst);

参数解释

  • 参数1:输入要处理的图像,可以为单通道或多通道。
  • 参数2:包含下边界的数组或标量。
  • 参数3:包含上边界数组或标量。
  • 参数4:输出图像,与输入图像src 尺寸相同且为CV_8U 类型。

请注意:该函数输出的dst是一幅二值化之后的图像。

代码演示:

#include<iostream>
#include<opencv2/opencv.hpp>using namespace std;
using namespace cv;Mat replace_and_blend(Mat &frame, Mat &mask);
Mat background_01;
Mat background_02;int main(int argc, char** argv)
{background_01 = imread("E:/技能学习/opencv图像分割/bg_01.jpg");background_02 = imread("E:/技能学习/opencv图像分割/bg_02.jpg");VideoCapture capture;capture.open("E:/技能学习/opencv图像分割/01.mp4");if (!capture.isOpened()){cout << "could not load video!" << endl;return -1;}char* title = "input video";char* resultWin = "result video";namedWindow(title, WINDOW_AUTOSIZE);namedWindow(resultWin, WINDOW_AUTOSIZE);Mat frame, hsv, mask;while (capture.read(frame)){cvtColor(frame, hsv, COLOR_BGR2HSV);inRange(hsv, Scalar(35, 43, 46), Scalar(155, 255, 255), mask);//对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);char c = waitKey(1);if (c == 27){break;}//imshow("mask", mask);imshow(resultWin, result);imshow(title, frame);}waitKey(0);destroyAllWindows();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;
}

结果展示:

Opencv图像分割小案例 --- 绿幕背景视频抠图相关推荐

  1. 绿幕背景视频抠图替换

    首先说明,参考的博客 https://blog.csdn.net/linqianbi/article/details/78975998 https://blog.csdn.net/linqianbi/ ...

  2. opencv 绿幕背景视频抠图

    文章目录 一.说明 二.程序实例 三.结果展示 一.说明 在视频中采用KMeans或者GMM的算法效率太低了,用来做视频抠图效果不好,这里使用了一个更加便捷的方式.就是HSV格式. 由于在视频中只有的 ...

  3. 基于opencv的绿幕背景视频抠图算法流程

  4. 绿幕背景抠图,去除掉物体周围一圈的绿边 OpenCVForUnity

    近段时间采用OpenCVForUnity在Unity中做图像分割 利用HSV方法进行 绿幕抠图 有一个问题,抠出的图像存在一层绿色的边(个人认为是没有分割清楚造成的). 解决办法:用OpenCV中的f ...

  5. 基于OpenCV+CUDA实时视频抠绿、背景合成以及抠绿算法小结

    一.关于抠绿 百度百科上描述抠绿"抠绿是指在摄影或摄像时,以绿色为背景进行拍摄,在后期制作时使用特技机的"色键"将绿色背景抠去,改换其他更理想的背景的技术."绿 ...

  6. 【学习OpenCV4】教你替换绿幕背景

    绿幕图像的背景替换 一.色彩空间转换 二.提取绿幕区域 三.替换背景 绿幕图像的背景替换需要经历①色彩空间转换.②提取绿幕区域.③反转绿幕区域.④复制图像,其中遇到的各种函数和代码也都在本文有详细介绍 ...

  7. 【我的OpenGL学习进阶之旅】 OpenGL ES 实现 绿幕抠图 以及 替换绿幕背景的功能

    一.绿幕抠图 "近来,我们总是不经意间看到一些自媒体公众号,影评人在谈到某部上映的影视剧制作如何稀烂,演员如何不敬业时总会用到"抠图"这个词.似乎"抠图&quo ...

  8. 绿幕特效视频的透明通道输出与拼合为图像矩阵

    既然之前的特效实现提升到了质的飞跃,那么就考虑敌机(本机)爆炸时的效果问题了. 首先download下某个绿幕爆炸特效视频: 本次使用aftereffects进行抠像: 首先视频导入到ae中,在效果- ...

  9. 视频教程-OpenCV图像分割实战视频教程-计算机视觉

    OpenCV图像分割实战视频教程 贾志刚 2004毕业于山东大学齐鲁软件学院,软件工程专业.专注于图像处理算法学习与研究,计算机视觉OpenCV开发应用,深度学习在计算机视觉领域应用.书籍<Ja ...

最新文章

  1. 【LDA学习系列】MCMC之Metropolis-Hastings采样算法python代码理解
  2. 人才测评——帮你“透视”人才
  3. 阿里的盔甲、未来20年发展的动力以及对未来的洞察
  4. java 连接mysql工具类_java连接Mysql数据库的工具类
  5. 素描滤镜c语言算法,python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现).pdf...
  6. Linux bind DNS配置
  7. android okhttputils传数组,okhttp传递数组参数
  8. close与volume的相关性
  9. Excel VBA 学习总结 - 基础知识
  10. 算法:(1)确定字符互异
  11. 黑苹果 惠普笔记本电池补丁_笔记本的黑苹果之路
  12. 天池比赛TASK3打卡
  13. 【C语言】强符号与弱符号
  14. 使用PLSQL Developer往 Oracle数据库插入中文数据变问号
  15. 《被讨厌的勇气》--读后感
  16. 剑指Offer 40—最小的k个数
  17. 李沐《动手学深度学习》第二版 pytorch笔记1 环境搭建
  18. 中医药人工智能-知识图谱-开发设计案例
  19. 今晨Windows7系统和Office2010安装经历
  20. Android实现意见反馈剩余字数

热门文章

  1. “21天好习惯”第一期-9 鲁滨逊漂流记网页-1
  2. 民族证券午评:成交萎缩,延续调整格局
  3. Unity 数字孪生笔记1 工具介绍
  4. 【工作流】——如何创建流程图工作流
  5. 【Executors】线程池简单应用_CachedThreadPool
  6. python培训 深圳宝安
  7. 世界各国电压等级及频率
  8. SimpleDateFormat日期格式
  9. golang 数据类型
  10. JS video 禁止拖动进度条