OpenCV小练习:人脸检测

news/2024/9/19 0:48:51/ 标签: opencv, 人脸检测

OpenCV自带人脸检测模型,拿来就能用。所以“人脸检测”这个任务对于OpenCV而言真是太简单了——感叹一下:OpenCV太强大了!相关的介绍文章在网上可以搜到很多,原本我觉得没必要再写一篇了。结果我在写练习代码的时候,还是碰到了一些新问题,值得记录一下。

人脸检测需要用到opencv_objdetect模块。我们在之前介绍OpenCV编译的时候没有用到这个模块,这次就要补充编译一下了。需要注意这几个项目的依赖关系:opencv_objdetect依赖opencv_dnn,而opencv_dnn又依赖libprotobuf。

我们先编译OpenCV自带的libprotobuf(在3rdparty目录里),结果碰到一堆莫名其妙的错误,苦恼了5分钟……

2>D:\Dev\GitHub\opencv\3rdparty\protobuf\src\google\protobuf\arena.cc(108,49): error C2511: “google::protobuf::internal::SerialArena::SerialArena(google::protobuf::internal::SerialArena::Block *,void *)”:“google::protobuf::internal::SerialArena”中没有找到重载的成员函数

2>D:\Dev\GitHub\vcpkg\installed\x64-windows\include\google/protobuf/arena_impl.h(204): message : 参见“google::protobuf::internal::SerialArena”的声明

What?! 怎么会有vcpkg?OpenCV自带了protobuf源码,何必再麻烦vcpkg。王阳明也说了,“吾性自足,不假外求。”赶紧打开libprotobuf的项目属性页,把Use Vcpkg设置成“否”。然后重新编译,顺利通过!接着在编译opencv_dnn项目时也需要做相同的调整。

libprotobuf和opencv_dnn两个项目编译通过后,接着编译opencv_objdetect,不出意外的话就能顺利通过了。然后我们就可以在OpenCVMisc项目中演练起来了。

OpenCVMisc项目设置需要做些小修改:

附加包含目录增加:

..\opencv\modules\objdetect\include

附加依赖项增加:

(Debug版本) ..\opencv\build\lib\Debug\opencv_objdetect4100d.lib

(Release版本) ..\opencv\build\lib\Release\opencv_objdetect4100.lib

并且把opencv_objdetect4100.dll和opencv_objdetect4100d.dll从OpenCV项目中拷贝到OpenCVMisc项目中。

接着,在OpenCVMiscDlg.cpp文件头上增加:

#include <opencv2/objdetect.hpp>

再编写测试代码,如下:

cv::CascadeClassifier faceClassifier;
// 加载级联分类器
if (!faceClassifier.load(".\\assets\\haarcascade_frontalface_alt.xml")) {std::cout << "Failed to load classifier." << std::endl;return;
}Mat srcImage = imread(".\\assets\\ruok.png");
if (srcImage.empty()) return;// 灰度化处理
Mat gray;
cv::cvtColor(srcImage, gray, COLOR_BGR2GRAY);// 直方图均衡化,增强对比度
cv::equalizeHist(gray, gray);std::vector<Rect> faces;
faceClassifier.detectMultiScale(gray, faces);
for each (Rect face in faces) {cv::rectangle(srcImage, face, Scalar(0, 255, 0));
}imshow("Face Detection", srcImage);

haarcascade_frontalface_alt.xml是已经训练好的人脸模型,是从OpenCV源码工程中拷贝出来的。(注:OpenCV开源项目的data目录下还有蛮多其他模型,有兴趣的话都可以试试。)上面的代码逻辑过于简单,就不解释了😂


http://www.ppmy.cn/news/1519014.html

相关文章

认识人工智能(AI,Artificial Intelligence)

人工智能(AI, Artificial Intelligence)是当今科技领域最引人注目的前沿技术之一。它的影响已渗透到各行各业,从日常生活中的虚拟助手到复杂的工业自动化系统,AI 的应用无处不在。本文将详细探讨人工智能的定义与发展历程、学习人工智能的目的、人工智能在实际生活中的应用…

MyBatis中的#{}和${}区别、ResultMap使用、MyBatis常用注解方式、MyBatis动态SQL

#{}和${}区别&#xff1a; #{}&#xff1a;是占位符&#xff0c;采用预编译的方式sql中传值&#xff0c;防止sql注入&#xff0c;如果我们往sql中列值传递一般使用 #{}。 ${}&#xff1a;采用字符串拼接的方式直接拼接到sql语句中&#xff0c;一般不用于sql列值传递&#xf…

量化投资策略与技术学习PART1.1:量化选股之再谈多因子模型(二)

在上一个多因子模型中&#xff0c;我手动对各个因子进行了回测&#xff0c;但是数据结果并不是十分理想&#xff0c;难道基本面指标真的和股票走势关系不大么&#xff1f; 这里我还是准备再测试一下&#xff0c;策略如下&#xff1a; &#xff08;1&#xff09;首先我获取了一下…

计算机学习

不要只盯着计算机语言学习&#xff0c;你现在已经学习了C语言和Java&#xff0c;暑假又规划学习Python&#xff0c;最后你掌握的就是计算机语言包而已。 2. 建议你找一门想要深挖的语言&#xff0c;沿着这个方向继续往后学习知识就行。计算机语言是学不完的&#xff0c;而未来就…

【C++20】携程库基础知识

文章目录 参考 参考 协程革命

如何识别视频里的声音转化为文字?视频转文字方法

如何识别视频里的声音转化为文字&#xff1f;识别视频声音转文字技术&#xff0c;不仅极大地提升了信息处理的效率&#xff0c;还促进了跨语言沟通和文化交流。在全球化背景下&#xff0c;它成为了连接不同语言群体的桥梁。此外&#xff0c;随着人工智能技术的不断进步&#xf…

【Python】标准库的使用

Python 通过模块来体现“库” 降低了程序猿的学习成本提高了程序的开发效率 库 就是是别人已经写好了的代码&#xff0c;可以让我们直接拿来用 荀子曰: “君子性非异也&#xff0c;善假于物也” 一个编程语言能不能流行起来&#xff0c;一方面取决于语法是否简单方便容易学习…

【2024】Datawhale AI夏令营-从零上手Mobile Agent-Task2笔记

【2024】Datawhale AI夏令营-从零上手Mobile Agent-Task2笔记 本文介绍通义实验室最新的多模态手机智能体工作——Mobile-Agent。 一、大模型智能体背景 1.1 大模型智能体的优势 随着大模型的高速发展&#xff0c;大模型智能体成为热门研究方向&#xff0c;受到工业界和学术…

手把手教你从开发进度划分测试

一.单元测试&#xff08;Unit Testing&#xff09; 单元测试&#xff1a;软件单元测试的对象是可独立编译或汇编的程序模块。测试的对象是软件测试中的最小单位&#xff1a;模块。 测试阶段&#xff1a;编码后或者编码前&#xff08;TDD&#xff1a;测试驱动开发&#xff09;…

2024.9.1 刷题总结

2024.9.1 **每日一题** 1450.在既定时间做作业的学生人数&#xff0c;这是一道简单的模拟题&#xff0c;我们只需要判断每个学生的作业时间是否包含询问时间即可&#xff0c;具体判断方法为开始时间小于等于访问时间&#xff0c;结束时间大于等于访问时间。 class Solution { …

SparkShop开源商城 uploadFile 任意文件上传漏洞复现

1 产品简介 SparkShop开源商城&#xff08;也被称为星火商城&#xff09;是一款基于ThinkPHP6和Element UI的开源免费可商用的高性能商城系统。适用于各类电商场景&#xff0c;包括但不限于B2C商城、新零售、分销商城等。无论是初创企业还是成熟品牌&#xff0c;都可以通过Spar…

Ubuntu下安装NVIDIA-SMI

环境 显卡&#xff1a;gt1030 系统&#xff1a;Ubuntu22.04 安装 1、查询显卡GeForce GT 1030 rootapq-K07-C236:/home# lspci 00:00.0 Host bridge: Intel Corporation 8th/9th Gen Core 8-core Desktop Processor Host Bridge/DRAM Registers [Coffee Lake S] (rev 0d) 0…

深入理解Java序列化:从入门到实践

在前面的学习中我们简单的学习到了对象流的使用&#xff0c;我们先来回顾一下 对象流 在Java中&#xff0c;对象流是一种特殊的输入输出流&#xff0c;用于处理对象的序列化和反序列化操作。对象流主要包括ObjectOutputStream和ObjectInputStream两个类。 ObjectOutputStrea…

10分钟了解OPPO中间件容器化实践

背景 OPPO是一家全球化的科技公司&#xff0c;随着公司的快速发展&#xff0c;业务方向越来越多&#xff0c;对中间件的依赖也越来越紧密&#xff0c;中间件的集群的数量成倍数增长&#xff0c;在中间件的部署&#xff0c;使用&#xff0c;以及运维出现各种问题。 1.中间件与业…

华为2024年秋招-结构与材料工程师-结构方向-机试题(四套)(每套四十题)

华为2024年招聘-结构与材料工程师-结构方向-机试题&#xff08;四套&#xff09;&#xff08;每套四十题&#xff09; 岗位——结构与材料工程师 岗位意向——结构 真题题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff…

【hot100篇-python刷题记录】【跳跃游戏】

R6-贪心算法 符合贪心的原因是&#xff1a; 我们要走到最后可以每次都选择尽可能远的来走&#xff0c;其次&#xff0c;能走到该步意味着该步以前都能到达。因此&#xff0c;局部最优解可以代表全局最优解。 class Solution:def canJump(self, nums: List[int]) -> bool:#最…

uniapp 封装uni.login 实现全局调用

封装utils app.vue中 使用globalData 注册 utils 页面中使用方法 定义app 调用方法

Linux 数据结构 哈希表 排序

哈希表: 哈希: 将数据通过哈希算法映射称为一个键值 存时在键值对应的位置存储 取时通过键值对应的位置查找 哈希冲突&#xff08;哈希碰撞&#xff09;&#xff1a;多个数据通过哈希算法映射成同一个键值 存储数字: 排序算法&#xff1a; 1.冒泡排…

TeamTalk消息服务器(群组相关)

具体的流程如下介绍&#xff0c;后续需要着重研究数据库相关表的结构设计。 群组信令和协议设计 enum GroupCmdID {CID_GROUP_NORMAL_LIST_REQUEST 1025,CID_GROUP_NORMAL_LIST_RESPONSE 1026,CID_GROUP_INFO_REQUEST 1027,CID_GROUP_INFO_RESPONSE 1028,// ...... 暂时省…

AWS api数据信息获取(boto3)

GitHub - starsliao/TenSunS: &#x1f984;后羿 - TenSunS(原ConsulManager)&#xff1a;基于Consul的运维平台&#xff1a;更优雅的Consul管理UI&多云与自建ECS/MySQL/Redis同步Prometheus/JumpServer&ECS/MySQL/Redis云监控指标采集&Blackbox站点监控维护&漏…