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



轉載于:https://www.cnblogs.com/wuyida/p/6301278.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373305.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373305.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373305.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux驅動開發常用頭文件

頭文件目錄中總共有32個.h頭文件。其中主目錄下有13個&#xff0c;asm子目錄中有4個&#xff0c;linux子目錄中有10個&#xff0c;sys子目錄中有5個。這些頭文件各自的功能如下&#xff1a; 1、主目錄 <a.out.h>&#xff1a;a.out頭文件&#xff0c;定義了a.out執行文件格…

Spring線程池服務

線程池對于執行同步和異步過程非常重要。 本文介紹如何使用Spring開發和監視線程池服務。 創建線程池已通過兩種替代方法進行了說明。 二手技術 &#xff1a; JDK 1.6.0_21 Spring3.0.5 Maven的3.0.2 步驟1&#xff1a;建立已完成的專案 創建一個Maven項目&#xff0c;如下…

我的世界java村民繁殖_我的世界:Java19w08a更新,村民加強守衛,小狐貍背叛

雖然這句話很繞口&#xff0c;其實意思很簡單&#xff0c;那就是之前的隱身藥水沒有什么用&#xff0c;該被打還是被打。因為這個可是害慘了流浪商人&#xff0c;不過這次好了&#xff0c;流浪商人在喝了隱身藥水之后就能安全度過晚上了。NO.3 皮革馬鎧馬鎧是屬于馬的盔甲&…

歐萊雅眉筆banner個人設計

眉筆名稱&#xff1a;眉筆大師三頭塑形眉筆 &#xff0c;之所以沒用吧這個商品名稱放大&#xff0c;是我覺得它是一個名稱&#xff0c;而我把自己想的廣告詞“出彩只需一筆” 放大不僅能凸顯出這只筆的強大&#xff0c;還表示了一種有了我這支眉筆你會更出彩更漂亮&#xff0c…

使用帶有注釋和JQuery的Spring MVC 3的Ajax

與Ajax一起工作對我來說一直很有趣&#xff01; 是不是 &#xff1f; 我將使您輕松將Ajax與Spring MVC 3和JQuery結合使用。 這篇文章將向您說明如何在工業編碼的現實生活中使用Ajax。 和往常一樣&#xff0c;我們將在Spring MVC 3框架中以Ajax的實際示例為例&#xff0c;并將其…

ThinkPHP 3 的輸出

一、ThinkPHP 3 的輸出 &#xff08;重點&#xff09;a、通過 echo 等PHP原生的輸出方式在頁面中輸出b、通過display方法輸出想分配變量可以使用assign方法c、修改左右定界符休要修改配置文件中的配置項TMPL_L_DELIM><{, //修改左定界符TMPL_R_DELIM>}>, //修…

java百度云文件上傳_關于如何在自己項目集成百度云BCE文件上傳STS方案

1、 項目背景由于本人項目需要&#xff0c;需要在視頻點播服務之中需要加載字幕文件(通用格式srt)&#xff0c;經過比較好幾家的公有云服務&#xff0c;最后選擇只有百度云提供字幕服務。字幕&#xff1a;我們通常在觀看外語電影的是&#xff0c;沒有國語版時候只能通過下載字幕…

Java 7 – NIO文件革命

Java 7&#xff08;“項目代幣”&#xff09;已于去年7月問世。 此版本中的新增功能很有用&#xff0c;例如&#xff0c;嘗試使用資源–從try塊自動處理可關閉的資源&#xff0c;switch語句中的字符串&#xff0c;用于異常的multicatch以及用于使用泛型的<>運算符。 每個…

hdu 3507 Print Article(斜率優化DP)

題目鏈接&#xff1a;hdu 3507 Print Article 題意&#xff1a; 每個字有一個值&#xff0c;現在讓你分成k段打印&#xff0c;每段打印需要消耗的值用那個公式計算&#xff0c;現在讓你求最小值 題解&#xff1a; 設dp[i]表示前i個字符需要消耗的最小值&#xff0c;那么有dp[i]…

第三章 consul服務注冊與服務查詢

1、定義一個服務 https://www.consul.io/docs/agent/services.html 該方法是服務注冊中提供服務的最常用的方法。 關于服務的定義&#xff1a;服務的屬性我們會在后邊每出現一個總結一個&#xff0c;最后再做總結。 2、服務注冊 2.1、創建服務文件所存放的文件夾 說明&#xff…

coreos 安裝mysql_CoreOS 在 PC 上快速安裝方法指南

意義能夠以最快的速度安裝部署Linux操作系統。安裝快速簡單&#xff0c;幾乎不花時間就可以開始運行Docker。運行速度非常快。使用內存硬盤。我的情況win8 筆記本偶爾玩游戲&#xff0c;但是裝Linux雙系統可能需要我一天的時間來完成。我的所有業務都只需要在Docker中跑就可以了…

使用ycsb測試cassandra

參考 https://github.com/cloudius-systems/osv/wiki/Benchmarking-Cassandra-and-other-NoSQL-databases-with-YCSB https://github.com/brianfrankcooper/YCSB/tree/master/cassandra 創建 表頭 https://gist.github.com/pbailis/3978273  設置field參數 長度和個數 啟動和…

Session 的配置和特性

session的配置 對于session的配置是php.ini中配置 session數據都是保存在文本文件中 設置session文件的保存位置 說明&#xff1a; 默認是保存在windows/temp目錄 設置session保存作為客戶端標識的數據使用cookie 設置session保存客戶端標識的數據&#xff0c;只使用cookie 說明…

OAuth與Spring Security

摘自Wikipedia&#xff1a; OAuth &#xff08; 開放式身份驗證 &#xff09;是一種開放式身份驗證標準。 它允許用戶與其他站點共享存儲在一個站點上的私有資源&#xff08;例如照片&#xff0c;視頻&#xff0c;聯系人列表&#xff09;&#xff0c;而不必發出其憑據&#xff…

flex java 開發環境搭建_Flex+JAVA+BlazeDS開發環境配置(Java工程和Flex工程獨立)

FlexJAVABlazeDS開發環境配置(Java工程和Flex工程獨立)2019年12月07日閱讀數&#xff1a;7這篇文章主要向大家介紹FlexJAVABlazeDS開發環境配置(Java工程和Flex工程獨立),主要內容包括基礎應用、實用技巧、原理機制等方面&#xff0c;希望對大家有所幫助。[url]http://blog.csd…

1251 括號(遞歸小練)

1251 括號 時間限制: 1 s空間限制: 128000 KB題目等級 : 黃金 Gold題目描述 Description計算乘法時&#xff0c;我們可以添加括號&#xff0c;來改變相乘的順序&#xff0c;比如計算              X1, X2, X3, X4, …, XN的積&#xff0c;可以 (X1(X2(X3(X4(...(XN-1…

zabbix_agentd.conf配置文件詳解

Aliaskey的別名&#xff0c;例如 Aliasttlsa.userid:vfs.file.regexp[/etc/passwd,^ttlsa:.:([0-9]),,,,\1]&#xff0c; 或者ttlsa的用戶ID。你可以使用key&#xff1a;vfs.file.regexp[/etc/passwd,^ttlsa:.: ([0-9]),,,,\1]&#xff0c;也可以使用ttlsa.userid。備注: 別名不…

在運行時修補Java

本文將重點介紹如何解決與第三方庫相關的問題 不能被規避 難以排除/繞過/替換 只需不提供錯誤修正 在這種情況下&#xff0c;解決問題仍然是一項艱巨的任務。 作為這種情況的誘因&#xff0c;請考慮對“哈希索引”數據結構的攻擊&#xff0c;例如java.util.Hashtable和java…

php return直接輸出,PHP中return用法詳細解讀

原標題&#xff1a;PHP中return用法詳細解讀在大部分編程語言中&#xff0c;return關鍵字可以將函數的執行結果返回&#xff0c;PHP中return的用法也大同小異&#xff0c;對初學者來說&#xff0c;掌握PHP中return的用法也是學習PHP的一個開始。首先&#xff0c;它的意思就是返…

并行執行,沒用到過,寫到這里免得搞忘

/// <summary>/// /// </summary>class Program{static void Main(string[] args){simultaneous();Console.ReadKey();}static void simultaneous(){//盡可能并行執行提供的每個操作Parallel.Invoke(() > ComplexMethod("1"),() > ComplexMethod(&…