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

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目录下还有蛮多其他模型,有兴趣的话都可以试试。)上面的代码逻辑过于简单,就不解释了😂

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • [Linux]如何將A主機的docker image轉移到B主機,並在B主機中重新配置和執行該docker image?
  • C++(this指针/常函数与常对象/拷贝构造函数/赋值函数/静态成员/静态成员函数/单列模式)
  • JAVA中的元注解
  • 【nvm】解决问题: Could not retrieve https://nodejs.org/dist/index.json.
  • 学习 TagUI 踩过的坑
  • 防抖函数 debounce debouncePromise
  • 少走弯路,ESP32 读取Micro SD(TF)播放mp3的坑路历程。
  • ET6框架(七)Excel配置工具
  • 【C++标准模版库】模拟实现容器适配器:stack、queue、priority_queue(优先级队列)
  • 集成电路学习:什么是BLE低功耗蓝牙
  • [英语单词] feedback
  • 如何从零开始在 Vue 3 项目中引入 Element Plus
  • 逆波兰表达式求值
  • 安卓13 背光反向 亮度反向 android13 backlight reverse
  • ThinkPHP之入门讲解
  • 【翻译】babel对TC39装饰器草案的实现
  • 77. Combinations
  • Angularjs之国际化
  • HTML5新特性总结
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • JS学习笔记——闭包
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 安装python包到指定虚拟环境
  • 大型网站性能监测、分析与优化常见问题QA
  • 回顾2016
  • 离散点最小(凸)包围边界查找
  • 排序算法学习笔记
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 事件委托的小应用
  • 王永庆:技术创新改变教育未来
  • 无服务器化是企业 IT 架构的未来吗?
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • #Ubuntu(修改root信息)
  • (2)STM32单片机上位机
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (C语言)fread与fwrite详解
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (十一)c52学习之旅-动态数码管
  • (原)本想说脏话,奈何已放下
  • (杂交版)植物大战僵尸
  • *算法训练(leetcode)第四十天 | 647. 回文子串、516. 最长回文子序列
  • .NET Core 和 .NET Framework 中的 MEF2
  • .Net MVC4 上传大文件,并保存表单
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • [<事务专题>]
  • [10] CUDA程序性能的提升 与 流
  • [20171101]rman to destination.txt