|
opencv人臉檢測--detectMultiScale函數(shù) 轉(zhuǎn)載請注明出處:http://blog.csdn.net/itismelzp/article/details/50379359 首先上兩張圖。 

現(xiàn)在要對上面兩張圖進(jìn)行人臉檢測。 一、Haar特征分類器介紹Haar特征分類器就是一個XML文件,該文件中會描述人體各個部位的Haar特征值。包括人臉、眼睛、嘴唇等等。
Haar特征分類器存放目錄:OpenCV安裝目錄中的\data\ haarcascades目錄下,opencv2.4.9版本下的Haar特征分類器如下: haarcascade_eye_tree_eyeglasses.xml haarcascade_frontalface_alt.xml haarcascade_frontalface_alt_tree.xml haarcascade_frontalface_alt2.xml haarcascade_frontalface_default.xml haarcascade_lefteye_2splits.xml haarcascade_lowerbody.xml haarcascade_mcs_eyepair_big.xml haarcascade_mcs_eyepair_small.xml haarcascade_mcs_leftear.xml haarcascade_mcs_lefteye.xml haarcascade_mcs_mouth.xml haarcascade_mcs_rightear.xml haarcascade_mcs_righteye.xml haarcascade_mcs_upperbody.xml haarcascade_profileface.xml haarcascade_righteye_2splits.xml haarcascade_upperbody.xml
根據(jù)命名就可以很快知道各個分類器的用途。其中:haarcascade_frontalface_alt.xml與haarcascade_frontalface_alt2.xml都是人臉識別的Haar特征分類器了。 二、detectMultiScale函數(shù)詳解cvHaarDetectObjects是opencv1中的函數(shù),opencv2中人臉檢測使用的是 detectMultiScale函數(shù)。它可以檢測出圖片中所有的人臉,并將人臉用vector保存各個人臉的坐標(biāo)、大?。ㄓ镁匦伪硎荆?,函數(shù)由分類器對象調(diào)用: CV_OUT vector<Rect>& objects, double scaleFactor = 1.1,
函數(shù)介紹: 參數(shù)1:image--待檢測圖片,一般為灰度圖像加快檢測速度; 參數(shù)2:objects--被檢測物體的矩形框向量組; 參數(shù)3:scaleFactor--表示在前后兩次相繼的掃描中,搜索窗口的比例系數(shù)。默認(rèn)為1.1即每次搜索窗口依次擴(kuò)大10%; 參數(shù)4:minNeighbors--表示構(gòu)成檢測目標(biāo)的相鄰矩形的最小個數(shù)(默認(rèn)為3個)。 如果組成檢測目標(biāo)的小矩形的個數(shù)和小于 min_neighbors - 1 都會被排除。 如果min_neighbors 為 0, 則函數(shù)不做任何操作就返回所有的被檢候選矩形框, 這種設(shè)定值一般用在用戶自定義對檢測結(jié)果的組合程序上; 參數(shù)5:flags--要么使用默認(rèn)值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果設(shè)置為 CV_HAAR_DO_CANNY_PRUNING,那么函數(shù)將會使用Canny邊緣檢測來排除邊緣過多或過少的區(qū)域, 因此這些區(qū)域通常不會是人臉?biāo)趨^(qū)域; 參數(shù)6、7:minSize和maxSize用來限制得到的目標(biāo)區(qū)域的范圍。
三、示例代碼#include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/opencv.hpp>
CascadeClassifier cascade; cascade.load("haarcascade_frontalface_alt2.xml");
Mat srcImage, grayImage,dstImage; srcImage = imread("image.jpg"); dstImage = srcImage.clone(); imshow("【原圖】", srcImage);
grayImage.create(srcImage.size(), srcImage.type()); cvtColor(srcImage, grayImage, CV_BGR2GRAY); // 生成灰度圖,提高檢測效率
cascade.detectMultiScale(grayImage, rect, 1.1, 3, 0); // 分類器對象調(diào)用
printf("檢測到人臉個數(shù):%d\n", rect.size());
for (int i = 0; i < rect.size();i++) center.x = cvRound((rect[i].x + rect[i].width * 0.5)); center.y = cvRound((rect[i].y + rect[i].height * 0.5));
radius = cvRound((rect[i].width + rect[i].height) * 0.25); circle(dstImage, center, radius, colors[i % 7], 2);
imshow("【人臉識別detectMultiScale】", dstImage);
效果圖: 

如果要識別人體的其它部位,只需將上面的haarcascade_frontalface_alt2.xml分類器替換即可。
|