前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于OpenCV 的美颜相机推送直播流

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

作者头像
流川疯
发布于 2019-01-18 08:40:50
发布于 2019-01-18 08:40:50
1.7K00
代码可运行
举报
运行总次数:0
代码可运行

程序流程:

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.缓冲区的控制,这块是一个读者写着模型

实现效果:

部分代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年04月04日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
音视频知识体系(基础篇4)----FLV格式解析
首先,我们来回顾一下直播的整个链路(详见 音视频知识体系(基础篇1)----媒体格式)。我们最常接触到的是直播的播放器端,例如,斗鱼、虎牙、快手、抖音里面的直播。我们又称播放器为收流端,技术上可以看作为流媒体数据的接收显示器。 在直播中,FLV格式流数据接收仍旧是主流,那我们这篇文章就来看下如何下载和处理FLV格式的流媒体数据。
jerrypxiao
2021/04/16
2.6K0
音视频知识体系(基础篇4)----FLV格式解析
关于Web flash推流的一些问题以及示例demo
https://young-cowboy.github.io/gallery/rtmp_client/index.html,网页界面如下:
frankqpfu
2019/03/16
2.8K1
记一次批量查看ffmpeg抽帧后的图片(格式为H264)
当前的公司刚好做一个抽帧的项目,具体是通过抽取本地已经录制保存的TF(SD)卡里的视频文件,以每秒/帧的方式抽取,生成的图片文件格式为H264,如下图所示
用户6367961
2019/09/30
2.2K0
记一次批量查看ffmpeg抽帧后的图片(格式为H264)
OpenCV实时美颜摄像并生成H264视频流
        为什么美颜摄像这么简单的功能,OpenCV这个开源项目网上很少有代码呢?对于在windows平台下,生成h264视频流也比价麻烦,没有现成的api可以使用,需要借助MinGw编译libx264,或者ffmpeg才能使用。
流川疯
2019/01/18
2.8K0
最简单的基于FFMPEG的视频编码器(YUV编码为H.264)
=====================================================
全栈程序员站长
2022/09/13
6650
最简单的基于FFMPEG的视频编码器(YUV编码为H.264)
基于OpenCV3实现人脸识别(实践篇)[通俗易懂]
由于篇幅原因,后面一篇写各个算法背后的原理,原理背后的相关知识的了解,人脸识别项目总遇到的问题
全栈程序员站长
2022/06/26
1.6K0
基于OpenCV3实现人脸识别(实践篇)[通俗易懂]
2023-03-07:x264的视频编码器,不用ffmpeg,用libx264.dll也行。请用go语言调用libx264.dl
2023-03-07:x264的视频编码器,不用ffmpeg,用libx264.dll也行。请用go语言调用libx264.dll,将yuv文件编码成h264文件。
福大大架构师每日一题
2023/06/08
2010
2023-03-07:x264的视频编码器,不用ffmpeg,用libx264.dll也行。请用go语言调用libx264.dl
微信 Android 视频编码爬过的那些坑
本文主要介绍了如何在移动端GPU上对视频进行高效的编码与解码,通过对比多种编码方式、使用GPU对视频进行硬件加速、利用GPU对视频进行实时处理、以及对视频进行高效压缩与解码,最终实现了在移动端GPU上对视频进行高效编码与解码的解决方案。
微信终端开发团队
2017/10/30
9.8K2
微信 Android 视频编码爬过的那些坑
最简单的基于Flash的流媒体示例:RTMP推送和接收(ActionScript)
=====================================================
smy
2019/02/13
2.1K0
最简单的基于Flash的流媒体示例:RTMP推送和接收(ActionScript)
我是这样搞定第一次单目相机测距的
之前在做一个单目测距的小项目,大概需要就是用单目相机,对一个特定的目标进行识别并测算相机与该目标的距离。所以便去网上找了一堆教程,这里给大家总结一下,希望给小白们一个参考。
周旋
2020/06/04
6.6K3
我是这样搞定第一次单目相机测距的
ffmpeg源码学习
• AVUtil:核心工具库,下面的许多其他模块都会依赖该库做一些基本的音视频处理操作。
vitofliu
2021/07/05
3.3K0
OpenCV保存H264视频的问题
在绝大多数的目标检测项目中,都是使用opencv这个开源的计算机视觉库来进行图片、视频或者摄像头的读写。
AI算法与图像处理
2021/09/06
6.3K0
OpenCV保存H264视频的问题
音视频码流工具汇总(建议收藏!)
大家好,今天给大家分享一些音视频分析工具,这些工具在我们平时开发过程中经常会用到,非常有帮助!
用户6280468
2023/08/31
2.8K0
音视频码流工具汇总(建议收藏!)
视音频数据处理入门:UDP-RTP协议解析「建议收藏」
=====================================================
全栈程序员站长
2022/09/13
1.7K0
视音频数据处理入门:UDP-RTP协议解析「建议收藏」
基于FFMpeg的C#录屏全攻略
      最近负责一个录屏的小项目,需要录制Windows窗口内容并压缩保存到指定文件夹,本想使用已有的录屏软件,但是本着学习的态度去探索了FFMpeg,本文主要介绍基于FFMpeg开源项目的C#录屏软件开发。      在Windows平台下开发录屏相比Linux比较复杂,Windows平台下录屏有gdigrab和dshow两种方法,由于gdigrab可修改属性受限,所以本文采用dshow方法实现录屏的功能,原理是注册录屏dshow滤镜(例如screen-capture-recorder),然后通过ds
waylon
2018/03/08
6K0
基于FFMpeg的C#录屏全攻略
ffmpeg 常用命令存档
https://blog.csdn.net/sinat_14826983/article/details/82975561
美女视频
2019/11/01
2.1K0
ffmpeg 常用命令存档
Qt音视频开发1-vlc解码播放
最开始接触视频监控这块的时候,用的就是vlc作为解码的内核,主要是因为vlc使用简单方便,直接传入一个句柄即可,简单几行代码就可以实现一个视频流播放,很适合初学者使用,也推荐初学者用qt+vlc来做播放器,提供的接口还是非常友好的,而且门类特别多,想要获取媒体文件的各种信息比如宽高,设置宽高比等,直接调用接口函数传入参数就能设置。
feiyangqingyun
2020/08/02
1.3K0
Qt音视频开发1-vlc解码播放
基于最简单的FFmpeg采样读取内存读写:存储转
=====================================================
全栈程序员站长
2022/07/11
9660
基于最简单的FFmpeg采样读取内存读写:存储转
opencv学习—VideoCapture 类基础知识「建议收藏」
以下是对两位大神的博客进行简单整理得到:http://blog.csdn.net/weicao1990/article/details/53379881
全栈程序员站长
2022/08/03
4.8K0
opencv学习—VideoCapture 类基础知识「建议收藏」
最简单的FFmpeg YUV420P图像拼接实例
在项目中需要将解码出来的l两个YUV420P格式的图像合并在一起,然后重新编码为H264,最后封装为mp4文件。主要说明一下两个YUV420P使用FFmpeg合并的过程,需要提前理解YUV420P格式图像的存储结构,然后依次将Y、U、V数据分别写进去就可以了。 举例:将两张相同大小的图片合并为一张大图片 640*320 640*320 合并为1280*320 假设YUV420P的宽度为FRAMEWITH 高度为FRAMEHEIGTH, Y存储在 FRAMEWITH*2/3 U存储在 FRAMEWITH*2/3—FRAMEWITH*5/6 V存储在 FRAMEWITH*5/6—FRAMEWITH 本实例主要将FFmpeg解码出来的YUV420P数据进行合并,然后写为一个YUV文件。
望天
2019/05/26
3K0
推荐阅读
相关推荐
音视频知识体系(基础篇4)----FLV格式解析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验