前言關(guān)于opencvOpenCV 是 Intel 開源計(jì)算機(jī)視覺庫 (Computer Version) 。它由一系列 C 函數(shù)和少量 C++ 類構(gòu)成,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺方面的很多通用算法。
OpenCV 擁有包括 300 多個(gè) C 函數(shù)的跨平臺(tái)的中、高層 API 。它不依賴于其它的外部庫 —— 盡管也可以使用某些外部庫。 OpenCV 對(duì)非商業(yè)應(yīng)用和商業(yè)應(yīng)用都是免費(fèi) 的。同時(shí) OpenCV 提供了對(duì)硬件的訪問,可以直接訪問攝像頭,并且 opencv 還提供了一個(gè)簡(jiǎn)單的 GUI(graphics user interface) 系統(tǒng) :highgui 。 我們就通過 OpenCV 提供的一些方法來構(gòu)造出這個(gè)人臉檢測(cè) ( face detection ) 程序來。 opencv的python包裝
OpenCV 本身是有 C/C++ 編寫的,如果要在其他語言中使用,我們可以通過對(duì)其動(dòng)態(tài)鏈接庫文件進(jìn)行包裝即可,幸運(yùn)的是, Python 下有很多個(gè)這樣的包裝,本文中使用的是 Cvtypes 。
事實(shí)上,在 Python 中很多的包都是來自第三方的,比如 PIL(Python Image Library) 即為 C 語言實(shí)現(xiàn)的一個(gè)圖形處理包,被包裝到了 Python 中,這些包裝可以讓你像使用 Python 的內(nèi)建函數(shù)一樣的使用這些 API 。
人臉檢測(cè)原理人臉檢測(cè)屬于目標(biāo)檢測(cè)(object detection) 的一部分,主要涉及兩個(gè)方面
計(jì)算機(jī)視覺計(jì)算機(jī)的視覺系統(tǒng),跟人的眼睛是大不相同的,但是其中也有類似之處。人眼之能夠看到物體,是通過物體上反射出來的光線刺激人眼的感光細(xì)胞,然后視覺神經(jīng)在大腦中形成物體的像。計(jì)算機(jī)通過攝像頭看到的東西要簡(jiǎn)單的多,簡(jiǎn)單來說,就是一堆由數(shù)字組成的矩陣。這些數(shù)字表明了物體發(fā)出的光的強(qiáng)弱,攝像頭的光敏元件將光信號(hào)轉(zhuǎn)化成數(shù)字信號(hào),將其量化為矩陣。 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)練的方式包含兩方面: Haar特征
非固定大小目標(biāo)檢測(cè)因?yàn)槭腔谝曨l流的目標(biāo)檢測(cè),我們事先不太可能知道要檢測(cè)的目標(biāo)的大小,這就要求我們的級(jí)聯(lián)表中的分類器具有按比例增大(或者縮小)的能力,這樣,當(dāng)小的窗口移動(dòng)完整個(gè)待檢測(cè)圖片沒有發(fā)現(xiàn)目標(biāo)時(shí),我們可以調(diào)整分類器的大小,然后繼續(xù)檢測(cè),直到檢測(cè)到目標(biāo)或者窗口與待檢測(cè)圖片的大小相當(dāng)為止。
步驟一:圖片預(yù)處理在從攝像頭中獲得一個(gè)幀(一張圖片)后,我們需要先對(duì)這張圖片進(jìn)行一些預(yù)處理:
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é)果,我們可以通過加載這個(gè)文件而省略掉自己建立級(jí)聯(lián)表的過程。有了級(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的其他特性拉普拉斯邊緣檢測(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
結(jié)束語OpenCV的功能十分強(qiáng)大,而且提供了大量的算法實(shí)現(xiàn),文中涉及到的內(nèi)容只是計(jì)算機(jī)視覺中很小的一部分。讀者可以考慮將采集到的人臉進(jìn)行標(biāo)識(shí),從而實(shí)現(xiàn)特定人的人臉識(shí)別?;蛘呖紤]將人臉檢測(cè)移植到網(wǎng)絡(luò)上,從而實(shí)現(xiàn)遠(yuǎn)程監(jiān)控。試想一下,原來沒有生命的機(jī)器,我們可以通過自己的思想,動(dòng)作來使得它們看起來像是有思想一樣,這件事本身就非常的有趣。 |
|