生活随笔
收集整理的這篇文章主要介紹了
OpenCV实践之路——人脸检测(C++/Python) 【转】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉自:http://blog.csdn.net/xingchenbingbuyu/article/details/51105159
版權聲明:本文為博主原創文章,轉載請聯系作者取得授權。
?
?
本文由@星沉閣冰不語出品,轉載請注明作者和出處。
文章鏈接:http://blog.csdn.net/xingchenbingbuyu/article/details/51105159
微博:http://weibo.com/xingchenbing?
?
之前一直覺得人臉檢測是非常麻煩的,即使是用OpenCV,麻煩到我都不敢去碰。這兩天仔細看了下,如果只是調用opencv自帶的分類器和函數的話,簡直是簡單。這不,正好最近也在學習Python,索性就用C++和Python兩種語言都實現一下。當然,我現在這個是最簡單的版本。
?
步驟:
?
調用opencv訓練好的分類器和自帶的檢測函數檢測人臉人眼等的步驟簡單直接:
1.加載分類器,當然分類器事先要放在工程目錄中去。分類器本來的位置是在*\opencv\sources\data\haarcascades(harr分類器,也有其他的可以用,也可以自己訓練)
2.調用detectMultiScale()函數檢測,調整函數的參數可以使檢測結果更加精確。
3.把檢測到的人臉等用矩形(或者圓形等其他圖形)畫出來。
?
主要函數:
?
這里面最主要的一個函數就是detectMultiScale()。文檔中的解釋如下:
?
?
1.image表示的是要檢測的輸入圖像
2.objects表示檢測到的人臉目標序列
3.scaleFactor表示每次圖像尺寸減小的比例
4.?minNeighbors表示每一個目標至少要被檢測到3次才算是真的目標(因為周圍的像素和不同的窗口大小都可以檢測到人臉),
5.minSize為目標的最小尺寸
6.minSize為目標的最大尺寸
?
適當調整4,5,6兩個參數可以用來排除檢測結果中的干擾項。
?
程序:
?
C++程序如下:
[cpp] view plaincopy print?
#include<opencv2\opencv.hpp>??#include?<iostream>??#include?<stdio.h>????using?namespace?std;??using?namespace?cv;????void?detectAndDisplay(Mat?frame);????String?face_cascade_name?=?"haarcascade_frontalface_default.xml";??String?eyes_cascade_name?=?"haarcascade_eye_tree_eyeglasses.xml";??CascadeClassifier?face_cascade;???CascadeClassifier?eyes_cascade;???String?window_name?=?"Capture?-?Face?detection";????int?main(void)??{??????Mat?frame?=?imread("2.jpg");??????????????????????if?(!face_cascade.load(face_cascade_name)){?printf("--(!)Error?loading?face?cascade\n");?return?-1;?};??????if?(!eyes_cascade.load(eyes_cascade_name)){?printf("--(!)Error?loading?eyes?cascade\n");?return?-1;?};????????????????????????????????????????????????????????????????detectAndDisplay(frame);????????????int?c?=?waitKey(0);??????????if?((char)c?==?27)?{?return?0;?}?????????return?0;??}????void?detectAndDisplay(Mat?frame)??{??????std::vector<Rect>?faces;??????Mat?frame_gray;????????cvtColor(frame,?frame_gray,?COLOR_BGR2GRAY);??????equalizeHist(frame_gray,?frame_gray);????????????face_cascade.detectMultiScale(frame_gray,?faces,?1.1,?3,?CV_HAAR_DO_ROUGH_SEARCH,?Size(70,?70),Size(100,100));????????for?(size_t?i?=?0;?i?<?faces.size();?i++)??????{??????????????????????????rectangle(frame,?faces[i],Scalar(255,0,0),2,8,0);????????????????????Mat?faceROI?=?frame_gray(faces[i]);??????????std::vector<Rect>?eyes;????????????????????eyes_cascade.detectMultiScale(faceROI,?eyes,?1.1,?1,?CV_HAAR_DO_ROUGH_SEARCH,?Size(3,?3));????????????for?(size_t?j?=?0;?j?<?eyes.size();?j++)??????????{??????????????Rect?rect(faces[i].x?+?eyes[j].x,?faces[i].y?+?eyes[j].y,?eyes[j].width,?eyes[j].height);????????????????????????????????????????????????????????????????rectangle(frame,?rect,?Scalar(0,?255,?0),?2,?8,?0);??????????}??????}??????????namedWindow(window_name,?2);??????imshow(window_name,?frame);??}?? ?
Python程序如下:
[python] view plaincopy print?
import?numpy?as?np??import?cv2??????face_cascade?=?cv2.CascadeClassifier("/haarcascade_frontalface_default.xml")??eye_cascade?=?cv2.CascadeClassifier("/haarcascade_eye_tree_eyeglasses.xml")????img?=?cv2.imread("/2.jpg")??gray?=?cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)????????????????????????faces?=?face_cascade.detectMultiScale(gray,1.1,5,cv2.CASCADE_SCALE_IMAGE,(50,50),(100,100))????if?len(faces)>0:??????for?faceRect?in?faces:??????????x,y,w,h?=?faceRect??????????cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2,8,0)????????????roi_gray?=?gray[y:y+h,x:x+w]??????????roi_color?=?img[y:y+h,x:x+w]????????????eyes?=?eye_cascade.detectMultiScale(roi_gray,1.1,1,cv2.CASCADE_SCALE_IMAGE,(2,2))??????????for?(ex,ey,ew,eh)?in?eyes:??????????????cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)????????????????cv2.imshow("img",img)??cv2.waitKey(0)?? ?
效果:
?
最終結果如下圖所示:
?
?
?
?
最近開通了微信公眾號,感興趣的同學可以掃碼在微信上交流。
轉載于:https://www.cnblogs.com/sky-heaven/p/6898571.html
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的OpenCV实践之路——人脸检测(C++/Python) 【转】的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。