VC++中使用OpenCV進(jìn)行人臉檢測
對于上面的圖像,如何使用OpenCV進(jìn)行人臉檢測呢?
使用OpenCV進(jìn)行人臉檢測十分簡單,OpenCV官網(wǎng)給了一個Python人臉檢測的示例程序,objectDetection.py
代碼如下:
from __future__ import print_function
import cv2 as cv
import argparse
def detectAndDisplay(frame):
frame_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
frame_gray = cv.equalizeHist(frame_gray)
#-- Detect faces
faces = face_cascade.detectMultiScale(frame_gray)
for (x,y,w,h) in faces:
center = (x + w//2, y + h//2)
frame = cv.ellipse(frame, center, (w//2, h//2), 0, 0, 360, (255, 0, 255), 4)
faceROI = frame_gray[y:y+h,x:x+w]
#-- In each face, detect eyes
eyes = eyes_cascade.detectMultiScale(faceROI)
for (x2,y2,w2,h2) in eyes:
eye_center = (x + x2 + w2//2, y + y2 + h2//2)
radius = int(round((w2 + h2)*0.25))
frame = cv.circle(frame, eye_center, radius, (255, 0, 0 ), 4)
cv.imshow('Capture - Face detection', frame)
parser = argparse.ArgumentParser(description='Code for Cascade Classifier tutorial.')
parser.add_argument('--face_cascade', help='Path to face cascade.', default='data/haarcascades/haarcascade_frontalface_alt.xml')
parser.add_argument('--eyes_cascade', help='Path to eyes cascade.', default='data/haarcascades/haarcascade_eye_tree_eyeglasses.xml')
parser.add_argument('--camera', help='Camera divide number.', type=int, default=0)
args = parser.parse_args()
face_cascade_name = args.face_cascade
eyes_cascade_name = args.eyes_cascade
face_cascade = cv.CascadeClassifier()
eyes_cascade = cv.CascadeClassifier()
#-- 1. Load the cascades
if not face_cascade.load(cv.samples.findFile(face_cascade_name)):
print('--(!)Error loading face cascade')
exit(0)
if not eyes_cascade.load(cv.samples.findFile(eyes_cascade_name)):
print('--(!)Error loading eyes cascade')
exit(0)
camera_device = args.camera
#-- 2. Read the video stream
cap = cv.VideoCapture(camera_device)
if not cap.isOpened:
print('--(!)Error opening video capture')
exit(0)
while True:
ret, frame = cap.read()
if frame is None:
print('--(!) No captured frame -- Break!')
break
detectAndDisplay(frame)
if cv.waitKey(10) == 27:
break
所在目錄為D:\env_build\opencv4.9.0\opencv\sources\samples\python\tutorial_code\objectDetection\cascade_classifier\objectDetection.py
人臉識別的背景
人臉識別可以用在身份認(rèn)證,門禁等場合中,可以通過訓(xùn)練大量的人臉數(shù)據(jù)獲取人臉的特征。但是實際場景可以比較復(fù)雜,由于燈光、視角、視距、攝像頭抖動以及數(shù)字噪聲的變化,圖像細(xì)節(jié)變得不穩(wěn)定;還有戴了口罩、帽子之后對于人臉的檢測就變得更麻煩了。Haar 特征是一種用于實現(xiàn)實時人臉跟蹤的特征。每一個 Haar 特征都描述了相鄰圖像區(qū)域的對比模式。例如,邊,頂點(diǎn)和細(xì)線都能生成具有判別性的特征。
haar級聯(lián)數(shù)據(jù)獲取
在 sources 的一個文件夾 data/haarcascades。該文件夾包含了所有 OpenCV 的人臉檢測的 XML 文件,這些可用于檢測靜止圖像、視頻和攝像頭所得到圖像中的人臉。如下圖所示:
- 人臉檢測器(默認(rèn)):haarcascade_frontalface_default.xml
- 人臉檢測器(快速 Harr):haarcascade_frontalface_alt2.xml
- 人臉檢測器(側(cè)視):haarcascade_profileface.xml
- 眼部檢測器(左眼):haarcascade_lefteye_2splits.xml
- 眼部檢測器(右眼):haarcascade_righteye_2splits.xml
- 身體檢測器:haarcascade_fullbody.xml
- 上半身檢測器:haarcascade_upperbody.xml
其中,本文中我們使用默認(rèn)的人臉檢測器xml配置文件haarcascade_frontalface_default.xml
,可以從https://github.com/murtazahassan/Learn-OpenCV-cpp-in-4-Hours/blob/main/Resources/haarcascade_frontalface_default.xml處下載
資源圖片地址
人臉資源圖片地址為:https://github.com/murtazahassan/Learn-OpenCV-cpp-in-4-Hours/blob/main/Resources/test.png
C++人臉檢測示例代碼
C++示例代碼如下:文章來源:http://www.zghlxwxcb.cn/news/detail-832104.html
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/objdetect.hpp>
#include <iostream>
using namespace cv;
using namespace std;
/// Images 人臉檢測 //
int main()
{
string path = "Resources/test.png";
//string path = "Resources/multiFaces.jpg";
Mat img = imread(path);
CascadeClassifier faceCascade; // 級聯(lián)分類器
faceCascade.load("Resources/haarcascade_frontalface_default.xml"); // 加載訓(xùn)練好的haar人臉正臉xml配置文件
if (faceCascade.empty()) {
cout << "XML file not loaded" << endl;
}
vector<Rect> faces; // 人臉的矩形數(shù)組
faceCascade.detectMultiScale(img, faces, 1.1, 10); // 檢測輸入圖像中不同大小的對象,檢測到的對象返回矩形列表形式faces
// 針對每個檢測到的人臉矩形,在對應(yīng)位置上繪制矩形區(qū)域
for (int i = 0; i < faces.size(); i++)
{
rectangle(img, faces[i].tl(), faces[i].br(), Scalar(255, 0, 255), 3); // 在原圖上繪制人臉矩形區(qū)域,顏色為粉色,線條厚度為3像素
}
imshow("Image", img);
waitKey(0);
return 0;
}
運(yùn)行結(jié)果如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-832104.html
參考資料
- 人臉識別-Haar級聯(lián)
- 人臉識別-多張人臉檢測
- LEARN OPENCV C++ in 4 HOURS | Including 3x Projects | Computer Vision
- murtazahassan/Learn-OpenCV-cpp-in-4-Hours
- LEARN OPENCV in 3 HOURS with Python | Including 3xProjects | Computer Vision
- Learn-OpenCV-in-3-hours
- OpenCV官網(wǎng)
- OpenCV-Get Started
- OpenCV Github倉庫源代碼
- OpenCV tutorial
到了這里,關(guān)于VC++中使用OpenCV進(jìn)行人臉檢測的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!