opencv实现人脸识别(c++实现)

article/2025/10/26 9:40:28

1 说明

  • 本文章基于opencv + VS2015 实现人脸检测

2 效果

请添加图片描述

  • 可以直接打开摄像头对人脸进行识别,这些标识框也会跟随你的人脸移动。隐私问题,我这里对图片进行了识别。

3 相关类及函数介绍

opencv中文文档

3.1 cv::VideoCapture

官方文档说明

  • 功能 :用于从视频文件、图像序列或摄像机捕获视频的类

3.1.1 open

  • bool cv::VideoCapture::open(int index);
  • 功能 : 打开相机进行视频捕获
  • 参数介绍
    • index : 要打开的视频捕获设备的索引(0表示打开默认摄像机)

3.1.2 read

  • bool cv::VideoCapture::read(OutputArray image);
  • 功能 : 抓取、解码并返回下一个视频帧
  • 参数介绍
    • image:图像视频帧在此处返回。如果未抓取任何帧,则图像将为空。

3.1.3 release

  • cv::VideoCapture::release();
  • 功能 : 关闭视频文件或捕获设备

3.2 cv::CascadeClassifier

官方文档说明

  • 功能 : CascadeClassifier是opencv下objdetect模块中用来做目标检测的级联分类器的一个类, 早期opencv版本仅支持haar特征的目标检测,分别在opencv2.2和2.4之后开始支持LBP和HOG特征的目标检测.

3.2.1 load

  • bool cv::CascadeClassifier::load(const String &filename);

  • 功能 : 从文件中加载级联分类器

  • 参数介绍

    • filename : 需要加载的分类器文件
  • opencv安装包中包含以及训练好的分类器文件(opencv\sources\data\haarcascades)

    • haarcascade_frontalface_alt.xml 检测人脸的分类器文件
    • haarcascade_eye.xml 检测眼睛的分类器文件
    • haarcascade_mcs_mouth.xml 检测嘴部的分类器文件(opencv安装包中没有携带, 可从github上去下载)
  • 分类器文件下载

3.2.2 detectMultiScale

  • void cv::CascadeClassifier::detectMultiScale(const Mat& image, CV_OUT vector& objects, double scaleFactor = 1.1, int minNeighbors = 3, int flags = 0, Size minSize = Size(),Size maxSize = Size());
  • 功能 : 检测输入图像中不同大小的对象。检测到的对象将作为矩形列表返回
  • 参数介绍
    • image : 包含检测对象的图像的CV_8U类型矩阵
    • objects : 矩形的向量,其中每个矩形包含被检测的对象, 矩形可以部分位于原始图像之外
    • scaleFactor : 指定在每个图像缩放时的缩放比例. 默认为1.1 即每次搜索窗口扩大10%
    • minNeighbors : 指定每个候选矩形需要保留多少个相邻矩形(匹配成功所需要的周围矩形框的数目,每一个特征匹配到的区域都是一个矩形框,只有多个矩形框同时存在的时候,才认为是匹配成功,比如人脸,这个默认值是3)
    • flag
      • CASCADE_DO_CANNY_PRUNING : 利用canny边缘检测来排除一些边缘很少或者很多的图像区域
      • CASCADE_SCALE_IMAGE : 正常比例检测
      • CASCADE_FIND_BIGGEST_OBJECT : 只检测最大的物体
      • CASCADE_DO_ROUGH_SEARCH : 初略的检测
    • minSize : 目标区域最小范围
    • maxSize : 目标区域最大范围

3.3 cv::waitKey

  • int cv::waitKey(int delay = 0);
  • 功能 : 等待按键按下
  • 参数介绍
    • delay : 超时时间, 单位为毫秒
  • 返回值 : 返回按下按键的值

3.4 cv::imshow

  • void cv::imshow(const String &winname, InputArray mat);
  • 功能 : 将图片显示在窗口中,通过设备屏幕展现出来
  • 参数介绍
    • winname: 窗口名
    • mat:要显示的图片

3.5 cv::destroyAllWindows

  • void cv::destroyAllWindows();
  • 功能 : 删除窗口

3.6 cv::putText

  • void cv::putText(InputOutputArray img, const String& text, Point org, int fontFace, double fontScale, Scalar color, int thickness = 1, int lineType = LINE_8, bool bottomLeftOrigin = false);

  • 功能 : 给视频图像添加文字说明

  • 参数介绍

    • img : 需要添加文字说明的图形对象
    • text : 需要写入的文本内容
    • org : 第一个字符左下角坐标
    • fontFace : 字体类型
      • 衬线体就是有边角装饰的字体, 无衬线字体通常是机械和统一粗细的线条, 没有边角的装饰

      • FONT_HERSHEY_SIMPLEX : 正常大小的无衬线字体

      • FONT_HERSHEY_PLAIN : 小号无衬线字体

      • FONT_HERSHEY_DUPLEX : 正常大小的无衬线字体(比FONT_HERSHEY_SIMPLEX更复杂)

      • FONT_HERSHEY_COMPLEX : 正常大小的衬线字体

      • FONT_HERSHEY_TRIPLEX : 正常大小的衬线字体(比FONT_HERSHEY_COMPLEX更复杂)

      • FONT_HERSHEY_COMPLEX_SMALL : FONT_HERSHEY_COMPLEX的较小版本

      • FONT_HERSHEY_SCRIPT_SIMPLEX : 手写样式字体

      • FONT_HERSHEY_SCRIPT_COMPLEX : 更复杂的FONT_HERSHEY_SCRIPT_SIMPLEX变体

      • FONT_ITALIC : 斜体字体的标志

    • fontScale : 字体大小
    • color : 字体颜色
    • thickness : 字体粗细
    • lineType : 线型
      • LINE_4 : 4联通线型
      • LINE_8 : 8联通线型
      • LINE_AA : 抗锯齿线

4 源代码

  • mian.cpp
#include <iostream>
#include <opencv2/opencv.hpp>char* face_cascade_name = "D:\\opencv\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml";
char* eyes_cascade_name = "D:\\opencv\\opencv\\sources\\data\\haarcascades\\haarcascade_eye.xml";
char* mouth_cascade_name = "D:\\opencv\\opencv\\sources\\data\\haarcascades\\haarcascade_mcs_mouth.xml";void faceRecongize(cv::CascadeClassifier faceCascade, cv::CascadeClassifier eyesCascade, cv::CascadeClassifier mouthCascade, cv::Mat frame);int main(){cv::VideoCapture *videoCap = new cv::VideoCapture;cv::CascadeClassifier faceCascade;cv::CascadeClassifier eyesCascade;cv::CascadeClassifier mouthCascade;// 加载脸部分类器文件if (!faceCascade.load(face_cascade_name)) {std::cout << "load face_cascade_name failed. " << std::endl;return -1;}// 加载眼睛部分分类器文件if (!eyesCascade.load(eyes_cascade_name)) {std::cout << "load eyes_cascade_name failed. " << std::endl;return -1;}// 加载嘴部分类器文件if (!mouthCascade.load(mouth_cascade_name)) {std::cout << "load mouth_cascade_name failed. " << std::endl;return -1;}// 打开摄像机videoCap->open(0);if (!videoCap->isOpened()) {videoCap->release();std::cout << "open camera failed"<< std::endl;return -1;}std::cout << "open camera success"<< std::endl;while(1){cv::Mat frame;//读取视频帧videoCap->read(frame);if (frame.empty()) {videoCap->release();return -1;}//进行人脸识别faceRecongize(faceCascade, eyesCascade, mouthCascade, frame);//窗口进行展示imshow("face", frame);//等待回车键按下退出程序if (cv::waitKey(30) == 13) {cv::destroyAllWindows();return 0;}}system("pause");return 0;
}void faceRecongize(cv::CascadeClassifier faceCascade, cv::CascadeClassifier eyesCascade, cv::CascadeClassifier mouthCascade, cv::Mat frame) {std::vector<cv::Rect> faces;// 检测人脸faceCascade.detectMultiScale(frame, faces, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));for (int i = 0; i < faces.size(); i++) {// 用椭圆画出人脸部分cv::Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);ellipse(frame, center, cv::Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, cv::Scalar(255, 0, 255), 4, 8, 0);cv::Mat faceROI = frame(faces[i]);std::vector<cv::Rect> eyes;// 检测眼睛eyesCascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));for (int j = 0; j < eyes.size(); j++){// 用圆画出眼睛部分cv::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, cv::Scalar(255, 0, 0), 4, 8, 0);}cv::Mat mouthROI = frame(faces[i]);std::vector<cv::Rect> mouth;// 检测嘴部mouthCascade.detectMultiScale(mouthROI, mouth, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));for (int k = 0; k < mouth.size(); k++){//用长方形画出嘴部cv::Rect rect(faces[i].x + mouth[k].x, faces[i].y + mouth[k].y, mouth[k].width, mouth[k].height);rectangle(frame, rect, cv::Scalar(0, 255, 0), 2, 8, 0);}// 检测到两个眼睛和一个嘴巴, 可认为检测到有效人脸if (eyes.size() >= 2 && mouth.size() >= 1) {// 人脸上方区域写字进行标识cv::Point centerText(faces[i].x + faces[i].width / 2 - 40, faces[i].y - 20);cv::putText(frame, "face", centerText, cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 0, 255), 2);}}
}
  • CMakeLists.txt
cmake_minimum_required (VERSION 3.5)
project (faceRecongize2015)MESSAGE(STATUS "PROJECT_SOURCE_DIR " ${PROJECT_SOURCE_DIR})
SET(SRC_LISTS ${PROJECT_SOURCE_DIR}/src/main.cpp)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")# 配置头文件目录
include_directories(${PROJECT_SOURCE_DIR}/src)
include_directories("D:\\opencv\\opencv\\build\\include")
include_directories("D:\\opencv\\opencv\\build\\include\\opencv2")# 设置不显示命令框
if(MSVC)set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
endif()# 添加库文件
set(PRO_OPENCV_LIB "D:\\opencv\\opencv\\build\\x64\\vc15\\lib\\opencv_world460.lib" "D:\\opencv\\opencv\\build\\x64\\vc15\\lib\\opencv_world460.lib")IF(WIN32)# 生成可执行程序ADD_EXECUTABLE(faceRecongize2015 ${SRC_LISTS})# 链接库文件TARGET_LINK_LIBRARIES(faceRecongize2015 ${PRO_OPENCV_LIB})
ENDIF()

5 编译说明

  • 编译前先安装opencv, cmake, Visual Studio 2015

  • 我的opencv的安装目录(D:\opencv), 源码安装比较麻烦, 建议直接下载安装包进行安装。

  • opencv安装包下载

  • opencv源码下载

  • 目录结构

- src- mian.cpp
- build_x64
- CMakeLists
  • 编译命令(在build_x64目录下执行)
cmake -G "Visual Studio 14 2015 Win64" ..
cmake --build ./ --config Release
  • 说明
    • 编译成功后,将opencv\build\x64\vc15\bin下的opencv_world460.dll opencv_world460d.dll拷贝到生成的可执行程序目录下, 然后再运行程序。
    • 下载的opencv安装包中只包含了64位的库, 如果需要32位的库可下载源代码去编译。

http://chatgpt.dhexx.cn/article/Jke4O1qd.shtml

相关文章

11 OpenCV图像识别之人脸识别

文章目录 1 Eigenfaces1.1 建模流程1.2 示例代码 2 Fisherfaces2.1 建模流程2.2 示例代码 3 Local Binary Histogram3.1 建模流程3.2 示例代码 OpenCV 提供了三种人脸识别方法&#xff1a; Eigenfaces Eigenfaces是一种基于PCA&#xff08;Principal Component Analysis&#…

OpenCV人脸识别

OpenCV人脸识别与口罩检测 下载文件 人脸检测 人脸检测的检测方法主要有两类:基于知识(根据眼睛,眉毛,嘴巴,鼻子等器官特征及相互几何位置关系来检测)和基于统计(将人脸看作一个二维像素矩阵,通过大量人脸图像样本构造人脸模式空间,由相似度量判断人脸是否存在). 基于知识的…

【OpenCV】 人脸识别

目录 一&#xff1a;前言 二&#xff1a;人脸识别案例 实现步骤及完整代码 步骤1 灰度化处理 步骤2 将灰度图再次进行 行列压缩 步骤3 直方图均值化 步骤4 使用模型 对每一个像素点遍历 图像甄别 人脸识别案例 源码分享 结果测试&#xff1a;可对人脸框选识别 三&…

OpenCv人脸识别开发实战

一、OpenCV简介 OpenCV&#xff08;全称&#xff1a;Open Source Computer Vision Library&#xff09;&#xff0c;是一个跨平台的计算机视觉库。OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序。 ​ OpenCV用C语言编写&#xff0c;它的主要接口也是C语言&#…

opencv-人脸识别

人脸识别即程序对输入的图像进行判别是否有人脸&#xff0c;并识别出有人脸的图像所对应的人。即我们常说的人脸识别一般包含了人脸检测和人脸识别两部分。下面对其在opencv中的相应模块进行分别介绍。 在opencv官网中&#xff0c;有许多推荐人脸在线数据集&#xff1a;http:/…

基于opencv的人脸识别

目录 一、OpenCV的简介 1、应用场景 二、人脸识别 1、人脸识别简介 2、人脸识别系统基本组成 三、人脸识别流程 四、主要代码注释 1、人脸采集函数 2、人脸训练函数 3、人脸识别函数&#xff08;注取消语音播报识别会流畅多&#xff09; 五、功能实现 六、演示视频…

最简单体验opencv人脸识别

所需软件&#xff1a;PyCharm 所需硬件&#xff1a;一台电脑 如果没有安装PyCharm&#xff0c;csdn上面搜一下安装教程就行&#xff0c;很简单的。 打开PyCharm&#xff0c;如果没有装opencv&#xff0c;则点击最下面的terminal&#xff0c;在终端下输入pip install opencn-p…

基于opencv的人脸识别(适合初学者)

简单易懂的人脸识别&#xff0c;学不会直接跪倒&#xff01; 一、人脸识别步骤 二、直接上代码 &#xff08;1&#xff09;录入人脸.py import cv2face_name cjw # 该人脸的名字# 加载OpenCV人脸检测分类器 face_cascade cv2.CascadeClassifier("D:/BaiduNetdiskDow…

手把手教你opencv做人脸识别(附源码+文档)

文章目录 一、环境二、使用Haar级联进行人脸检测三、Haar级联结合摄像头四、使用SSD的人脸检测五、 SSD结合摄像头人脸检测六、结语 一、环境 pip install opencv-pythonpython3.9 pycharm2020 人狠话不多&#xff0c;直接上代码&#xff0c;注释在代码里面&#xff0c;不说废…

SIFT算法实现图片匹配

SIFT (Scale-Invariant Feature Transform)是David Lowe 在1999发明的一种算法。它在世界范围内&#xff0c;作为图像对齐和对象识别的参考方法。此方法的鲁棒性能够检测场景的不同比例、角度和照明的因素。silx 中可用的实现使用 OpenCL&#xff0c;这意味着它可以在图形处理单…

SIFT

SIFT features Scale Invariant Feature Transform (SIFT) is an approach for detecting and extracting local feature descriptors that are reasonably invariant to change in illumination, image noise, rotation, scaling, and small changes in viewpoint. SIFT是一…

对SIFT算法的理解,尤其是尺度不变性

SIFT算法四大块 1&#xff0c;尺度空间的建立&#xff0c;最难理解的部分&#xff0c;这一步是为了找到极值点的潜在位置 2&#xff0c;极值点精确定位&#xff0c;通过曲线拟合找到极值点的确切位置 3&#xff0c;分配主方向&#xff0c;为特征点赋予一个方向标志&#xff…

第九章三续:SIFT算法的应用--目标识别之Bag-of-words模型

SIFT算法的应用 &#xff0d;目标识别之用Bag-of-words模型表示一幅图像 作者&#xff1a;wawayu&#xff0c;July。编程艺术室出品。 出处&#xff1a;http://blog.csdn.net/v_JULY_v 。 引言 本blog之前已经写了四篇关于SIFT的文章&#xff0c;请参考九、图像特征提取与匹配…

SIFT算法简介

1、 STFT&#xff08;Scale Invariant Feature Transform&#xff09;简介 1.1 SIFT特征检测的步骤1.2 SIFT算法的特点1.3 SIFT算法可以解决的问题 2 、尺度空间 2.1 多分辨率金字塔2.2 高斯金字塔构建示例2.3 高斯尺度空间&#xff08;使用不同的参数&#xff09; 3、DoG空间极…

经典算法研究系列:九、图像特征提取与匹配之SIFT算法

经典算法研究系列&#xff1a;九、SIFT算法研究 作者:July、二零一一年二月十五日。 推荐阅读&#xff1a;David G. Lowe, "Distinctive image features from scale-invariant keypoints," International Journal of Computer Vision, 60, 2 (2004), pp. 91-110---…

SIFT算法原理详解

通过《图像局部不变性特征与描述》学习SIFT&#xff0c;遇到各种Issue&#xff0c;总结了这篇博客和另外九篇博客。感谢关注&#xff0c;希望可以互相学习&#xff0c;不断提升。转载请注明链接&#xff1a;https://www.cnblogs.com/Alliswell-WP/p/SIFT.html 如果想深入研究SI…

SIFT算法详解与代码解析

Sift算法详解及代码解析 学了SIFT也有1个半月了&#xff0c;真的是坎坷不断&#xff0c;也因为我可能接触图像邻域时间不长&#xff0c;有很多相关知识要学习&#xff0c;直至今日&#xff0c;才把SIFT大致弄明白。但还有些细节值得去深究&#xff0c;我先把我个人对SIFT算法的…

图像处理——SIFT算法

[SIFT算法原文(Distinctive Image Features from Scale-Invariant Keypoints) SIFT算法&#xff08;Scale-invariant feature transform&#xff09;&#xff0c;即尺度不变特征变换&#xff0c;由David Lowe提出&#xff0c;是一种基于局部兴趣点的算法&#xff0c;因此不仅对…

特征点匹配——SIFT算法详解

之前在学习三维重建的过程中&#xff0c;了解过SIFT算法&#xff0c;现在老师要求详细的了解SIFT算法&#xff0c;看看能不能对它进行改进&#xff0c;于是又详细的看了一遍SIFT算法。记录一下。 一、SIFT算法综述 SIFT&#xff08;Scale Invariant Feature Transform&#x…

SIFT算法之python实现

0. 算法原理细节可参考&#xff1a; https://blog.csdn.net/abcjennifer/article/details/7639681https://blog.csdn.net/zddblog/article/details/7521424?depth_1-utm_sourcedistribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_sourcedistribute.pc_re…