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




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM