基于opencv的检测人脸,并截取人脸

这篇博客介绍了如何利用OpenCV的 CascadeClassifier 进行人脸检测,并通过CVzone的FaceDetectionModule进行实时视频中的人脸检测。代码示例展示了从摄像头捕获图像,检测并标记人脸,以及使用矩形框包围人脸的过程。此外,还展示了利用中心点在图像上画圆来标识人脸位置。整个过程表明了这两个库在速度和识别效果上的优势。
摘要由CSDN通过智能技术生成
import cv2
import numpy
cam = cv2.VideoCapture(0)
face_det = cv2.CascadeClassifier('./apply/haarcascade_frontalface_default.xml')
success = cam.isOpened()

while success and cv2.waitKey(1) == -1:
    ret, img = cam.read()
    face =  face_det.detectMultiScale(img,1.3,5)
    if len(face):
        for(x, y, w, h) in face:
            img = cv2.rectangle(img, (x,y),(x+w,y+h),(255,0,0),2)
            img_face = img[y :y+h , x:x+w]
            cv2.imshow('1', img_face)

    # print(img_face)

    cv2.imshow('0',img)

心得:在截取人脸过程中,img[y1:y2,x:1:x2],先对y区域设置

基于CVzone的人脸检测,速度和识别效果良好

from cvzone.FaceDetectionModule import FaceDetector
import cv2
import imutils
cap = cv2.VideoCapture(r'data/song.jpg')
detector = FaceDetector()

while True:
    success, img = cap.read()
    img = imutils.resize(img, width=1024)
    img, bboxs = detector.findFaces(img)

    if bboxs:
        # bboxInfo - "id","bbox","score","center"
        center = bboxs[0]["center"]
        cv2.circle(img, center, 5, (255, 0, 255), cv2.FILLED)
    # img = cv2.putText(img, "中国", (50,50), cv2.FONT_HERSHEY_PLAIN,2, (0,255,255))
    cv2.imshow("Image", img)
    if cv2.waitKey(0) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

这个问题需要分步来解决。 第一步是从摄像头中读取视频流。我们可以使用OpenCV中的VideoCapture类来实现这一步骤。代码如下: ```c++ VideoCapture cap(0); if(!cap.isOpened()){ cout << "Cannot open camera" << endl; return -1; } ``` 这段代码将打开摄像头,并检查是否成功打开。如果摄像头不能打开,程序将返回-1。 第二步是从视频流中读取帧,并在帧中检测人脸。我们可以使用OpenCV中的CascadeClassifier类来实现这一步骤。代码如下: ```c++ CascadeClassifier face_cascade; if(!face_cascade.load("haarcascade_frontalface_alt.xml")){ cout << "Cannot load face cascade" << endl; return -1; } Mat frame; cap >> frame; vector<Rect> faces; face_cascade.detectMultiScale(frame, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30)); ``` 这段代码将加载人脸检测器,并使用它来检测视频流中的人脸。我们使用detectMultiScale函数来检测人脸。这个函数将返回一个包含检测到的人脸矩形的向量。我们可以使用这些矩形来裁剪帧并截取人脸图像。 第三步是裁剪帧并保存人脸图像。代码如下: ```c++ for(size_t i = 0; i < faces.size(); i++){ Rect roi(faces[i].x, faces[i].y, faces[i].width, faces[i].height); Mat face = frame(roi); imwrite("face_" + to_string(i) + ".jpg", face); } ``` 这段代码将遍历所有检测到的人脸矩形,并使用它们来裁剪帧并保存人脸图像。我们使用imwrite函数来保存图像。 完整的代码如下: ```c++ #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { VideoCapture cap(0); if(!cap.isOpened()){ cout << "Cannot open camera" << endl; return -1; } CascadeClassifier face_cascade; if(!face_cascade.load("haarcascade_frontalface_alt.xml")){ cout << "Cannot load face cascade" << endl; return -1; } while(true){ Mat frame; cap >> frame; vector<Rect> faces; face_cascade.detectMultiScale(frame, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30)); for(size_t i = 0; i < faces.size(); i++){ Rect roi(faces[i].x, faces[i].y, faces[i].width, faces[i].height); Mat face = frame(roi); imwrite("face_" + to_string(i) + ".jpg", face); } imshow("Camera", frame); if(waitKey(30) == 27){ break; } } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一休哥※

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值