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

news/2025/2/21 7:11:54/

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.ppmy.cn/news/1418703.html

相关文章

redis的设计与实现(五)——独立功能

1. Redis的其他功能 redis 除了简单对对象的增删改查的功能之外&#xff0c;其实还有其他高级功能&#xff0c;了解这些内容有利于我们更灵活的使用 redis 完成我们的业务功能。 2. 发布与订阅 2.1. 基本概念 很多中间件都有发布与订阅功能&#xff0c;但是&#xff0c;作为一…

php-redis windows ,pecl 已经不维护了,解决方案:php 8.2 | 8.3+ redis extension windows

从论坛上pecl 已经不维护了&#xff0c;直接让大家到ci 去下载 https://stackoverflow.com/questions/76496488/redis-dll-not-found-for-php8-2/76496489#76496489 让我们找最新的一次commit &#xff0c;然后又action 构建&#xff0c;再下载&#xff0c;这样的话也好&#…

使用阿里云试用Elasticsearch学习:创建仪表板pivot、搜索discover和仪表板dashboard

文档&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/current/transform-examples.html#example-clientips 在kibana左栏打开Transforms&#xff0c;并创建Transforms&#xff08;转换&#xff09; Management > Stack Management > Data > T…

面试八股——Spring——AOP与事务

AOP的定义 事务的实现 事务的失效场景 异常捕获处理 下图中由于②导致异常&#xff1a; 原因&#xff1a; 解决办法&#xff1a;自己抛出一个非检查异常&#xff08;具体原因看“抛出检查异常”&#xff09;。 抛出检查异常 由于①出错&#xff0c;导致抛出了检查异常 原因&…

云笔记小程序的实现

1.前言 云笔记, 是基于HotApp小程序统计云后台提供的api接口开发的一个微信小程序。 2.功能 离线保存笔记 云端数据同步, 更换了设备也可以找到以前的笔记 接入了好推二维码提供的数据统计工具, 可以到平台上查看用户分析、留存分析、事件分析。 3.界面效果 ***HotApp云笔…

不再写满屏import导入

密密麻麻的import语句不仅仅是一种视觉上的冲击&#xff0c;更是对代码组织结构的一种考验。 我们是如何做到让import“占领满屏“的了&#xff0c;又该如何优雅地管理这些import语句呢&#xff1f; 本文将从产生大量import语句的原因、可能带来的问题以及如何优化和管理impo…

Qt 中默认代码

目录 主函数 widget的声明 widget的定义 form file .pro 文件 主函数 #include "widget.h" ​ #include <QApplication> ​ int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 上面就是 Qt 刚创建的一…

系统架构最佳实践 -- API网关架构设计

目录 1.什么是API网关&#xff1f; 2.API网关的核心功能 3.架构设计原则 4.API网关的实现方式 5.常见的API网关工具和框架 6.实际案例分析 API网关是现代微服务架构中的重要组件&#xff0c;它充当了前端和后端微服务之间的中介。本文将介绍API网关的架构设计原则和实现方…