基于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

时间: 2024-09-10 06:32:45

基于OpenCV 的美颜相机推送直播流的相关文章

基于Azure平台的信息推送系统设计与实现

基于Azure平台的信息推送系统设计与实现 大连理工大学  黄涛 自有人类,即有"信息过载"问题,人类对于信息选择的正确性和准确性遭受到很多冗余信息的干扰.目前,信息推送是一种满足个人特征需求,通过自动过滤或筛选,快速.连续.自动并且准确的传递给目标用户信息的技术,是有效解决信息冗余问题方法之一.所以,设计一种使用户可以自动获取信息的信息推送系统显得十分必要. 本文设计并实现了基于微软的Windows Azure云计算平台的信息推送系统.系统模块包括信息处理模块.Web管理模块.存储模

ffmpeg推送rtmp流到nginx问题

问题描述 ffmpeg推送rtmp流到nginx问题 解决方案 为什么会出现红色字体的问题呢?求助啊

OpenCV实时美颜摄像并生成H264视频流

        为什么美颜摄像这么简单的功能,OpenCV这个开源项目网上很少有代码呢?对于在windows平台下,生成h264视频流也比价麻烦,没有现成的api可以使用,需要借助MinGw编译libx264,或者ffmpeg才能使用. 最近有个小需求,要推送直播视频流,我在网上查了一下有live555或者用librtmp来推送,但是前者还需要修改源代码,也挺麻烦的,现在先做到了下面几个步骤: 1.OpenCV捕捉摄像头的图像 2.进行识别需要美颜的部分(人脸识别,肤色识别) 3.进行美颜(提升

现代IM系统中消息推送和存储架构的实现

前言 IM全称是『Instant Messaging』,中文名是即时通讯.在这个高度信息化的移动互联网时代,生活中IM类产品已经成为必备品,比较有名的如钉钉.微信.QQ等以IM为核心功能的产品.当然目前微信已经成长为一个生态型产品,但其核心功能还是IM.还有一些非以IM系统为核心的应用,最典型的如一些在线游戏.社交应用,IM也是其重要的功能模块.可以说,带有社交属性的应用,IM功能一定是必不可少的. IM系统在互联网初期即存在,其基础技术架构在这十几年的发展中更新迭代多次,从早期的CS.P2P架

Android推送服务:百度云推送

一.推送服务简介 消息推送,顾名思义,是由一方主动发起,而另一方与发起方以某一种方式建立连接并接收消息.在Android开发中,这里的发起方我们把它叫做推送服务器(Push Server),接收方叫做客户端(Client).相比通过轮询来获取新消息或通知,推送无论是在对客户端的资源消耗还是设备耗电量来说都比轮询要好,所以,目前绝大多数需要及时消息推送的App都采用Push的方式来进行消息通知. Android生态系统原本提供了类似于Apple iOS推送服务APNS的GCM(Google Clo

android-Android推送功能和数据传输功能是否应该分开实现?

问题描述 Android推送功能和数据传输功能是否应该分开实现? 整理了一个通信框架,基于Mina,传输和推送使用的是同一个长连接,通信方式是异步的.现在想实现RMI远程方法调用,把通信方式改为同步,并且使用短连接的方式,每个方法调用结束后就断开连接.这样就必须把推送功能跟传输功能分开,看了其他人的项目,好像都是另起一个服务来执行推送的,是不是我原先的设计就是错误的,传输和推送本来就该分开? 解决方案 分开的好处是,简化了每部分代码的量,使得架构更清晰,提高了程序的鲁棒性. 解决方案二: 而且数

Android实现推送方式解决方案

原文:http://www.cnblogs.com/hanyonglu/archive/2012/03/04/2378971.html 本文介绍在Android中实现推送方式的基础知识及相关解决方案.推送功能在手机开发中应用的场景是越来起来了,不说别的,就我们手机上的新闻客户端就时不j时的推送过来新的消息,很方便的阅读最新的新闻信息.这种推送功能是好的一面,但是也会经常看到很多推送过来的垃圾信息,这就让我们感到厌烦了,关于这个我们就不能多说什么了,毕竟很多商家要做广告.本文就是来探讨下Andro

深入了解 Dojo 的服务器推送技术

服务器推送技术和 Bayeux 协议简介 服务器推送技术的基础思想是将浏览器主动查询信息改为服务器主动发送信息.服务器发送一批数据,浏览器显示这些数据,同时保证与服务器的连接.当服务器需要再次发送一批数据时,浏览器显示数据并保持连接.以后,服务器仍然可以发送批量数据,浏览器继续显示数据,依次类推.基于这种思想,这里我们要引出 Bayeux 协议. Bayeux 是一套基于 Publish / Subscribe 模式,以 JSON 格式在浏览器与服务器之间传输事件的通信协议.该协议规定了浏览器与

Android推送通知指南

在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相对比较麻烦,最近利用几天的时间对Android的推送通知服务进行初步的研究. 在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务,起初我就是准备采用这个服务来实现自己手机上的推送功能. Android Cloud to Device Mes