程序流程:
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