最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

OpenCV實(shí)現(xiàn)人臉識(shí)別

 更新時(shí)間:2017年04月07日 10:38:18   作者:ht-beyond  
本文主要介紹了python使用opencv實(shí)現(xiàn)人臉識(shí)別的相關(guān)資料。具有很好的參考價(jià)值。下面跟著小編一起來看下吧

主要有以下步驟:

1、人臉檢測

2、人臉預(yù)處理

3、從收集的人臉訓(xùn)練機(jī)器學(xué)習(xí)算法

4、人臉識(shí)別

5、收尾工作

人臉檢測算法:

基于Haar的臉部檢測器的基本思想是,對(duì)于面部正面大部分區(qū)域而言,會(huì)有眼睛所在區(qū)域應(yīng)該比前額和臉頰更暗,嘴巴應(yīng)該比臉頰更暗等情形。它通常執(zhí)行大約20個(gè)這樣的比較來決定所檢測的對(duì)象是否為人臉,實(shí)際上經(jīng)常會(huì)做上千次。

基于LBP的人臉檢測器基本思想與基于Haar的人臉檢測器類似,但它比較的是像素亮度直方圖,例如,邊緣、角落和平坦區(qū)域的直方圖。

這兩種人臉檢測器可通過訓(xùn)練大的圖像集找到人臉,這些圖像集在opencv中存在XML文件中以便后續(xù)使用。

這些級(jí)聯(lián)分類檢測器通常至少需使用1000個(gè)獨(dú)特的人臉圖像和10000個(gè)非人臉圖像作為訓(xùn)練,訓(xùn)練時(shí)間一般LBP要幾個(gè)小時(shí),

Haar要一個(gè)星期。

項(xiàng)目中的關(guān)鍵代碼如下:

initDetectors
faceCascade.load(faceCascadeFilename);
eyeCascade1.load(eyeCascadeFilename1);
eyeCascade2.load(eyeCascadeFilename2);

initWebcam
videoCapture.open(cameraNumber);

cvtColor(img, gray, CV_BGR2GRAY);
//有需要?jiǎng)t縮小圖片使檢測運(yùn)行更快,之后要恢復(fù)原來大小
resize(gray, inputImg, Size(scaledWidth, scaledHeight));
equalizeHist(inputImg, equalizedImg);
cascade.detectMultiScale(equalizedImg......);

人臉預(yù)處理:

實(shí)際中通常訓(xùn)練(采集圖像)和測試(來自攝像機(jī)圖像)的圖像會(huì)有很大不同,受(如光照、人臉方位、表情等),

結(jié)果會(huì)很差,因此用于訓(xùn)練的數(shù)據(jù)集很重要。

人臉預(yù)處理目的是減少這類問題,有助于提高整個(gè)人臉識(shí)別系統(tǒng)的可靠性。

人臉預(yù)處理的最簡單形式就是使用equalizeHist()函數(shù)做直方圖均衡,這與人臉檢測那步一樣。

實(shí)際中,為了讓檢測算法更可靠,會(huì)使用面部特征檢測(如,檢測眼睛、鼻子、嘴巴和眉毛),本項(xiàng)目只使用眼睛檢測。

使用OpenCV自帶的訓(xùn)練好的眼部探測器。如,正面人臉檢測完畢后,得到一個(gè)人臉,在使用眼睛檢測器提取人臉的左眼區(qū)域和右眼區(qū)域,并對(duì)每個(gè)眼部區(qū)域進(jìn)行直方圖均衡。

這步涉及的操作有以下內(nèi)容:

1、幾何變換和裁剪

人臉對(duì)齊很重要,旋轉(zhuǎn)人臉使眼睛保持水平,縮放人臉使眼睛之間距離始終相同,平移人臉使眼睛總是在所需高度上水平居中,

裁剪人臉外圍(如圖像背景、頭發(fā)、額頭、耳朵和下巴)。

2、對(duì)人臉左側(cè)和右側(cè)分別用直方圖均衡

3、平滑

用雙邊濾波器來減少圖像噪聲

4、橢圓掩碼

將剩余頭發(fā)和人臉圖像背景去掉

項(xiàng)目中的關(guān)鍵代碼如下:

detectBothEyes(const Mat &face, CascadeClassifier &eyeCascade1, CascadeClassifier &eyeCascade2,
Point &leftEye, Point &rightEye, Rect *searchedLeftEye, Rect *searchedRightEye);
topLeftOfFace = face(Rect(leftX, topY, widthX, heightY));
//在左臉區(qū)域內(nèi)檢測左眼
detectLargestObject(topLeftOfFace, eyeCascade1, leftEyeRect, topLeftOfFace.cols);
//右眼類似,這樣眼睛中心點(diǎn)就得到了
leftEye = Point(leftEyeRect.x + leftEyeRect.width/2, leftEyeRect.y + leftEyeRect.height/2);
//再得到兩眼的中點(diǎn),然后計(jì)算兩眼之間的角度
Point2f eyesCenter = Point2f( (leftEye.x + rightEye.x) * 0.5f, (leftEye.y + rightEye.y) * 0.5f );
//仿射扭曲(Affine Warping)需要一個(gè)仿射矩陣
rot_mat = getRotationMatrix2D(eyesCenter, angle, scale);
//現(xiàn)在可變換人臉來得到檢測到的雙眼出現(xiàn)在人臉的所需位置
warpAffine(gray, warped, rot_mat, warped.size());

//先對(duì)人臉左側(cè)和右側(cè)分開進(jìn)行直方圖均衡
equalizeHist(leftSide, leftSide);
equalizeHist(rightSide, rightSide);
//再合并,這里合并時(shí)左側(cè)1/4和右側(cè)1/4直接取像素值,中間的2/4區(qū)域像素值通過一定計(jì)算進(jìn)行處理。

//雙邊濾波
bilateralFilter(warped, filtered, 0, 20.0, 2.0);

//采用橢圓掩碼來刪除一些區(qū)域
filtered.copyTo(dstImg, mask);

收集并訓(xùn)練人臉:

一個(gè)好的數(shù)據(jù)集應(yīng)包含人臉變換的各種情形,這些變化可能出現(xiàn)在訓(xùn)練集中。如只測試正面人臉,則只需訓(xùn)練圖像有完全正面人臉即可。

因此一個(gè)好的訓(xùn)練集應(yīng)包含很多實(shí)際情形。

本項(xiàng)目收集的圖像之間至少有一秒的間隔,使用基于L2范數(shù)的相對(duì)錯(cuò)誤評(píng)價(jià)標(biāo)準(zhǔn)來比較兩幅圖像素之間的相似性。

errorL2 = norm(A, B, CV_L2);
similarity = errorL2 / (double)(A.rows * A.cols);

再與收集新人臉的閾值相比來決定是否收集這次圖像。

可用很多技巧來獲取更多的訓(xùn)練數(shù)據(jù),如,使用鏡像人臉、加入隨機(jī)噪聲、改變?nèi)四槇D像的一些像素、旋轉(zhuǎn)等。

//翻轉(zhuǎn)
flip(preprocessedFace, mirroredFace, 1);

對(duì)每個(gè)人收集到足夠多的人臉圖像后,接下來必須選擇適合人臉識(shí)別的機(jī)器學(xué)習(xí)算法,通過它來學(xué)習(xí)收集的數(shù)據(jù),從而訓(xùn)練出一個(gè)人臉識(shí)別系統(tǒng)。

人臉識(shí)別算法:

1、特征臉,也稱PCA(主成分分析)

2、Fisher臉,也稱LDA(線性判別分析)

3、局部二值模式直方圖(Local Binary Pattern Histograms,LBPH)

其他人臉識(shí)別算法:www.face-rec.org/algorithms/

OpenCV提供了CV::Algorithm類,該類有幾種不同的算法,用其中一種算法就可以完成簡單而通用的人臉識(shí)別。

OpenCV的contrib模板中有一個(gè)FaceRecognizer類,它實(shí)現(xiàn)以上這些人臉識(shí)別算法。

initModule_contrib();
model = Algorithm::create<FaceRecognizer>(facerecAlgorithm);

model->train(preprocessedFaces, faceLabels);

這一代碼將執(zhí)行所選人臉識(shí)別的整個(gè)訓(xùn)練算法。

人臉識(shí)別:

1、人臉識(shí)別:通過人臉來識(shí)別這個(gè)人

可以簡單調(diào)用FaceRecognizer::predict()函數(shù)來識(shí)別照片中的人,

int identity = model->predict(preprocessedFace);

它帶來的問題是它總能預(yù)測給定的人(即使輸入圖像不屬于訓(xùn)練集中的人)。

解決此問題的辦法是制定置信度標(biāo)準(zhǔn),置信度過低則可判讀是一個(gè)不認(rèn)識(shí)的人。

2、人臉驗(yàn)證:驗(yàn)證圖像中是否有想找的人

為了驗(yàn)證是否可靠,或者說系統(tǒng)是否能對(duì)一個(gè)不認(rèn)識(shí)的人進(jìn)行正確識(shí)別,這需要進(jìn)行人臉驗(yàn)證。

這里計(jì)算置信度的方法是:

使用特征向量和特征值重構(gòu)人臉圖,然后將輸入的圖像與重構(gòu)圖進(jìn)行比較。如果一個(gè)人在訓(xùn)練集中有多張人臉圖,用特征向量和特征

值重構(gòu)后應(yīng)該有非常好的效果,如果沒有則差別很大,表明它可能是一個(gè)未知的人臉。

subspaceProject()函數(shù)將人臉圖像映射到特征空間,再用subspaceReconstruct()函數(shù)從特征空間重構(gòu)圖像。

收尾:交互式GUI

利用OpenCV函數(shù)很容易繪制一些組件,鼠標(biāo)點(diǎn)擊等。

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • Python多線程同步Lock、RLock、Semaphore、Event實(shí)例

    Python多線程同步Lock、RLock、Semaphore、Event實(shí)例

    這篇文章主要介紹了Python多線程同步Lock、RLock、Semaphore、Event實(shí)例,Lock & RLock 用來確保多線程多共享資源的訪問,Semaphore用來確保一定資源多線程訪問時(shí)的上限,Event是最簡單的線程間通信的方式,需要的朋友可以參考下
    2014-11-11
  • python導(dǎo)入SciPy的io模塊使用

    python導(dǎo)入SciPy的io模塊使用

    SciPy是一個(gè)強(qiáng)大的科學(xué)計(jì)算庫,本文就就來介紹了python導(dǎo)入SciPy的io模塊使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-07-07
  • Python爬蟲實(shí)戰(zhàn):分析《戰(zhàn)狼2》豆瓣影評(píng)

    Python爬蟲實(shí)戰(zhàn):分析《戰(zhàn)狼2》豆瓣影評(píng)

    這篇文章主要介紹了Python爬蟲實(shí)戰(zhàn):《戰(zhàn)狼2》豆瓣影評(píng)分析,小編在這里使用的是python版本3.5,需要的朋友可以參考下
    2018-03-03
  • Python報(bào)錯(cuò)TypeError: unsupported operand的問題分析和解決方法

    Python報(bào)錯(cuò)TypeError: unsupported operand的問題分析和解決方法

    TypeError: unsupported operand 是Python中常見的一類錯(cuò)誤,通常在嘗試對(duì)不兼容的數(shù)據(jù)類型進(jìn)行操作時(shí)發(fā)生,比如,當(dāng)你嘗試對(duì)字符串和整數(shù)進(jìn)行加法操作時(shí),Python會(huì)拋出這一錯(cuò)誤,所以本文給大家介紹了Python報(bào)錯(cuò)TypeError: unsupported operand的問題解決
    2024-09-09
  • Python訪問類運(yùn)算符的使用小結(jié)

    Python訪問類運(yùn)算符的使用小結(jié)

    本文主要介紹了Python訪問類運(yùn)算符的使用小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-01-01
  • Python求離散序列導(dǎo)數(shù)的示例

    Python求離散序列導(dǎo)數(shù)的示例

    今天小編就為大家分享一篇Python求離散序列導(dǎo)數(shù)的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • PyTorch的nn.Module類的定義和使用介紹

    PyTorch的nn.Module類的定義和使用介紹

    在PyTorch中,nn.Module類是構(gòu)建神經(jīng)網(wǎng)絡(luò)模型的基礎(chǔ)類,所有自定義的層、模塊或整個(gè)神經(jīng)網(wǎng)絡(luò)架構(gòu)都需要繼承自這個(gè)類,本文介紹PyTorch的nn.Module類的定義和使用介紹,感興趣的朋友一起看看吧
    2024-01-01
  • 詳解Python設(shè)計(jì)模式編程中觀察者模式與策略模式的運(yùn)用

    詳解Python設(shè)計(jì)模式編程中觀察者模式與策略模式的運(yùn)用

    這篇文章主要介紹了Python設(shè)計(jì)模式編程中觀察者模式與策略模式的運(yùn)用,觀察者模式和策略模式都可以歸類為結(jié)構(gòu)型的設(shè)計(jì)模式,需要的朋友可以參考下
    2016-03-03
  • Python繪制燈籠的示例代碼

    Python繪制燈籠的示例代碼

    這篇文章主要為大家介紹了如何通過Python繪制一個(gè)燈籠,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下
    2022-02-02
  • Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)在字典中將鍵映射到多個(gè)值上的方法

    Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)在字典中將鍵映射到多個(gè)值上的方法

    這篇文章主要介紹了Python在字典中將鍵映射到多個(gè)值上的方法,涉及Python針對(duì)字典的相關(guān)映射與初始化相關(guān)操作技巧,需要的朋友可以參考下
    2018-02-02

最新評(píng)論

普格县| 长子县| 沙湾县| 忻州市| 巴彦淖尔市| 正阳县| 济源市| 城固县| 新巴尔虎右旗| 八宿县| 松江区| 民和| 灵璧县| 甘南县| 凤冈县| 瓦房店市| 比如县| 涡阳县| 桐柏县| 西青区| 通化市| 星子县| 荔波县| 敦化市| 南溪县| 兴仁县| 奈曼旗| 右玉县| 临颍县| 鲁山县| 云阳县| 吉隆县| 鲜城| 柏乡县| 满城县| 甘孜| 霍林郭勒市| 阜南县| 交口县| 延川县| 杂多县|