基于OpenCV 的美颜相机推送直播流
程序流程:
1.图像采集
先从opencv(2.4.10版本)采集回来摄像头的图像,是一帧一帧的
每一帧图像是一个矩阵,opencv中的mat 数据结构。
2.人脸的美化
人脸美化,我们用的皮肤检测,皮肤在颜色空间是特定的一个区域
检测到这个区域(感兴趣区域),完后对这个区域进行美化,就是滤波,主要是双边滤波和高斯滤波。
3.视频格式转换以及编码
处理好的矩阵颜色空间是rgb的,需要转换成yuv,yuv的颜色空间就是可以播放的,类似我们电视上面看的画面,编码就是传输时候需要发送流,只个流相当于针对数据的压缩,将yuv格式的视频帧编码成h264的格式
Rgb转换成yuv,opencv实现(美颜在这一步实现)
Yuv转换成h264,x264实现
H264转换成rtmp流,libxrtmp实现
4.发送给服务器进行直播
H264的流一般就可以播放了,但是针对目前的网络直播主要是将h264转换成rtmp流,用rtmp的服务器进行播放,这块我们主要用的是adobe media server 5这个服务器进行接受工作
5.技术难点
1.将人脸美化转换为皮肤检测
2.各种编码的转换
3.缓冲区的控制,这块是一个读者写着模型
实现效果:
部分代码:
- #include "stdafx.h"
- #include "live_beautiful_camera_streaming.h"
- #include "CircleBuffer.h"
- using namespace std;
- using namespace cv;
- #define GOLABLE_BUFFER_SIZE 1024*64
- CPs_CircleBuffer* m_pCircleBuffer;
- void CameraToH264(void *pcn)
- {
- CvCapture* capture;
- //VideoCapture capture;
- Mat frame;
- //-- 1. Load the cascades
- if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading\n"); return ; };
- //if( !eyes_cascade.load( eyes_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };
- VideoCapture cap(0); //打开默认的摄像头号
- if(!cap.isOpened()) //检测是否打开成功
- return ;
- int w = cap.get(CV_CAP_PROP_FRAME_WIDTH);
- int h = cap.get(CV_CAP_PROP_FRAME_HEIGHT);
- int yuv_bufLen = w*h*3/2;
- unsigned char* pYuvBuf = new unsigned char[yuv_bufLen];
- int index = 0;///
- for(;;)
- {
- Mat frame;
- cap >> frame; // 从摄像头中获取新的一帧
- //detectAndDisplay( frame );
- imshow("original image", frame);
- //按esc推出
- if(waitKey(40) == 27) break;
- //detectAndenhance(frame);
- //imshow("enhance image",equalizeIntensityHist(frame));
- Mat temp;
- //SkinRGB(&IplImage(frame),&IplImage(temp));
- //highlight(frame);
- MySkinEnhance(frame);
- /////////////////////////////////////////
- cv::Mat yuvImg;
- cv::cvtColor(frame, yuvImg, CV_BGR2YUV_I420);
- memcpy(pYuvBuf, yuvImg.data, yuv_bufLen*sizeof(unsigned char));
- MyOneFrameYuvtoH264(w,h,(char *)pYuvBuf);
- }
- //摄像头会在VideoCapture的析构函数中释放
- waitKey(0);
- delete[] pYuvBuf;
- }
- void H264ToRtmp(void *pcn)
- {
- Sleep(3000);
- My_SendH264To_Rtmp();
- }
- /**
- * @function main
- */
- int main( void )
- {
- m_pCircleBuffer = new CPs_CircleBuffer(GOLABLE_BUFFER_SIZE);
- HANDLE h_cameraToh264;
- h_cameraToh264 = (HANDLE)_beginthread((void(__cdecl *)(void *))CameraToH264,0,(void *)1);
- HANDLE h_h264ToRtmp;
- h_h264ToRtmp = (HANDLE)_beginthread((void(__cdecl *)(void *))H264ToRtmp,0,(void *)1);
- WaitForSingleObject(h_cameraToh264,INFINITE);
- WaitForSingleObject(h_h264ToRtmp,INFINITE);
- Sleep(100);
- return 0;
- }
---------------------------------后续更新,20160506-------------------------------------------------------------------------------------------------------
该程序的性能跟美颜处理的算法效果息息相关,最近发现了一个联合双边滤波器,有时间 的话集成上去效果应该不错,下面是介绍:
这十年来,在图像处理领域提出了很多新的图像分析和处理方法,包括是自动的以及一些需要有人工参与的,典型的比如stereo depth computations、image colorization、tone mapping of high dynamic range (HDR) images、 graph cuts ,这些算法都有着比较好的效果,但都普遍存在一个问题:就是计算量特别大,很难满足用户的需求。而数字图像在尺寸大小上的增长速度这段时间也相当惊人。还有个问题就是有些算法需要解一个很大的稀疏矩阵方程,可能会大到系统的无法为接其过程分配足够的内存。因此,如果解决这两个问题,一个直观而又简单的想法就是:先处理原图下采样的小图,然后将处理后的结果在上采样。
但是,如此处理存在的问题就是上采样算法会直接影响到处理效果。如果是纯粹的最近邻插值、或者是双线性,抑或是三次立方等复杂点插值算法,都会使人感到效果失真。但是在这种情况下的我们实际上比简单的图像放大时多了一个信息的,就是我有原始的未做处理的并且未缩小的图像的信息,是否能利用这个信息来增强上采样的效果呢?目前我看到了两种这方面的算法。
一种就是联合双边滤波 :http://www.cnblogs.com/Imageshop/p/3677313.html
参考文献:
Adobe Flash Media Server 5.0.3
官方中文版:(下载地址和说明)
http://www.launchdigital.net/supportview.asp?bid=98&Sid=124&id=594
http://www.xdowns.com/soft/1/71/2014/Soft_116532.html
关于美颜 摄像头功能的部分说明:
http://blog.csdn.net/wangyaninglm/article/details/50806051
yuv格式编码为h264:
http://blog.csdn.net/leixiaohua1020/article/details/42078645
h264发送rtmp流:
http://www.cnblogs.com/haibindev/archive/2012/04/16/2450989.html
http://blog.csdn.net/leixiaohua1020/article/details/42105049
Adobe Flash Media Server 5.0.3
官方中文版:(下载地址和说明)
http://www.launchdigital.net/supportview.asp?bid=98&Sid=124&id=594
http://www.xdowns.com/soft/1/71/2014/Soft_116532.html
关于美颜 摄像头功能的部分说明:
http://blog.csdn.net/wangyaninglm/article/details/50806051
yuv格式编码为h264:
http://blog.csdn.net/leixiaohua1020/article/details/42078645
h264发送rtmp流:
http://www.cnblogs.com/haibindev/archive/2012/04/16/2450989.html
http://blog.csdn.net/leixiaohua1020/article/details/42105049
环形缓冲区实现:http://blog.csdn.net/lezhiyong/article/details/7879558
完整代码下载:http://download.csdn.net/detail/wangyaninglm/9480783
github地址:https://github.com/wynshiter/live_beautiful_camera_streaming
基于OpenCV 的美颜相机推送直播流的更多相关文章
- ffmpeg推送直播流的技术进展
首先安装好NGINX并打开服务 然后安装好ffmpeg 然后参考:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=2879051 ...
- 基于Node.js的实时推送 juggernaut
基于Node.js的实时推送 juggernaut Juggernaut 基于 Node.js 构建.为浏览器和服务器端提供一个实时的连接,可在客户端和服务器端进行数据的实时推送,适合多角色游戏.聊天 ...
- 基于B/S模式的推送
基于B/S模式的推送 https://www.ibm.com/developerworks/cn/web/wa-lo-comet/ 传统模式的 Web 系统以客户端发出请求.服务器端响应的方式工作.这 ...
- Android消息推送(二)--基于MQTT协议实现的推送功能
国内的Android设备,不能稳定的使用Google GCM(Google Cloud Messageing)消息推送服务. 1. 国内的Android设备,基本上从操作系统底层开始就去掉了Googl ...
- Android 基于Netty接收和发送推送解决方案的消息字符串(三)
在上一篇文章中<Android 基于Netty的消息推送方案之概念和工作原理(二)> .我们介绍过一些关于Netty的概念和工作原理的内容,今天我们先来介绍一个叫做ChannelBuffe ...
- 基于 WebSocket 的 MQTT 移动推送方案
WebSphere MQ Telemetry Transport 简介 WebSphere MQ Telemetry Transport (MQTT) 是一项异步消息传输协议,是 IBM 在分析了他们 ...
- 基于C++ 苹果apns消息推送实现(2)
1.该模块的用途C++ 和 Openssl 代码 它实现了一个简单的apns顾客 2.配套文件:基于boost 的苹果apns消息推送实现(1) 3.最初使用的sslv23/sslv2/sslv3仅仅 ...
- EasyRTMP实现对接海康、大华等IPCamera SDK进行RTMP推送直播功能
本文转自EasyDarwin团队Kim的博客:http://blog.csdn.net/jinlong0603 Demo项目介绍 EasyRTMP Demo代码下载地址https://github.c ...
- EasyDarwin开源流媒体服务器如何实现按需推送直播的
--本文转自EasyDarwin开源团队成员邵帅的博客:http://blog.csdn.net/ss00_2012/article/details/51441753 我们使用EasyDarwin的推 ...
随机推荐
- 【The Time Traveller's Wife】
After reading The Time Traveller's Wife: It's a tragedy,I think.But it's mixed with hope.Henry ...
- [bzoj4151][AMPPZ2014]The Cave
来自FallDream的博客,未经允许,请勿转载,谢谢. 给定一棵有n个节点的树,相邻两点之间的距离为1. 请找到一个点x,使其满足所有m条限制,其中第i条限制为dist(x,a[i])+dist(x ...
- Python Django的分页,Form验证,中间件
本节内容 Django的分页 Form 中间件 1 Django 分页 1.1 Django自带的分页 1.首先来看下我的测试数据环境 ############ models.py ######### ...
- VS2012代码对齐快捷键
1.选中想要对齐的代码 2.全选代码后按住Ctrl+K,Ctrl+F键,就可以了
- GC机制
java虚拟机中的垃圾回收机制是,一个类,当该对象没有更多的应用指向它时,就会被垃圾回收器给回收,从而释放资源.该机制不可以程序员手动调用去回收某个对象,系统自动会去调用,当然程序员可以建议垃圾回收器 ...
- js去除空格,判断是否包含
js去除空格 function trimStr(str){ return str.replace(/(^\s*)|(\s*$)/g,""); } js判断是否包含 //是否包含 f ...
- 选取id不为sth的div元素
选取id不为sth的div元素$("div:not(#sth)")
- 如何上传本地项目到gitHub解决方案
最近有人有人问到我怎么将新创建的本地代码上传到github上,这里简单的记录一下,我喜欢使用命令行,这里全用命令行来实现,不了解Git命令的可以去了解下. 1. 建立本地仓库,cd到你想要上传文件的 ...
- ubuntu + 远程桌面连接命令 + rdesktop + 连接windows或者ubuntu远程桌面
原文 https://www.cnblogs.com/xiaouisme/p/5166469.html sudo apt-get install rdesktop rdesktop 124.42.12 ...
- 关于html+ashx开发中几个问题的解决方法
在跟html+ashx打交道的园友们肯定会发现,这种模式虽然优美,但在开发中会遇到一些难处理的地方.我也不例外,下面是自己在实际开发中总结出来的几条经验,希望跟大家分享,更希望得到大家的建议和更好的解 ...