Qt快速入门(Opencv小案例之人脸识别)

Qt快速入门(Opencv小案例之人脸识别)

编译出错记录

背景

因为主要使用qt,并且官网下载的win版本的编译好的opencv默认是vc的,所以我们需要自己下载opencv的源码使用mingw自行编译,我直接使用的vscode。

报错

报错如下:

Fatal error: can't write 9 bytes to section ... file too big

参考github上opencv项目的issue,解决方案如下:

先按常规动作编译一下,然后在生成的build目录中,向cmake的中间文件:CMakeFiles\3.27.2-msvc1\CMakeCXXCompiler.cmake文件(其中3.27.2-msvc1目录名可能会有所不同,找同样带数字的就可以了)追加一行cmake代码:

set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} “-O3”)

错误即可解除。

安装

找了很久通过vscode按钮自定义安装路径的方法,没有找到。。。

于是还是顺从使用linux的习惯,使用终端通过命令进行编译OpenCV命令如下:

mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=D:/DevelopmentToolRoot/Library/OpenCV ..
# 更改cmake生成的cmake中间文件,防止报错
# 添加内容:set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-O3")
...
make -j4 && make install

cmake的-DCMAKE_INSTALL_PREFIX选项也是查了很久,最开始是在生成的makefile发现生成的make install的实现如下:

# Special rule for the target install
install: preinstall@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..."D:\DevelopmentToolRoot\Complier\VS2022\Root\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe -P cmake_install.cmake
.PHONY : install

显然,执行安装时会执行cmake_install.cmake文件,通过查看文件中的内容发现真正影响安装路径的是CMAKE_INSTALL_PREFIX,然后继续反向查找,在项目CMakeLists.txt文件中发现,有段判断CMAKE_INSTALL_PREFIX是否初始化的代码:

if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)  # https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT.htmlif(NOT CMAKE_TOOLCHAIN_FILE)if(WIN32)set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Installation Directory" FORCE)else()set(CMAKE_INSTALL_PREFIX "/usr/local" CACHE PATH "Installation Directory" FORCE)endif()else()# any cross-compilingset(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Installation Directory" FORCE)endif()
endif()

可见,如果在使用cmake时用户没有设置CMAKE_INSTALL_PREFIX,系统会默认安装路径为build/install目录下。

注意添加环境变量。

如果在qt中使用opencv的时候有报错:无法定位程序入口点…。

试着将mingw/bin目录下的libstdc+±6动态库复制到C:\Windows\System32下。

如果还报错,直接在网上找别人编译好的库吧,自己编译太麻烦了,也没有必要浪费时间。推荐直接下载的链接:https://github.com/huihut/OpenCV-MinGW-Build?tab=readme-ov-file。

QT + Opencv图片人脸识别小demo

  1. QT.pro文件添加opencv的include文件和静态库文件的配置,如下:

    INCLUDEPATH += D:\DevelopmentToolRoot\Library\OpenCV\OpenCV-MinGW-Build-OpenCV-3.4.8-x64\OpenCV-MinGW-Build-OpenCV-3.4.8-x64\include
    LIBS += D:\DevelopmentToolRoot\Library\OpenCV\OpenCV-MinGW-Build-OpenCV-3.4.8-x64\OpenCV-MinGW-Build-OpenCV-3.4.8-x64\x64\mingw\lib\libopencv_*.a
    

    具体路径和你opencv安装路径有关,相对路径是:OpenCV\include、OpenCV\x64\mingw\lib\libopencv_*.a。

  2. 另外还需要,将OpenCV\etc下的haarcascade_eye_tree_eyeglasses.xml和haarcascade_frontalface_alt.xml文件拷贝到qt工程目录的根目录下。

QT代码如下:

// ...
#include <opencv2/opencv.hpp>
using namespace cv;class FaceDialog : public QDialog
{Q_OBJECTpublic:FaceDialog(QWidget *parent = nullptr);~FaceDialog();private slots:void on_m_btnRecognize_clicked();private:Ui::FaceDialog *ui;Mat m_image;
};FaceDialog::FaceDialog(QWidget *parent): QDialog(parent), ui(new Ui::FaceDialog)
{ui->setupUi(this);cvtColor(imread(QString("C:/Users/root/Desktop/Face/tahiti.jpg").toLatin1().data()),m_image, COLOR_BGR2RGB);ui->m_labImage->resize(m_image.cols / 2, m_image.rows / 2);setWindowFlag(Qt::MSWindowsFixedSizeDialogHint);ui->m_labImage->setPixmap(QPixmap::fromImage(QImage(m_image.data, m_image.cols, m_image.rows,QImage::Format_RGB888).scaled(ui->m_labImage->size(),Qt::KeepAspectRatio)));
}FaceDialog::~FaceDialog()
{delete ui;
}void FaceDialog::on_m_btnRecognize_clicked()
{// 人脸分类器CascadeClassifier faceClassifier;faceClassifier.load("C:/Users/root/Desktop/Face/haarcascade_frontalface_alt.xml");// 眼睛分类器CascadeClassifier eyesClassifier;eyesClassifier.load("C:/Users/root/Desktop/Face/haarcascade_eye_tree_eyeglasses.xml");// 灰度图Mat gray;cvtColor(m_image, gray, COLOR_RGB2GRAY);equalizeHist(gray, gray); // 直方图均衡化亮度增强Mat canvas = m_image.clone(); // 用于输出识别结果的图像vector<Rect> faces; // 存放多张人脸矩形的向量faceClassifier.detectMultiScale(gray, faces); // 人脸识别for (Rect const& face : faces) // 遍历每一张人脸的包络矩形{// 绘制人脸包络矩形的内切椭圆// 第三个参数表示椭圆长半轴和短半轴ellipse(canvas,Point(face.x + face.width / 2,face.y + face.height / 2),Size(face.width / 2, face.height / 2),0, 0, 360, Scalar(0, 255, 0), 6, 8, 0);vector<Rect> eyes; // 存放多只眼睛矩形的向量eyesClassifier.detectMultiScale(gray(face), eyes); // 眼睛识别for (Rect const& eye : eyes) // 遍历每一只眼睛的包络矩形// 绘制眼睛包络矩形的内切椭圆ellipse(canvas,Point(face.x + eye.x + eye.width / 2,face.y + eye.y + eye.height / 2),Size(eye.width / 2, eye.height / 2),0, 0, 360, Scalar(0, 255, 0), 6, 8, 0);}ui->m_labImage->setPixmap(QPixmap::fromImage(QImage(canvas.data, canvas.cols, canvas.rows,QImage::Format_RGB888).scaled(ui->m_labImage->size(),Qt::KeepAspectRatio)));
}

程序结果如下:

输入图片:

在这里插入图片描述

输出图片:

在这里插入图片描述


本章完结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/815586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaWeb】Day43.MySQL概述——索引

介绍 索引(index)&#xff1a;是帮助数据库高效获取数据的数据结构 。简单来讲&#xff0c;就是使用索引可以提高查询的效率。 优点&#xff1a; 1. 提高数据查询的效率&#xff0c;降低数据库的IO成本。 2. 通过索引列对数据进行排序&#xff0c;降低数据排序的成本&#…

C++系列-C++前言

什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序&#xff0c;对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适&#xff0c;为了解决软件危机&#xff0c;20世纪80年代&#xff0c;计算机界提出…

Ant Design Vue Table 自定义渲染与自定义单元格

自定义渲染 自定义渲染主要通过customRender属性来实现&#xff0c;它允许你针对特定的列定义自己的渲染逻辑。通常情况下&#xff0c;你需要提供一个函数&#xff0c;这个函数会接收三个参数&#xff1a;text&#xff08;待渲染的文本&#xff09;、record&#xff08;整行数…

Python 编程 深入了解内存管理机制、深拷贝与浅拷贝

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、对象和引用、内存管理机制 Python 中的一切都是对象&#xff0c;包括数字、字符串、列表和函数等。为了简化内存管理并提高效率&#xff0c;Python 采用了统一的对象模型。在这个模型中&#xff0c…

【考研数学】看张宇的书,高效自学攻略

张宇老师的课程&#xff0c;我建议还是认真听一下 因为张宇老师视频课并不是照本宣科的读讲义&#xff0c;他是真的有自己的教学方法 讲义上的概念&#xff0c;老师自己会在A4纸上带大家过一遍&#xff0c;并且遇到关键的知识点&#xff0c;老师会强调 张宇老师还会帮我们记…

C语言入门算法——车站

题目描述&#xff1a; 火车从始发站&#xff08;称为第 1 站&#xff09;开出&#xff0c;在始发站上车的人数为 a&#xff0c;然后到达第 2 站&#xff0c;在第 2 站有人上、下车&#xff0c;但上、下车的人数相同&#xff0c;因此在第 2 站开出时&#xff08;即在到达第 3 站…

[C语言][数据结构][链表] 双链表的从零实现!

目录 零.必备知识 0.1 一级指针 && 二级指针 0.2 双链表节点的成员列表 a. 数据 b. 后驱指针 c. 前驱指针 0.3 动态内存空间的开辟 一. 双链表的实现与销毁 1.1 节点的定义 1.2 双向链表的初始化 && 创建新节点 1.3 尾插 1.4 头插 1.5 尾删 1.6 头删 1…

MySQL8.0.36-社区版:错误日志(2)

mysql有个错误日志&#xff0c;是专门记录错误信息的&#xff0c;这个功能默认是开启的 一般都是在/var/log/mysqld.log 日志中存放 1.错误日志的位置 首先我们使用命令去查看一下&#xff0c;这个错误日志文件究竟在哪 进入到mysql中&#xff0c;使用命令 show variables…

题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

题目&#xff1a;输入数组&#xff0c;最大的与第一个元素交换&#xff0c;最小的与最后一个元素交换&#xff0c;输出数组。 There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog conte…

二叉树遍历(前序创建|中序遍历)

牛客题目链接 目录 1.解题思路 1.1中序遍历打印 ​1.2前序创建二叉树 1.3注意点 博主这里用的是java实现 随手记一个知识: hasNext读取到空格或者换行符会结束 hasNextLine读取到换行符才会结束&#xff08;空格不会退出&#xff09; 为什么要强调这个呢&#xff1f; …

Vivado Design Suite中的增量实现和增量模式

Vivado Incremental&#xff08;增量&#xff09;是Xilinx FPGA设计工具中的一种功能&#xff0c;它允许对设计的一部分进行修改和重新编译&#xff0c;而不需要对整个设计进行重新编译。这种增量式的方法可以显著减少编译时间&#xff0c;特别是在进行小的修改或迭代开发时。 …

std::stringstream

std::stringstream 是 C 标准库中的一个类&#xff0c;用于对字符串进行输入输出操作&#xff0c;类似于文件流&#xff08;std::ifstream 和 std::ofstream&#xff09;。它允许你像使用 std::cin 和 std::cout 一样使用字符串。 std::stringstream 可以将字符串作为输入源&am…

ThreadPoolExecutor线程池解析

ThreadPoolExecutor线程池解析 一、ThreadPoolExecutor常见参数 jdk中Executors提供了几种常用的线程池&#xff0c;底层都是ThreadPoolExecutor。 public ThreadPoolExecutor(int corePoolSize,//核心线程数int maximumPoolSize,// 最大线程数long keepAliveTime,//非核心线程…

大数据产品有哪些分类?各类里知名大数据产品都有哪些?

随着互联网技术的持续进步和全球数字化转型的推进&#xff0c;我们正处于一个数据爆炸的时代。在这样的大背景下&#xff0c;大数据已经逐渐崭露头角&#xff0c;成为了推动各行各业发展的关键因素和核心资源。大数据不仅仅是指数据的规模巨大&#xff0c;更重要的是它蕴含的价…

安卓手机APP开发的媒体内容部分__重中之重的内容变现渠道___插入广告

安卓手机APP开发的媒体内容部分__重中之重的内容变现渠道___插入广告 目录 客户端的插入广告 声明式的广告的支持 有广告的播放列表 ExoPlayer IMA库 用户界面上的考虑 伴随广告 独立广告 使用第三方的广告SDK 服务器端的插入广告 ExoPlayer IMA库 用户界面上的考虑…

spring-aop的使用(注解 +配置类的方式)(多个增强类的优先级问题)

spring-aop 首先&#xff0c;准备一个接口以及其实现类 Calculator接口&#xff1a;src/main/java/com.atguigu.service/Calculator接口 package com.atguigu.service;public interface Calculator {int add(int i, int j);int sub(int i, int j);int mul(int i, int j);int…

docker 容器指定utf-8编码

在运行 Docker 容器的时候&#xff0c;如果容器内应用需要使用 UTF-8 编码来正常处理中文&#xff0c;你可以通过设置环境变量来指定编码。 可以使用 -e 或者 --env 标志来设置环境变量。比如&#xff0c;设置 LANG 和 LC_ALL 环境变量为 C.UTF-8 或者 en_US.UTF-8&#xff1a…

量子信息产业生态研究(一):关于《量子技术公司营销指南(2023)》的讨论

写在前面。量子行业媒体量子内参&#xff08;Quantum Insider&#xff09;编制的《量子技术公司营销指南》是一本实用的英文手册&#xff0c;它旨在帮助量子科技公司建立有效的营销策略&#xff0c;同时了解如何将自己定位成各自的行业专家。本文对这篇指南的主要内容进行了翻译…

ubuntu上安装截图工具-Flameshot及其使用步骤说明

Flameshot 火焰截图-推荐 安装命令&#xff1a; sudo apt install flameshot 操作方式&#xff1a; 1&#xff09;打开 2&#xff09;右上角弹窗 3&#xff09;点击后弹出 选择进行截图 4&#xff09;截图后再选择分享 5&#xff09;再重新选择区域&#xff0c;出现编辑…

【蓝桥杯】2024年第15届真题题目

试题 A: 握手问题 本题总分&#xff1a; 5 分 【问题描述】 小蓝组织了一场算法交流会议&#xff0c;总共有 50 人参加了本次会议。在会议上&#xff0c; 大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进 行一次握手&#xff08;且仅有一次&a…