OpenCV facedetect 人脸检测官方示例项目配置
运行程序。该程序会自动打开摄像头,识别并定位摄像头前的人脸以及眼睛部位。
输入q或者Q,退出程序。
或进行文本中所包含的图片路径 或 单个图片进行检测,自行修改代码即可
配置环境项目,debug
解决error C4996: ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead…
参考配置

确保lib,dll,头文件都配置正确


也可将dll文件添加到系统环境变量path里,便无需移动了,最简单
后续单独打包exe,再额外将exe和所需的dll放一起
导出项目模板,以后直接使用这个项目模板创建新项目




如果程序运行需要提供命令行参数,可在此处设置
等效于在cmd里面运行
OpenCV源代码在此路径查找

添加现有项,将cpp文件直接添加进来,无需再新建cpp文件了


将所需的data数据放在.cpp文件下

数据集在opencv的sources文件夹下,必需,一定要正确放置data文件,避免报错

两者的路径不一致,非必需,可自行修改选择图片,仅用于测试

修改一下代码,对默认的lema图片检测如下所示
源代码,自行添加了注释,未修改源代码
#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/videoio.hpp"
#include <iostream>using namespace std;
using namespace cv;static void help(const char **argv) {cout << "\nThis program demonstrates the use of cv::CascadeClassifier class to detect objects (Face + eyes). You can use Haar or LBP features.\n""This classifier can recognize many kinds of rigid objects, once the appropriate classifier is trained.\n""It's most known use is for faces.\n""Usage:\n"<< argv[0]<< " [--cascade=<cascade_path> this is the primary trained classifier such as frontal face]\n"" [--nested-cascade[=nested_cascade_path this an optional secondary classifier such as eyes]]\n"" [--scale=<image scale greater or equal to 1, try 1.3 for example>]\n"" [--try-flip]\n"" [filename|camera_index]\n\n""example:\n"<< argv[0]<< " --cascade=\"data/haarcascades/haarcascade_frontalface_alt.xml\" --nested-cascade=\"data/haarcascades/haarcascade_eye_tree_eyeglasses.xml\" --scale=1.3\n\n""During execution:\n\tHit any key to quit.\n""\tUsing OpenCV version " << CV_VERSION << "\n" << endl;
}void detectAndDraw(Mat &img, CascadeClassifier &cascade,CascadeClassifier &nestedCascade,double scale, bool tryflip);string cascadeName;
string nestedCascadeName;int main(int argc, const char **argv) {VideoCapture capture;Mat frame, image;string inputName;bool tryflip;CascadeClassifier cascade, nestedCascade;double scale;cv::CommandLineParser parser(argc, argv,"{help h||}""{cascade|data/haarcascades/haarcascade_frontalface_alt.xml|}""{nested-cascade|data/haarcascades/haarcascade_eye_tree_eyeglasses.xml|}""{scale|1|}{try-flip||}{@filename||}");if (parser.has("help")) {help(argv);return 0;}cascadeName = parser.get<string>("cascade");nestedCascadeName = parser.get<string>("nested-cascade");scale = parser.get<double>("scale");if (scale < 1)scale = 1;tryflip = parser.has("try-flip");inputName = parser.get<string>("@filename");if (!parser.check()) {parser.printErrors();return 0;}if (!nestedCascade.load(samples::findFileOrKeep(nestedCascadeName)))cerr << "WARNING: Could not load classifier cascade for nested objects" << endl;if (!cascade.load(samples::findFile(cascadeName))) {cerr << "ERROR: Could not load classifier cascade" << endl;help(argv);return -1;}//如果 inputName 为空或是一个单个数字字符,则尝试打开对应索引的摄像头。if (inputName.empty() || (isdigit(inputName[0]) && inputName.size() == 1)) {//奥比中光的gemini 2接入,1可以使用,0和2无法使用,3则是笔记本内置摄像头//不接入设备,0是笔记本内置摄像头//如果 inputName 为空,则默认使用摄像头0;否则,将 inputName 的第一个字符转换为整数作为摄像头索引。int camera = inputName.empty() ? 0 : inputName[0] - '0';if (!capture.open(camera)) {cout << "Capture from camera #" << camera << " didn't work" << endl;return 1;}} else if (!inputName.empty()) {//如果 inputName 不为空且不是一个单个数字字符,则尝试读取指定的图像文件。image = imread(samples::findFileOrKeep(inputName), IMREAD_COLOR);if (image.empty()) {if (!capture.open(samples::findFileOrKeep(inputName))) {cout << "Could not read " << inputName << endl;return 1;}}} else {//读取默认的图像文件 lena.jpg。image = imread(samples::findFile("lena.jpg"), IMREAD_COLOR);if (image.empty()) {cout << "Couldn't read lena.jpg" << endl;return 1;}}if (capture.isOpened()) {cout << "Video capturing has been started ..." << endl;/*从视频捕获设备读取帧。对每一帧进行人脸和眼睛的检测。在图像上绘制检测结果。持续运行,直到帧为空或用户按下退出键。(Esc、'q'或'Q')*/for (;;) {capture >> frame;if (frame.empty())break;Mat frame1 = frame.clone();detectAndDraw(frame1, cascade, nestedCascade, scale, tryflip);char c = (char)waitKey(10);if (c == 27 || c == 'q' || c == 'Q')break;}} else {cout << "Detecting face(s) in " << inputName << endl;if (!image.empty()) {detectAndDraw(image, cascade, nestedCascade, scale, tryflip);waitKey(0);} else if (!inputName.empty()) {/* assume it is a text file containing thelist of the image filenames to be processed - one per line *///如果已经加载了单张图像,则直接进行人脸检测并等待用户按键。//如果输入是一个包含图像文件列表的文本文件,则逐行读取文件内容,尝试读取每行指定的图像文件,并进行人脸检测。如果读取失败,则输出错误信息。//在检测每张图像后,等待用户按键,如果用户按下特定键(Esc、'q'或'Q'),则退出处理流程。FILE *f = fopen(inputName.c_str(), "rt");if (f) {char buf[1000 + 1];while (fgets(buf, 1000, f)) {//计算字符串buf的长度,然后从字符串末尾向前遍历,直到遇到非空白字符为止。最后,将字符串的结束符\0放在最后一个非空白字符之后,从而去除了行尾的空白字符。int len = (int)strlen(buf);while (len > 0 && isspace(buf[len - 1]))len--;buf[len] = '\0';cout << "file " << buf << endl;image = imread(buf, IMREAD_COLOR);if (!image.empty()) {detectAndDraw(image, cascade, nestedCascade, scale, tryflip);char c = (char)waitKey(0);if (c == 27 || c == 'q' || c == 'Q')break;} else {cerr << "Aw snap, couldn't read image " << buf << endl;}}fclose(f);}}}return 0;
}void detectAndDraw(Mat &img, CascadeClassifier &cascade,CascadeClassifier &nestedCascade,double scale, bool tryflip) {/*t:用于计时。faces 和 faces2:存储检测到的人脸矩形区域。colors:用于绘制检测结果的颜色数组。gray 和 smallImg:用于存储灰度图像和缩放后的图像。*/double t = 0;vector<Rect> faces, faces2;const static Scalar colors[] ={Scalar(255,0,0),Scalar(255,128,0),Scalar(255,255,0),Scalar(0,255,0),Scalar(0,128,255),Scalar(0,255,255),Scalar(0,0,255),Scalar(255,0,255)};Mat gray, smallImg;/*将输入图像转换为灰度图像。计算缩放比例 fx。将灰度图像缩放到指定比例。对缩放后的图像进行直方图均衡化,以提高对比度。*/cvtColor(img, gray, COLOR_BGR2GRAY);double fx = 1 / scale;resize(gray, smallImg, Size(), fx, fx, INTER_LINEAR_EXACT);equalizeHist(smallImg, smallImg);//记录检测开始时间。// 使用主分类器 cascade 检测人脸,结果存储在 faces 中。// 如果 tryflip 为真,则翻转图像并再次检测人脸,结果存储在 faces2 中,并将 faces2 中的结果转换为原始图像坐标系后添加到 faces 中。// 计算并输出检测时间。t = (double)getTickCount();cascade.detectMultiScale(smallImg, faces,1.1, 2, 0//|CASCADE_FIND_BIGGEST_OBJECT//|CASCADE_DO_ROUGH_SEARCH| CASCADE_SCALE_IMAGE,Size(30, 30));if (tryflip) {flip(smallImg, smallImg, 1);cascade.detectMultiScale(smallImg, faces2,1.1, 2, 0//|CASCADE_FIND_BIGGEST_OBJECT//|CASCADE_DO_ROUGH_SEARCH| CASCADE_SCALE_IMAGE,Size(30, 30));for (vector<Rect>::const_iterator r = faces2.begin(); r != faces2.end(); ++r) {faces.push_back(Rect(smallImg.cols - r->x - r->width, r->y, r->width, r->height));}}t = (double)getTickCount() - t;printf("detection time = %g ms\n", t * 1000 / getTickFrequency());/*遍历检测到的人脸区域。计算人脸区域的宽高比,如果宽高比在合理范围内,则绘制圆形标记;否则绘制矩形标记。如果嵌套分类器不为空,则使用嵌套分类器检测眼睛,并在检测到的眼睛位置绘制圆形标记。显示检测结果图像。*/for (size_t i = 0; i < faces.size(); i++) {Rect r = faces[i];Mat smallImgROI;vector<Rect> nestedObjects;Point center;Scalar color = colors[i % 8];int radius;double aspect_ratio = (double)r.width / r.height;if (0.75 < aspect_ratio && aspect_ratio < 1.3) {center.x = cvRound((r.x + r.width * 0.5) * scale);center.y = cvRound((r.y + r.height * 0.5) * scale);radius = cvRound((r.width + r.height) * 0.25 * scale);circle(img, center, radius, color, 3, 8, 0);} elserectangle(img, Point(cvRound(r.x * scale), cvRound(r.y * scale)),Point(cvRound((r.x + r.width - 1) * scale), cvRound((r.y + r.height - 1) * scale)),color, 3, 8, 0);if (nestedCascade.empty())continue;smallImgROI = smallImg(r);nestedCascade.detectMultiScale(smallImgROI, nestedObjects,1.1, 2, 0//|CASCADE_FIND_BIGGEST_OBJECT//|CASCADE_DO_ROUGH_SEARCH//|CASCADE_DO_CANNY_PRUNING| CASCADE_SCALE_IMAGE,Size(30, 30));for (size_t j = 0; j < nestedObjects.size(); j++) {Rect nr = nestedObjects[j];center.x = cvRound((r.x + nr.x + nr.width * 0.5) * scale);center.y = cvRound((r.y + nr.y + nr.height * 0.5) * scale);radius = cvRound((nr.width + nr.height) * 0.25 * scale);circle(img, center, radius, color, 3, 8, 0);}}imshow("result", img);
}相关文章:
OpenCV facedetect 人脸检测官方示例项目配置
运行程序。该程序会自动打开摄像头,识别并定位摄像头前的人脸以及眼睛部位。 输入q或者Q,退出程序。 或进行文本中所包含的图片路径 或 单个图片进行检测,自行修改代码即可 配置环境项目,debug 解决error C4996: ‘fopen’: This…...
自定义Laravel Artisan风格:打造个性化命令行体验
自定义Laravel Artisan风格:打造个性化命令行体验 引言 Laravel的Artisan命令行工具是开发过程中不可或缺的一部分,它提供了一个强大的接口来执行各种开发、维护、测试等任务。除了执行命令,Artisan还允许开发者自定义命令行输出的风格&…...
CTF之网站被黑
简单看一下网页和源码没发现什么明显漏洞 那就扫描一下目录 发现了/shell.php文件,访问一下,发现是一个后台管理登录页面 别无他法只能爆破喽,爆破后发现密码是hack flag{25891d9e9d377f006eda3ca7d4c34c4d}...
Electron学习笔记(一)基础环境
目录 前言 基础环境准备 安装 Node.js 配置项目文件 通过代理服务安装 通过国内仓库安装 一些常见问题: 前言 一个新手学习Electron的笔记,记录为主,仅供参考。 其他文章见专栏目录。 基础环境准备 开发之前先将基础环境搭建好。 …...
【C语言】栈的实现(数据结构)
前言: 还是举一个生活中的例子,大家都玩过积木,当我们把积木叠起来的时候,如果要拿到最底部的积木,我们必须从顶端一个一个打出,最后才能拿到底部的积木,也就是后进先出(先进后出&a…...
前端三大主流框架对比
在现代前端开发中,React、Vue和Angular是三大流行的框架/库。它们各自有独特的优缺点,适用于不同的开发需求和项目规模。下面是对这三者的详细比较: 一、 React 简介: 由Facebook开发和维护,是一个用于构建用户界面…...
AOP~面向切面编程介绍
AOP基础 概述 AOP:Aspect Oriented Programming(面向切面编程、面向方面编程),面向特定方法的编程。 动态代理是面向切面编程最主流的实现。 SpringAOP是Spring框架的高级技术,旨在管理bean对象的过程中,…...
Android SurfaceFlinger——GraphicBuffer的提交(三十三)
在 SurfaceFlinger 中,我们 dequeueBuffer 和 queueBuffer 是 Surface 控制接口中非常重要的两个函数,分别用于从 Surface 的 BufferQueue 中取出缓冲区和向 BufferQueue 提交(队列)缓冲区。这两个函数在生产者和消费者模型中扮演着核心角色,确保了图像数据的高效和有序传…...
创维汽车滁州永通体验中心开业仪式暨超充车型区域上市会圆满成功
2024年7月20日,创维汽车滁州永通体验中心盛大开业,当日,创维汽车市场部经理周世鹏、安徽大区总监王大明等领导参加本次开业盛典,共同见证创维汽车滁州永通体验中心成功落地。 2021年,新能源乘用车高速发展,…...
【PHP】系统的登录和注册
一、为什么要学习系统的登录和注册 系统的登录和注册可能存在多种漏洞,这些漏洞可能被恶意攻击者利用,从而对用户的安全和隐私构成威胁。通过学习系统的登录和注册理解整个登录和注册的逻辑方便后续更好站在开发的角度思考问题发现漏洞。以下是一些常见…...
2024.7.29 刷题总结
2024.7.29 **每日一题** 682.棒球比赛,这道题是一道简单的模拟题,用栈模拟题中的四个操作就可以了,操作一是将x加到列表末尾,操作二是将列表的后两项之和加到列表末尾,操作三是把列表最后一项的两倍加到列表末尾&#…...
WebSocket程序设计
协议说明 WebSocket 是一种在单个TCP连接上进行全双工通信的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。Websocket主要用在B/S架构的应用程序中,在 WebSocket API 中,浏览器和服务器只…...
ES(ElasticSearch)倒排索引
目录 正排与倒排索引 1.正排索引 作用: 优点: 缺点: 2.倒排索引 原理: 倒排索引的构建流程: 倒排索引的搜索流程: 优点: 缺点: 3. 应用场景 倒排索引中有几个非常重要的概念…...
Android Studio Build窗口出现中文乱码问题
刚安装成功的android studio软件打开工程,编译时下方build窗口中中文是乱码。 解决: 可点击studio状态栏的Help—>Edit Custom VM Options ,在打开的studio64.exe.vmoptions文件后面添加:(要注意不能有空格,否则st…...
java生成随机数
代码 startValue 开始值 endValue 结束值 per生成的位数也就是精度 /*** 随机数的生成* param startValue* param endValue* return*/private BigDecimal randomBigDecimal(String startValue, String endValue,int per) {BigDecimal min new BigDecimal(startValue);BigDeci…...
动态定制深度学习:Mojo模型与自定义训练算法的无缝切换
动态定制深度学习:Mojo模型与自定义训练算法的无缝切换 引言 在机器学习领域,算法的选择对模型的性能有着决定性的影响。随着研究的深入和技术的发展,开发者可能需要根据不同的数据特性和业务需求,动态地切换或自定义训练算法。…...
昇思25天学习打卡营第19天|DCGAN生成漫画头像
DCGAN生成漫画头像总结 实验概述 本实验旨在利用深度卷积生成对抗网络(DCGAN)生成动漫头像,通过设置网络、优化器以及损失函数,使用MindSpore进行实现。 实验目的 学习和掌握DCGAN的基本原理和应用。熟悉使用MindSpore进行图像…...
排序题目:按照频率将数组升序排序
文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题:按照频率将数组升序排序 出处:1636. 按照频率将数组升序排序 难度 3 级 题目描述 要求 给定一个整数数组 nums \texttt{nums} nums&a…...
实分析与测度论问题的分类
实分析主要研究实数、实数序列、实数极限以及实值函数的分析,而度量空间则是一个具有距离函数的集合,其分类可以从多个角度进行。 实分析 实分析主要关注实数、实数序列、实数极限以及实值函数的分析。它涉及到多个重要的概念和理论,包括但…...
动态代理更改Java方法的返回参数(可用于优化feign调用后R对象的统一处理)
动态代理更改Java方法的返回参数(可用于优化feign调用后R对象的统一处理) 需求原始解决方案优化后方案1.首先创建AfterInterface.java2.创建InvocationHandler处理代理方法3. 调用 实际运行场景拓展 需求 某些场景,调用别人的方法࿰…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果,那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
