基于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*64CPs_CircleBuffer* m_pCircleBuffer;void CameraToH264(void *pcn) 
{CvCapture* capture;//VideoCapture capture;Mat frame;//-- 1. Load the cascadesif( !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



转载于:https://www.cnblogs.com/wuyida/p/6301278.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring线程池服务

线程池对于执行同步和异步过程非常重要。 本文介绍如何使用Spring开发和监视线程池服务。 创建线程池已通过两种替代方法进行了说明。 二手技术 : JDK 1.6.0_21 Spring3.0.5 Maven的3.0.2 步骤1:建立已完成的专案 创建一个Maven项目,如下…

我的世界java村民繁殖_我的世界:Java19w08a更新,村民加强守卫,小狐狸背叛

虽然这句话很绕口,其实意思很简单,那就是之前的隐身药水没有什么用,该被打还是被打。因为这个可是害惨了流浪商人,不过这次好了,流浪商人在喝了隐身药水之后就能安全度过晚上了。NO.3 皮革马铠马铠是属于马的盔甲&…

欧莱雅眉笔banner个人设计

眉笔名称:眉笔大师三头塑形眉笔 ,之所以没用吧这个商品名称放大,是我觉得它是一个名称,而我把自己想的广告词“出彩只需一笔” 放大不仅能凸显出这只笔的强大,还表示了一种有了我这支眉笔你会更出彩更漂亮&#xff0c…

使用带有注释和JQuery的Spring MVC 3的Ajax

与Ajax一起工作对我来说一直很有趣! 是不是 ? 我将使您轻松将Ajax与Spring MVC 3和JQuery结合使用。 这篇文章将向您说明如何在工业编码的现实生活中使用Ajax。 和往常一样,我们将在Spring MVC 3框架中以Ajax的实际示例为例,并将其…

java百度云文件上传_关于如何在自己项目集成百度云BCE文件上传STS方案

1、 项目背景由于本人项目需要,需要在视频点播服务之中需要加载字幕文件(通用格式srt),经过比较好几家的公有云服务,最后选择只有百度云提供字幕服务。字幕:我们通常在观看外语电影的是,没有国语版时候只能通过下载字幕…

hdu 3507 Print Article(斜率优化DP)

题目链接:hdu 3507 Print Article 题意: 每个字有一个值,现在让你分成k段打印,每段打印需要消耗的值用那个公式计算,现在让你求最小值 题解: 设dp[i]表示前i个字符需要消耗的最小值,那么有dp[i]…

第三章 consul服务注册与服务查询

1、定义一个服务 https://www.consul.io/docs/agent/services.html 该方法是服务注册中提供服务的最常用的方法。 关于服务的定义:服务的属性我们会在后边每出现一个总结一个,最后再做总结。 2、服务注册 2.1、创建服务文件所存放的文件夹 说明&#xff…

coreos 安装mysql_CoreOS 在 PC 上快速安装方法指南

意义能够以最快的速度安装部署Linux操作系统。安装快速简单,几乎不花时间就可以开始运行Docker。运行速度非常快。使用内存硬盘。我的情况win8 笔记本偶尔玩游戏,但是装Linux双系统可能需要我一天的时间来完成。我的所有业务都只需要在Docker中跑就可以了…

Session 的配置和特性

session的配置 对于session的配置是php.ini中配置 session数据都是保存在文本文件中 设置session文件的保存位置 说明: 默认是保存在windows/temp目录 设置session保存作为客户端标识的数据使用cookie 设置session保存客户端标识的数据,只使用cookie 说明…

OAuth与Spring Security

摘自Wikipedia: OAuth ( 开放式身份验证 )是一种开放式身份验证标准。 它允许用户与其他站点共享存储在一个站点上的私有资源(例如照片,视频,联系人列表),而不必发出其凭据&#xff…

UIViewController生命周期

UIViewController生命周期 UIViewController生命周期 posted on 2016-04-07 20:15 相而勿绝 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/fmdxiangdui/p/5365249.html

众筹源码 php,助创cms众筹源码系统v1.0

什么是助创cms众筹系统?使用“预约团购”的众筹方式给自己的创意争取大家的关注和支持,是近年来非常火热的一种融资模式,助创cms众筹系统可以10分钟帮你打造一个和京东众筹一样的平台,包含产品众筹和公益众筹两个部分,可以直接拿…

69 个经典 Spring 面试题和答案

Spring 概述 什么是spring?Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。使用Spring框架…

高性能MySql

1、索引是对DB优化最有效的方式 varchar(10)定义的是字符的个数,如果是utf-8的话,最大是3X10个字节 二、索引类型 1、MySql的索引是在存储引擎层实现的,各个存储引擎的的索引方式也是不同的 2、B-Tree索引 MyISAM索引通过数据的物理位置引用被…

Java Swing井字游戏

大家好! 哇,自从我在这里发布了东西以来已经有一段时间了! 我必须说我真的很想写东西,而且我保证我不会再陷入“作家的障碍”。 希望 ..最近两个月发生了很多事情,我有很多话要说。 但是在这篇文章中,我只是…

event php,PHP event 事件机制

/** PHP 事件机制*/class baseClass{private $_e;public function __set($name,$value){if( strncasecmp($name,"on",2) 0 ){if(!isset($this->_e[$name]))$this->_e[$name] array();return array_push($this->_e[$name] , $value);}}public function __g…

Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组...

版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/。 目录(?)[] 一:什么是静态内存什么又是动态内存呢? 静态内存:是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始…

配置MyBatis 3

MyBatis是一个非常流行且也是最有效的SQL映射框架。 MyBatis可用于Java和.net语言。 MyBatis并不是Hibernate的真正替代品,但是我们可以使用该框架来减少MyBatis提供的高效和高性能的数据库相关代码。 本教程将向您展示使用数据库配置MyBatis 3的步骤。 MyBatis 3支…

java中datetime类型转换,Java中日期格式和其他类型转换详解

涉及的核心类:Date类、SimpleDateFormat类、Calendar类一、Date型与long型Date型转换为long型Date date new Date();//取得当前时间Date类型long date2long date.getTime();//Date转longlong型转换为Date型long cur System.currentTimeMills();//取得当前时间lon…

GWT MVP变得简单

GWT Model-View-Presenter是用于大规模应用程序开发的设计模式。 它源于MVC,它在视图和逻辑之间进行划分,并有助于创建结构良好,易于测试的代码。 为了帮助像我这样的懒惰开发人员,我研究了如何减少使用声明式UI时要编写的类和接口…