当前位置: 首页 > news >正文

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 人脸检测官方示例项目配置

运行程序。该程序会自动打开摄像头&#xff0c;识别并定位摄像头前的人脸以及眼睛部位。 输入q或者Q&#xff0c;退出程序。 或进行文本中所包含的图片路径 或 单个图片进行检测&#xff0c;自行修改代码即可 配置环境项目&#xff0c;debug 解决error C4996: ‘fopen’: This…...

自定义Laravel Artisan风格:打造个性化命令行体验

自定义Laravel Artisan风格&#xff1a;打造个性化命令行体验 引言 Laravel的Artisan命令行工具是开发过程中不可或缺的一部分&#xff0c;它提供了一个强大的接口来执行各种开发、维护、测试等任务。除了执行命令&#xff0c;Artisan还允许开发者自定义命令行输出的风格&…...

CTF之网站被黑

简单看一下网页和源码没发现什么明显漏洞 那就扫描一下目录 发现了/shell.php文件&#xff0c;访问一下&#xff0c;发现是一个后台管理登录页面 别无他法只能爆破喽&#xff0c;爆破后发现密码是hack flag{25891d9e9d377f006eda3ca7d4c34c4d}...

Electron学习笔记(一)基础环境

目录 前言 基础环境准备 安装 Node.js 配置项目文件 通过代理服务安装 通过国内仓库安装 一些常见问题&#xff1a; 前言 一个新手学习Electron的笔记&#xff0c;记录为主&#xff0c;仅供参考。 其他文章见专栏目录。 基础环境准备 开发之前先将基础环境搭建好。 …...

【C语言】栈的实现(数据结构)

前言&#xff1a; 还是举一个生活中的例子&#xff0c;大家都玩过积木&#xff0c;当我们把积木叠起来的时候&#xff0c;如果要拿到最底部的积木&#xff0c;我们必须从顶端一个一个打出&#xff0c;最后才能拿到底部的积木&#xff0c;也就是后进先出&#xff08;先进后出&a…...

前端三大主流框架对比

在现代前端开发中&#xff0c;React、Vue和Angular是三大流行的框架/库。它们各自有独特的优缺点&#xff0c;适用于不同的开发需求和项目规模。下面是对这三者的详细比较&#xff1a; 一、 React 简介&#xff1a; 由Facebook开发和维护&#xff0c;是一个用于构建用户界面…...

AOP~面向切面编程介绍

AOP基础 概述 AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程、面向方面编程&#xff09;&#xff0c;面向特定方法的编程。 动态代理是面向切面编程最主流的实现。 SpringAOP是Spring框架的高级技术&#xff0c;旨在管理bean对象的过程中&#xff0c…...

Android SurfaceFlinger——GraphicBuffer的提交(三十三)

在 SurfaceFlinger 中,我们 dequeueBuffer 和 queueBuffer 是 Surface 控制接口中非常重要的两个函数,分别用于从 Surface 的 BufferQueue 中取出缓冲区和向 BufferQueue 提交(队列)缓冲区。这两个函数在生产者和消费者模型中扮演着核心角色,确保了图像数据的高效和有序传…...

创维汽车滁州永通体验中心开业仪式暨超充车型区域上市会圆满成功

2024年7月20日&#xff0c;创维汽车滁州永通体验中心盛大开业&#xff0c;当日&#xff0c;创维汽车市场部经理周世鹏、安徽大区总监王大明等领导参加本次开业盛典&#xff0c;共同见证创维汽车滁州永通体验中心成功落地。 2021年&#xff0c;新能源乘用车高速发展&#xff0c;…...

【PHP】系统的登录和注册

一、为什么要学习系统的登录和注册 系统的登录和注册可能存在多种漏洞&#xff0c;这些漏洞可能被恶意攻击者利用&#xff0c;从而对用户的安全和隐私构成威胁。通过学习系统的登录和注册理解整个登录和注册的逻辑方便后续更好站在开发的角度思考问题发现漏洞。以下是一些常见…...

2024.7.29 刷题总结

2024.7.29 **每日一题** 682.棒球比赛&#xff0c;这道题是一道简单的模拟题&#xff0c;用栈模拟题中的四个操作就可以了&#xff0c;操作一是将x加到列表末尾&#xff0c;操作二是将列表的后两项之和加到列表末尾&#xff0c;操作三是把列表最后一项的两倍加到列表末尾&#…...

WebSocket程序设计

协议说明 WebSocket 是一种在单个TCP连接上进行全双工通信的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。Websocket主要用在B/S架构的应用程序中&#xff0c;在 WebSocket API 中&#xff0c;浏览器和服务器只…...

ES(ElasticSearch)倒排索引

目录 正排与倒排索引 1.正排索引 作用&#xff1a; 优点&#xff1a; 缺点&#xff1a; 2.倒排索引 原理&#xff1a; 倒排索引的构建流程&#xff1a; 倒排索引的搜索流程&#xff1a; 优点&#xff1a; 缺点&#xff1a; 3. 应用场景 倒排索引中有几个非常重要的概念…...

Android Studio Build窗口出现中文乱码问题

刚安装成功的android studio软件打开工程&#xff0c;编译时下方build窗口中中文是乱码。 解决&#xff1a; 可点击studio状态栏的Help—>Edit Custom VM Options &#xff0c;在打开的studio64.exe.vmoptions文件后面添加&#xff1a;(要注意不能有空格&#xff0c;否则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模型与自定义训练算法的无缝切换

动态定制深度学习&#xff1a;Mojo模型与自定义训练算法的无缝切换 引言 在机器学习领域&#xff0c;算法的选择对模型的性能有着决定性的影响。随着研究的深入和技术的发展&#xff0c;开发者可能需要根据不同的数据特性和业务需求&#xff0c;动态地切换或自定义训练算法。…...

昇思25天学习打卡营第19天|DCGAN生成漫画头像

DCGAN生成漫画头像总结 实验概述 本实验旨在利用深度卷积生成对抗网络&#xff08;DCGAN&#xff09;生成动漫头像&#xff0c;通过设置网络、优化器以及损失函数&#xff0c;使用MindSpore进行实现。 实验目的 学习和掌握DCGAN的基本原理和应用。熟悉使用MindSpore进行图像…...

排序题目:按照频率将数组升序排序

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;按照频率将数组升序排序 出处&#xff1a;1636. 按照频率将数组升序排序 难度 3 级 题目描述 要求 给定一个整数数组 nums \texttt{nums} nums&a…...

实分析与测度论问题的分类

实分析主要研究实数、实数序列、实数极限以及实值函数的分析&#xff0c;而度量空间则是一个具有距离函数的集合&#xff0c;其分类可以从多个角度进行。 实分析 实分析主要关注实数、实数序列、实数极限以及实值函数的分析。它涉及到多个重要的概念和理论&#xff0c;包括但…...

动态代理更改Java方法的返回参数(可用于优化feign调用后R对象的统一处理)

动态代理更改Java方法的返回参数&#xff08;可用于优化feign调用后R对象的统一处理&#xff09; 需求原始解决方案优化后方案1.首先创建AfterInterface.java2.创建InvocationHandler处理代理方法3. 调用 实际运行场景拓展 需求 某些场景&#xff0c;调用别人的方法&#xff0…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...