用opencv檢測人眼並定位瞳孔位置

2021-07-08 17:18:24 字數 2647 閱讀 9493

最近的研究要用到定位瞳孔的位置,所以上網搜了下相關的**。總結如下:

1) 定位瞳孔可以直接使用opencv中的自帶的分類器(haarcascade_eye_tree_eyeglasses.xml)來實現,以前聽師兄說用opencv自帶的這個方法定位瞳孔不准,但我自己做了實驗後發現在正面人臉的情況下定位還是很準確的,後面有圖。分析了下原因,師兄是他之前實驗時感覺不准有可能是他的opencv版本還不是很高,我這裡用的是opencv2.4.4,相信opencv也在它的後續版本中不斷的優化它的machine learning中相關庫以提高準確率。

當然,在複雜情況下的人眼精準定位本身就是乙個熱門的研究課題。所以如果是複雜情況下的精準定位,opencv可能就沒那麼給力了。

2)用opencv中檢測人臉、眼睛、嘴巴等都是用的cascadeclassifier分類器,具體使用時可以使用c的函式,也可以使用opencv中使用c++封裝好的類。下面是它們檢測目標時的函式形式(從opencv官網複製的)

c:cvseq* 

cvhaardetectobjects

(const cvarr* 

image

, cvhaarclassifiercascade* 

cascade

,cvmemstorage* 

storage

,double 

scale_factor

=1.1, int 

min_neighbors

=3, int 

flags

=0, cvsize 

min_size

=cvsize(0,0), cvsize 

max_size

=cvsize(0,0) 

)c++:void cascadeclassifier::

detectmultiscale

(const mat& image, vector& objects, double scalefactor=1.1, int minneighbors=3, int flags=0, size minsize=size(), size maxsize=size())

這兩者最大的區別在於,用c封裝的函式要自己手動分配記憶體,而用c++的形式則不用自己去分配記憶體,這就是很多同學在網上找到的**有些要分配記憶體,有些又不用分配記憶體的原因。顯然c++的形式更簡潔,所以我下面的**也是用的c++的函式。

直接上**,注意下面的haarcascade_eye_tree_eyeglasses.xml檔案在opencv安裝目錄下的data資料夾中。

完整的**在

[cpp]view plain

copy

"font-size:14px;"

>#include 

"highgui.h"

#include "cv.h"

#include 

#include 

using

namespace

std;  

using

namespace

cv;  

void

detectanddraw(iplimage* img, cascadeclassifier& cascade);  

//string cascadename = "haarcascade_frontalface_alt.xml";

string cascadename = "haarcascade_eye_tree_eyeglasses.xml"

;//nestedcascadename

intmain( )  

void

detectanddraw(iplimage* img, cascadeclassifier& cascade)  

;  iplimage* gray = cvcreateimage(cvgetsize(img),8,1);  

cvcvtcolor( img, gray, cv_bgr2gray );  

cvequalizehist( gray, gray );  

t = (double

)cvgettickcount();  

cascade.detectmultiscale( gray , faces,  

1.1, 2, 0  

//|cv_haar_find_biggest_object

//|cv_haar_do_rough_search

|cv_haar_scale_image  

,  size(30, 30) );  

t = (double

)cvgettickcount() - t;  

printf( "detection time = %g ms\n"

, t/((

double

)cvgettickfrequency()*1000.) );  

for( vector::const_iterator r = faces.begin(); r != faces.end(); r++, i++ )  

cvshowimage( "result"

, img );  }

執行結果:

基於opencv和QT的人臉(人眼)檢測程式

qt和 opencv 的攝像頭 本地 讀取並輸出程式 include detectanddisplay.h void detectanddisplay mat frame std vecto ces 用於儲存檢測結果的向量 mat frame gray cvtcolor frame,frame gr...

OpenCV2 4 例程六 人眼檢測

以下程式來自opencv自帶例程 include stdafx.h include opencv highgui.h include opencv2 objdetect objdetect.hpp include opencv2 video tracking.hpp include opencv2 ...

OpenCV人臉檢測 4 繪製人臉與人眼區域

img 為目標 左上角座標為 x,y 右下角座標為 x w,y h 顏色 b,g,r 255,0,0 表示藍色,0,255,0 表示綠色,0,0,255 表示紅色,3 表示 bgr 三個通道。2代表邊框線粗度為 2。使用 opencv 分類器檢測人臉之後,一張中可能包含多個人臉,所以對每乙個識別到的...