Opencv实现绿幕视频背景替换功能
来源:本站原创|时间:2020-01-10|栏目:C语言|点击: 次
基于hsv颜色空间的实时背景替换:
#include<opencv2\opencv.hpp> using namespace cv; Mat replace_and_blend(Mat &frame, Mat&mask); Mat background,frame, hsv, mask,result; int main(int arc, char** argv) { background = imread("2.jpg"); namedWindow("input", CV_WINDOW_AUTOSIZE); imshow("src", background); VideoCapture capture; capture.open("1.mp4"); CvSize size = cvSize(capture.get(CV_CAP_PROP_FRAME_WIDTH), capture.get(CV_CAP_PROP_FRAME_HEIGHT)); VideoWriter writer("qq.avi", VideoWriter::fourcc('M', 'J', 'P', 'G'),12.0, size, true); while (capture.read(frame)) { imshow("input", frame); cvtColor(frame, hsv, CV_BGR2HSV); inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);//颜色过滤,得到mask绿色部分为1,其它部分都为0 imshow("mask", mask); Mat kernel = getStructuringElement(MORPH_RECT,Size(3,3)); morphologyEx(mask, mask, MORPH_DILATE, kernel); GaussianBlur(mask, mask, Size(3, 3), 0, 0);//0,0会根据Size自动算的 result = replace_and_blend(frame, mask); writer.write(result); char c = waitKey(1); if (c == 27) { break; } imshow("input", frame); imshow("result", result); } waitKey(0); return 0; } //通过颜色过滤得到的掩码为单通道图像 Mat replace_and_blend(Mat &frame, Mat &mask) { int rows = frame.rows; int cols = frame.cols; result = Mat::zeros(frame.size(), frame.type()); for (int i = 0; i < rows; i++) { uchar *pf = frame.ptr(i);//人物前景 uchar *pm = mask.ptr(i);//掩码 uchar *pb = background.ptr(i);//背景 uchar *pr = result.ptr(i);//结果 for (int j = 0; j < cols; j++) { pm++; if (*pm == 255)//背景 { pr[3 * j] = pb[3 * j]; pr[3 * j + 1] = pb[3 * j + 1]; pr[3 * j + 2] = pb[3 * j + 2]; } else if (*pm == 0)//前景 { pr[3 * j] = pf[3 * j]; pr[3 * j + 1] = pf[3 * j + 1]; pr[3 * j + 2] = pf[3 * j + 2]; } else //融合部分 { int m = *pm; double w = m / 255.0; pr[3 * j] = w *pb[3 * j] + (1-w) * pf[3 * j]; pr[3 * j + 1] = w * pb[3 * j + 1] + (1-w) * pf[3 * j + 1]; pr[3 * j + 2] = w * pb[3 * j + 2] + (1-w) * pf[3 * j + 2]; //或者取前景和背景的平均值 /*pr[3 * j] = (pb[3 * j] + pf[3 * j])/2; pr[3 * j + 1] = (pb[3 * j + 1] + pf[3 * j + 1])/2; pr[3 * j + 2] = (pb[3 * j + 2] + pf[3 * j + 2])/2;*/ } } } return result; } /* Mat replace_and_blend(Mat &frame, Mat&mask) { result = Mat::zeros(frame.size(), frame.type()); int h = frame.rows; int w = frame.cols; int dims = frame.channels(); int m ; double wt ; int b , g, r; int b1, g1, r1; int b2 , g2, r2 ; //指针操作速度最快,直接访问地址 for (int row = 0; row < h; row++) { uchar* current = frame.ptr<uchar>(row); uchar* bgrow = background.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 = wt*b1 + (1 - wt)*b2; g = wt*g1 + (1 - wt)*g2; r = wt*r1 + (1 - wt)*r2; *targetrow++ = b; *targetrow++ = g; *targetrow++ = r; } } } return result; } */
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
上一篇:Opencv实现图像灰度线性变换
栏 目:C语言
下一篇:详解C++ 多态的实现及原理
本文标题:Opencv实现绿幕视频背景替换功能
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/290.html
您可能感兴趣的文章
- 01-10数据结构课程设计-用栈实现表达式求值的方法详解
- 01-10使用OpenGL实现3D立体显示的程序代码
- 01-10求斐波那契(Fibonacci)数列通项的七种实现方法
- 01-10C语言 解决不用+、-、&#215;、&#247;数字运算符做加法
- 01-10使用C++实现全排列算法的方法详解
- 01-10用C++实现DBSCAN聚类算法
- 01-10深入全排列算法及其实现方法
- 01-10全排列算法的非递归实现与递归实现的方法(C++)
- 01-10用C语言实现单链表的各种操作(一)
- 01-10用C语言实现单链表的各种操作(二)
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 04-02jquery与jsp,用jquery
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10SublimeText编译C开发环境设置
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-10delphi制作wav文件的方法
- 01-11ajax实现页面的局部加载
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10C#中split用法实例总结