转自:http://blog.csdn.net/xingchenbingbuyu/article/details/51105159
凯发ag旗舰厅登录网址下载的版权声明:本文为博主原创文章,转载请联系作者取得授权。
本文由@星沉阁冰不语出品,转载请注明作者和出处。
文章链接: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 #include #include 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 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 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年技术见证,附赠技术全景图
总结
以上是凯发ag旗舰厅登录网址下载为你收集整理的opencv实践之路——人脸检测(c /python) 【转】的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得凯发ag旗舰厅登录网址下载网站内容还不错,欢迎将凯发ag旗舰厅登录网址下载推荐给好友。