最近的研究要用到定位瞳孔的位置,所以上網搜了下相關的**。總結如下:
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 分類器檢測人臉之後,一張中可能包含多個人臉,所以對每乙個識別到的...