开发者社区> season雅宁> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介: 程序流程: 1.图像采集 先从opencv(2.4.10版本)采集回来摄像头的图像,是一帧一帧的 每一帧图像是一个矩阵,opencv中的mat 数据结构。   2.人脸的美化 人脸美化,我们用的皮肤检测,皮肤在颜色空间是特定的一个区域 检测到这个区域(感兴趣区域),完后对这个区域进行美化,就是滤波,主要是双边滤波和高斯滤波。
+关注继续查看

程序流程:


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



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Redis】(二)Redis命令大全(速记)
【Redis】(二)Redis命令大全(速记)
23 0
moon-easy-api:自动化生成基于MongoDB的接口
moon-easy-api:自动化生成基于MongoDB的接口
62 0
直播软件开发,你知我知大家知的接口幂等性
直播软件开发,你知我知大家知的接口幂等性
39 0
Redis夺命连环11问
这是面试题系列第三篇--redis专题。 # 说说Redis基本数据类型有哪些吧 1. 字符串:redis没有直接使用C语言传统的字符串表示,而是自己实现的叫做简单动态字符串SDS的抽象类型。C语言的字符串不记录自身的长度信息,而SDS则保存了长度信息,这样将获取字符串长度的时间由O(N)降低到了O(1),同时可以避免缓冲区溢出和减少修改字符串长度时所需的内存重分配次数。 2. 链表
1237 0
阿里架构师8问Redis,全对算你赢
Redis号称支持并发11万读操作、并发8万写操作。由于优异的性能和方便的操作, Redis在国内各大公司都很热门,比如阿里、腾讯、字节跳动、百度、美团、小米等。
1032 0
一种基于AliOS Things的uData感知设备软件框架
  uData框架设计之初的思想是基于传统sensorhub概念基础之上的,结合IoT的业务场景和AliOS Things物联网操作系统的特点设计而成的一个面对IoT的感知设备处理框架。
5367 0
Redis系列之key操作命令与Redis中的事务详解(六)
原文:Redis系列之key操作命令与Redis中的事务详解(六) 序言 本篇主要目的有二: 1、展示所有数据类型中key的所有操作命令,以供大家学习,查阅,更深入的挖掘redis潜力。 2、掌握redis中的事务,让你的数据完整性一致性拥有更优的保障。
1838 0
+关注
season雅宁
大数据生态圈,计算机视觉,机器学习,高端技术的爱好者,话不多说,上代码!!!
287
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载