欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python+OpenCV人臉檢測原理及示例詳解

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

關于opencv

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

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

opencv的python包裝 

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

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

人臉檢測原理

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

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

計算機視覺

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

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

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

Harr特征級聯(lián)表

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

1. 正例樣本,即待檢測目標樣本
2. 反例樣本,其他任意的圖片

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

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

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

Haar特征

 

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

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

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

非固定大小目標檢測

因為是基于視頻流的目標檢測,我們事先不太可能知道要檢測的目標的大小,這就要求我們的級聯(lián)表中的分類器具有按比例增大(或者縮小)的能力,這樣,當小的窗口移動完整個待檢測圖片沒有發(fā)現(xiàn)目標時,我們可以調整分類器的大小,然后繼續(xù)檢測,直到檢測到目標或者窗口與待檢測圖片的大小相當為止。

步驟一:圖片預處理

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

這兩個步驟在OpenCV中是非常簡單的:

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

步驟二:檢測并標記目標

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

# 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))#設置最小的人臉為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)#畫一個綠色的矩形框 

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

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

可以看到,OpenCV的API相當清晰,使用Python的包裝,可以使得代碼非常小。好了,我們可以看看程序的運行結果: 

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

opencv的其他特性

拉普拉斯邊緣檢測

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中自帶了一個關于圖像色彩空間的直方圖的例子:

結束語

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Python collections模塊的使用方法

    Python collections模塊的使用方法

    這篇文章主要介紹了Python collections模塊的使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • python實現(xiàn)對服務器腳本敏感信息的加密解密功能

    python實現(xiàn)對服務器腳本敏感信息的加密解密功能

    這篇文章主要介紹了python實現(xiàn)對服務器腳本敏感信息的加密解密功能,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • python 列表輸出重復值以及對應的角標方法

    python 列表輸出重復值以及對應的角標方法

    今天小編就為大家分享一篇python 列表輸出重復值以及對應的角標方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • python使用turtle庫寫六角形的思路與代碼

    python使用turtle庫寫六角形的思路與代碼

    學習Python,接觸到turtle包,就用它來畫一下六邊形,下面這篇文章主要給大家介紹了關于python使用turtle庫寫六角形的思路與代碼,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • Python 確定多項式擬合/回歸的階數(shù)實例

    Python 確定多項式擬合/回歸的階數(shù)實例

    今天小編就為大家分享一篇Python 確定多項式擬合/回歸的階數(shù)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python實現(xiàn)批量下載文件

    Python實現(xiàn)批量下載文件

    之前給大家分享的python 多線程抓取網(wǎng)頁,不過這個只能用python 來抓取到網(wǎng)頁的源代碼,如果你想用做python 下載文件的話,上面的可能就不適合你了,最近我在用python 做文件下載的時候就遇到這個問題了,不過最終得以解決,我把代碼發(fā)出來
    2015-05-05
  • python從ftp下載數(shù)據(jù)保存實例

    python從ftp下載數(shù)據(jù)保存實例

    這篇文章主要介紹了python從ftp下載數(shù)據(jù)到本地保存的實例代碼方法,大家參考使用吧
    2013-11-11
  • PySpark與GraphFrames的安裝與使用環(huán)境搭建過程

    PySpark與GraphFrames的安裝與使用環(huán)境搭建過程

    這篇文章主要介紹了PySpark與GraphFrames的安裝與使用教程,本文通過圖文并茂實例代碼相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • python Tkinter是什么

    python Tkinter是什么

    大家好,本篇文章主要講的是 python Tkinter是什么,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • Python學習之直方圖均衡化原理詳解

    Python學習之直方圖均衡化原理詳解

    直方圖均衡化是以累計分布函數(shù)為核心,將原始圖像灰度直方圖從比較集中的某個灰度區(qū)間,非線性地映射為在全部灰度范圍內(nèi)的較均勻分布,從而增強對比度。本文將為大家詳細講解直方圖均衡化的原理,需要的可以參考一下
    2022-03-03

最新評論