日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

OpenCV实践之路——人脸检测(C++/Python) 【转】

發布時間:2025/1/21 c/c++ 143 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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;??
  • ??
  • /**?Function?Headers?*/??
  • void?detectAndDisplay(Mat?frame);??
  • ??
  • /**?Global?variables?*/??
  • 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";??
  • ??
  • /**?@function?main?*/??
  • int?main(void)??
  • {??
  • ????Mat?frame?=?imread("2.jpg");??
  • ??
  • ????//VideoCapture?capture;??
  • ????//Mat?frame;??
  • ??
  • ????//--?1.?Load?the?cascades??
  • ????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;?};??
  • ??
  • ????//--?2.?Read?the?video?stream??
  • ????//capture.open(0);??
  • ????//if?(!capture.isOpened())?{?printf("--(!)Error?opening?video?capture\n");?return?-1;?}??
  • ??
  • ????//while?(capture.read(frame))??
  • ????//{??
  • ????//??if?(frame.empty())??
  • ????//??{??
  • ????//??????printf("?--(!)?No?captured?frame?--?Break!");??
  • ????//??????break;??
  • ????//??}??
  • ??
  • ????????//--?3.?Apply?the?classifier?to?the?frame??
  • ????????detectAndDisplay(frame);??
  • ??
  • ????????int?c?=?waitKey(0);??
  • ????????if?((char)c?==?27)?{?return?0;?}?//?escape??
  • ????//}??
  • ????return?0;??
  • }??
  • ??
  • /**?@function?detectAndDisplay?*/??
  • void?detectAndDisplay(Mat?frame)??
  • {??
  • ????std::vector<Rect>?faces;??
  • ????Mat?frame_gray;??
  • ??
  • ????cvtColor(frame,?frame_gray,?COLOR_BGR2GRAY);??
  • ????equalizeHist(frame_gray,?frame_gray);??
  • ??
  • ????//--?Detect?faces??
  • ????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++)??
  • ????{??
  • ????????//Point?center(faces[i].x?+?faces[i].width?/?2,?faces[i].y?+?faces[i].height?/?2);??
  • ????????//ellipse(frame,?center,?Size(faces[i].width?/?2,?faces[i].height?/?2),?0,?0,?360,?Scalar(255,?0,?255),?4,?8,?0);??
  • ????????rectangle(frame,?faces[i],Scalar(255,0,0),2,8,0);??
  • ??????????
  • ????????Mat?faceROI?=?frame_gray(faces[i]);??
  • ????????std::vector<Rect>?eyes;??
  • ??
  • ????????//--?In?each?face,?detect?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);??
  • ??????????????
  • ????????????//Point?eye_center(faces[i].x?+?eyes[j].x?+?eyes[j].width?/?2,?faces[i].y?+?eyes[j].y?+?eyes[j].height?/?2);??
  • ????????????//int?radius?=?cvRound((eyes[j].width?+?eyes[j].height)*0.25);??
  • ????????????//circle(frame,?eye_center,?radius,?Scalar(255,?0,?0),?4,?8,?0);??
  • ????????????rectangle(frame,?rect,?Scalar(0,?255,?0),?2,?8,?0);??
  • ????????}??
  • ????}??
  • ????//--?Show?what?you?got??
  • ????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) 【转】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。