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

Python+OpenCV人臉檢測(cè)原理及示例詳解

 更新時(shí)間:2020年10月19日 10:54:49   作者:abruzzi  
這篇文章主要為大家詳細(xì)介紹了Python+OpenCV人臉檢測(cè)原理及示例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

關(guān)于opencv

OpenCV 是 Intel 開源計(jì)算機(jī)視覺(jué)庫(kù) (Computer Version) 。它由一系列 C 函數(shù)和少量 C++ 類構(gòu)成,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺(jué)方面的很多通用算法。

OpenCV 擁有包括 300 多個(gè) C 函數(shù)的跨平臺(tái)的中、高層 API 。它不依賴于其它的外部庫(kù) —— 盡管也可以使用某些外部庫(kù)。 OpenCV 對(duì)非商業(yè)應(yīng)用和商業(yè)應(yīng)用都是免費(fèi) 的。同時(shí) OpenCV 提供了對(duì)硬件的訪問(wèn),可以直接訪問(wèn)攝像頭,并且 opencv 還提供了一個(gè)簡(jiǎn)單的 GUI(graphics user interface) 系統(tǒng) :highgui 。 我們就通過(guò) OpenCV 提供的一些方法來(lái)構(gòu)造出這個(gè)人臉檢測(cè)(face detection) 程序來(lái)。

opencv的python包裝 

OpenCV 本身是有 C/C++ 編寫的,如果要在其他語(yǔ)言中使用,我們可以通過(guò)對(duì)其動(dòng)態(tài)鏈接庫(kù)文件進(jìn)行包裝即可,幸運(yùn)的是, Python 下有很多個(gè)這樣的包裝,本文中使用的是 Cvtypes 。

事實(shí)上,在 Python 中很多的包都是來(lái)自第三方的,比如 PIL(Python Image Library) 即為 C 語(yǔ)言實(shí)現(xiàn)的一個(gè)圖形處理包,被包裝到了 Python 中,這些包裝可以讓你像使用 Python 的內(nèi)建函數(shù)一樣的使用這些 API 。

人臉檢測(cè)原理

人臉檢測(cè)屬于目標(biāo)檢測(cè)(object detection) 的一部分,主要涉及兩個(gè)方面

1.先對(duì)要檢測(cè)的目標(biāo)對(duì)象進(jìn)行概率統(tǒng)計(jì),從而知道待檢測(cè)對(duì)象的一些特征,建立起目標(biāo)檢測(cè)模型。
2.用得到的模型來(lái)匹配輸入的圖像,如果有匹配則輸出匹配的區(qū)域,否則什么也不做。 

計(jì)算機(jī)視覺(jué)

計(jì)算機(jī)的視覺(jué)系統(tǒng),跟人的眼睛是大不相同的,但是其中也有類似之處。人眼之能夠看到物體,是通過(guò)物體上反射出來(lái)的光線刺激人眼的感光細(xì)胞,然后視覺(jué)神經(jīng)在大腦中形成物體的像。計(jì)算機(jī)通過(guò)攝像頭看到的東西要簡(jiǎn)單的多,簡(jiǎn)單來(lái)說(shuō),就是一堆由數(shù)字組成的矩陣。這些數(shù)字表明了物體發(fā)出的光的強(qiáng)弱,攝像頭的光敏元件將光信號(hào)轉(zhuǎn)化成數(shù)字信號(hào),將其量化為矩陣。

如何從這些數(shù)字中得出:"這是一個(gè)人臉"的結(jié)論,是一個(gè)比較復(fù)雜的事情。物理世界是彩色的,一般來(lái)說(shuō),計(jì)算機(jī)中的彩色圖片都是由若干個(gè)色彩通道累積出來(lái)的,比如RGB模式的圖片,有紅色通道(Red),綠色通道(Green)和藍(lán)色通道(Blue),這三個(gè)通道都是灰度圖,比如一個(gè)點(diǎn)由8位來(lái)表示,則一個(gè)通道可以表示2^8=256個(gè)灰度。那樣三個(gè)通道進(jìn)行疊加以后可以表3*8=24位種色彩,也就是我們常說(shuō)的24位真彩。

對(duì)這樣的圖片做處理,無(wú)疑是一件很復(fù)雜的事,所以有必要先將彩色圖轉(zhuǎn)為灰度圖,那樣可以減少數(shù)據(jù)量(比如RGB模式,可以減少到原圖片的1/3),同時(shí)可以去掉一些噪聲信號(hào)。先將圖片轉(zhuǎn)化為灰度圖,然后將這個(gè)灰度圖的對(duì)比度增高,這樣可以使得圖片本來(lái)暗的地方更暗,亮的地方更亮一些。這樣處理以后,圖片就更容易被算法設(shè)別出來(lái)了。

Harr特征級(jí)聯(lián)表

OpenCV在物體檢測(cè)上使用的是haar特征的級(jí)聯(lián)表,這個(gè)級(jí)聯(lián)表中包含的是boost的分類器。首先,人們采用樣本的haar特征進(jìn)行分類器的訓(xùn)練,從而得到一個(gè)級(jí)聯(lián)的boost分類器。訓(xùn)練的方式包含兩方面:

1. 正例樣本,即待檢測(cè)目標(biāo)樣本
2. 反例樣本,其他任意的圖片

首先將這些圖片統(tǒng)一成相同的尺寸,這個(gè)過(guò)程被稱為歸一化,然后進(jìn)行統(tǒng)計(jì)。一旦分類器建立完成,就可以用來(lái)檢測(cè)輸入圖片中的感興趣區(qū)域的檢測(cè)了,一般來(lái)說(shuō),輸入的圖片會(huì)大于樣本,那樣,需要移動(dòng)搜索窗口,為了檢索出不同大小的目標(biāo),分類器可以按比例的改變自己的尺寸,這樣可能要對(duì)輸入圖片進(jìn)行多次的掃描。

什么是級(jí)聯(lián)的分類器呢?級(jí)聯(lián)分類器是由若干個(gè)簡(jiǎn)單分類器級(jí)聯(lián)成的一個(gè)大的分類器,被檢測(cè)的窗口依次通過(guò)每一個(gè)分類器,可以通過(guò)所有分類器的窗口即可判定為目標(biāo)區(qū)域。同時(shí),為了考慮效率問(wèn)題,可以將最嚴(yán)格的分類器放在整個(gè)級(jí)聯(lián)分類器的最頂端,那樣可以減少匹配次數(shù)。

基礎(chǔ)分類器以haar特征為輸入,以0/1為輸出,0表示未匹配,1表示匹配。

Haar特征

 

 邊界特征,包含四種
 線性特征,包含8種
 中心圍繞特征,包含兩種

在掃描待檢測(cè)圖片的時(shí)候,以邊界特征中的(a)為例,正如前面提到的那樣,計(jì)算機(jī)中的圖片是一個(gè)數(shù)字組成的矩陣,程序先計(jì)算整個(gè)窗口中的灰度值x,然后計(jì)算矩形框中的黑色灰度值y,然后計(jì)算(x-2y)的值,得到的數(shù)值與x做比較,如果這個(gè)比值在某一個(gè)范圍內(nèi),則表示待檢測(cè)圖片的當(dāng)前掃描區(qū)域符合邊界特征(a),然后繼續(xù)掃描。

關(guān)于這個(gè)算法的更詳細(xì)描述已經(jīng)超出了本文的范圍,可以在參考資源中獲得更多的信息。

非固定大小目標(biāo)檢測(cè)

因?yàn)槭腔谝曨l流的目標(biāo)檢測(cè),我們事先不太可能知道要檢測(cè)的目標(biāo)的大小,這就要求我們的級(jí)聯(lián)表中的分類器具有按比例增大(或者縮小)的能力,這樣,當(dāng)小的窗口移動(dòng)完整個(gè)待檢測(cè)圖片沒(méi)有發(fā)現(xiàn)目標(biāo)時(shí),我們可以調(diào)整分類器的大小,然后繼續(xù)檢測(cè),直到檢測(cè)到目標(biāo)或者窗口與待檢測(cè)圖片的大小相當(dāng)為止。

步驟一:圖片預(yù)處理

在從攝像頭中獲得一個(gè)幀(一張圖片)后,我們需要先對(duì)這張圖片進(jìn)行一些預(yù)處理:
1.將圖片從RGB模式轉(zhuǎn)為灰度圖將灰度圖
2.進(jìn)行灰度圖直方圖均衡化操作

這兩個(gè)步驟在OpenCV中是非常簡(jiǎn)單的:

image_size = cv.cvGetSize(image)#獲取原始圖像尺寸 
 
grayscale = cv.cvCreateImage(image_size, 8, 1)# 建立一個(gè)空的灰度圖 
cv.cvCvtColor(image, grayscale, cv.CV_BGR2GRAY)#轉(zhuǎn)換 
 
storage = cv.cvCreateMemStorage(0)#新建一塊存儲(chǔ)區(qū),以備后用 
cv.cvClearMemStorage(storage) 
 
cv.cvEqualizeHist(grayscale, grayscale)# 灰度圖直方圖均衡化 

步驟二:檢測(cè)并標(biāo)記目標(biāo)

OpenCV中,對(duì)于人臉檢測(cè)的模型已經(jīng)建立為一個(gè)XML文件,其中包含了上面提到的harr特征的分類器的訓(xùn)練結(jié)果,我們可以通過(guò)加載這個(gè)文件而省略掉自己建立級(jí)聯(lián)表的過(guò)程。有了級(jí)聯(lián)表,我們只需要將待檢測(cè)圖片和級(jí)聯(lián)表一同傳遞給OpenCV的目標(biāo)檢測(cè)算法即可得到一個(gè)檢測(cè)到的人臉的集合。

# detect objects 
cascade = cv.cvLoadHaarClassifierCascade('haarcascade_frontalface_alt.xml', 
      cv.cvSize(1,1)) 
faces = cv.cvHaarDetectObjects(grayscale, cascade, storage, 1.2, 2, 
    cv.CV_HAAR_DO_CANNY_PRUNING, 
    cv.cvSize(50, 50))#設(shè)置最小的人臉為50*50像素 
 
if faces: 
 print 'face detected here', cv.cvGetSize(grayscale) 
 for i in faces: 
 cv.cvRectangle(image, cv.cvPoint( int(i.x), int(i.y)), 
   cv.cvPoint(int(i.x + i.width), int(i.y + i.height)), 
   cv.CV_RGB(0, 255, 0), 1, 8, 0)#畫一個(gè)綠色的矩形框 

步驟三:用highgui畫出視頻窗口

highgui.cvNamedWindow ('camera', highgui.CV_WINDOW_AUTOSIZE) 
highgui.cvMoveWindow ('camera', 50, 50) 
 
highgui.cvShowImage('camera', detimg) 

可以看到,OpenCV的API相當(dāng)清晰,使用Python的包裝,可以使得代碼非常小。好了,我們可以看看程序的運(yùn)行結(jié)果: 

由于視頻流是動(dòng)態(tài)的,所以我們可以在程序的入口中使用一個(gè)無(wú)限循環(huán),在循環(huán)中,每次從視頻中讀入一個(gè)幀,將這個(gè)幀傳輸給人臉檢測(cè)模塊,檢測(cè)模塊在這個(gè)幀上進(jìn)行標(biāo)記(如果有人臉的話),然后返回這個(gè)幀,主程序拿到這個(gè)幀后,更新顯示窗口。

opencv的其他特性

拉普拉斯邊緣檢測(cè)

def laplaceTransform(image): 
 laplace = None 
 colorlaplace = None 
 planes = [None, None, None] 
 
 image_size = cv.cvGetSize(image) 
 if not laplace: 
 for i in range(len(planes)): 
  planes[i] = cv.cvCreateImage(image_size, 8, 1) 
 laplace = cv.cvCreateImage(image_size, cv.IPL_DEPTH_16S, 1) 
 colorlaplace = cv.cvCreateImage(image_size, 8, 3) 
 
 cv.cvSplit(image, planes[0], planes[1], planes[2], None) 
 
 for plane in planes: 
 cv.cvLaplace(plane, laplace, 3) 
 cv.cvConvertScaleAbs(laplace, plane, 1, 0) 
 
 cv.cvMerge(planes[0], planes[1], planes[2], None, colorlaplace) 
 colorlaplace.origin = image.origin 
 
 return colorlaplace 

效果圖:

CVtypes中自帶了一個(gè)關(guān)于圖像色彩空間的直方圖的例子:

結(jié)束語(yǔ)

OpenCV的功能十分強(qiáng)大,而且提供了大量的算法實(shí)現(xiàn),文中涉及到的內(nèi)容只是計(jì)算機(jī)視覺(jué)中很小的一部分。讀者可以考慮將采集到的人臉進(jìn)行標(biāo)識(shí),從而實(shí)現(xiàn)特定人的人臉識(shí)別?;蛘呖紤]將人臉檢測(cè)移植到網(wǎng)絡(luò)上,從而實(shí)現(xiàn)遠(yuǎn)程監(jiān)控。試想一下,原來(lái)沒(méi)有生命的機(jī)器,我們可以通過(guò)自己的思想,動(dòng)作來(lái)使得它們看起來(lái)像是有思想一樣,這件事本身就非常的有趣。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python使用gensim計(jì)算文檔相似性

    Python使用gensim計(jì)算文檔相似性

    在文本處理中,比如商品評(píng)論挖掘,有時(shí)需要了解每個(gè)評(píng)論分別和商品的描述之間的相似度,以此衡量評(píng)論的客觀性。那么python 里面有計(jì)算文本相似度的程序包嗎,恭喜你,不僅有,而且很好很強(qiáng)大。下面我們就來(lái)體驗(yàn)下gensim的強(qiáng)大
    2016-04-04
  • Python實(shí)現(xiàn)批量下載ts文件并合并為mp4

    Python實(shí)現(xiàn)批量下載ts文件并合并為mp4

    這篇文章主要為大家詳細(xì)介紹了如何通過(guò)Python語(yǔ)言實(shí)現(xiàn)批量下載ts文件并合并為mp4視頻的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-06-06
  • python實(shí)現(xiàn)隨機(jī)梯度下降法

    python實(shí)現(xiàn)隨機(jī)梯度下降法

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)隨機(jī)梯度下降法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • python實(shí)現(xiàn)mysql的讀寫分離及負(fù)載均衡

    python實(shí)現(xiàn)mysql的讀寫分離及負(fù)載均衡

    這篇文章主要介紹了python實(shí)現(xiàn)mysql的讀寫分離及負(fù)載均衡 ,需要的朋友可以參考下
    2018-02-02
  • 淺談tensorflow之內(nèi)存暴漲問(wèn)題

    淺談tensorflow之內(nèi)存暴漲問(wèn)題

    今天小編就為大家分享一篇淺談tensorflow之內(nèi)存暴漲問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • Python?列表中的刪除操作之del、remove?和?pop?的區(qū)別

    Python?列表中的刪除操作之del、remove?和?pop?的區(qū)別

    在Python中,列表(list)是一種非常靈活的數(shù)據(jù)結(jié)構(gòu),它允許我們存儲(chǔ)一系列的元素,在刪除元素時(shí),我們可以使用三種不同的方法:del、remove?和?pop,每種方法都有其特定的用途和行為,了解它們的區(qū)別可以幫助我們更有效地使用列表,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • python3.x如何向mysql存儲(chǔ)圖片并顯示

    python3.x如何向mysql存儲(chǔ)圖片并顯示

    這篇文章主要介紹了python3.x如何向mysql存儲(chǔ)圖片并顯示問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • python框架中flask知識(shí)點(diǎn)總結(jié)

    python框架中flask知識(shí)點(diǎn)總結(jié)

    這篇文章給大家分享了關(guān)于學(xué)習(xí)python框架中flask知識(shí)點(diǎn)的總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2018-08-08
  • python如何求取指定范圍內(nèi)的質(zhì)數(shù)

    python如何求取指定范圍內(nèi)的質(zhì)數(shù)

    這篇文章主要介紹了python如何求取指定范圍內(nèi)的質(zhì)數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • python 使用poster模塊進(jìn)行http方式的文件傳輸?shù)椒?wù)器的方法

    python 使用poster模塊進(jìn)行http方式的文件傳輸?shù)椒?wù)器的方法

    今天小編就為大家分享一篇python 使用poster模塊進(jìn)行http方式的文件傳輸?shù)椒?wù)器的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01

最新評(píng)論

凤台县| 柞水县| 景泰县| 林口县| 临泉县| 石狮市| 平和县| 平遥县| 和田县| 景泰县| 永兴县| 沁阳市| 乐陵市| 淮安市| 海伦市| 汽车| 南康市| 金坛市| 英吉沙县| 瓦房店市| 米脂县| 兰州市| 宝丰县| 乌拉特中旗| 葫芦岛市| 循化| 宜君县| 柳州市| 宁海县| 南投市| 万盛区| 左权县| 丹巴县| 阿巴嘎旗| 泾阳县| 平谷区| 贵定县| 霍林郭勒市| 米泉市| 望奎县| 贵溪市|