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.html
  if(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-compiling
    set(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_OBJECT

public:
    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)));
}

程序结果如下:

输入图片:

在这里插入图片描述

输出图片:

在这里插入图片描述


本章完结

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1.9 数据结构之 并查集

编程总结 在刷题之前需要反复练习的编程技巧&#xff0c;尤其是手写各类数据结构实现&#xff0c;它们好比就是全真教的上乘武功 本栏目为学习笔记参考&#xff1a;https://leetcode.cn/leetbook/read/disjoint-set/oviefi/ 1.0 概述 并查集&#xff08;Union Find&#xff09…

以C++为例详解UML

以C为例详解UML —— 2024-04-14 文章目录 以C为例详解UML1. 什么是UML?2. UML模型结构3. UML中类的表示4. UML中类之间的关系4.1 泛化4.2 实现4.3 关联(1) 单向关联(2) 双向关联(3) 自关联(4) 多重关联 4.4 聚合4.5 组合4.6 依赖 5. 关联、组合、聚合与依赖的区别6. 补充笔…

华为机考入门python3--(15)牛客15-求int型正整数在内存中存储时1的个数

分类&#xff1a;二进制 知识点&#xff1a; int转二进制 binary bin(n)[2:] 题目来自【牛客】 def count_ones_in_binary(n): # 将输入的整数转换为二进制字符串 # bin(n)为0b11011binary bin(n)[2:]# 初始化计数器为0 count 0 # 遍历二进制字符串的每一位 fo…

消息队列RabbitMQ入门学习

目录 1.初识MQ 1.1.同步调用 1.2.异步调用 1.3.技术选型 2.RabbitMQ 2.1.收发消息 2.1.1.交换机 2.1.2.队列 2.1.3.绑定关系 2.1.4.发送消息 3.SpringAMQP 3.1WorkQueues模型 3.1.1消息接收 3.1.2测试 3.1.3.能者多劳 3.1.3.总结 3.2.交换机类型 3.3.Fanout交…

Golang | Leetcode Golang题解之第28题找出字符串中第一个匹配项的下标

题目&#xff1a; 题解&#xff1a; func strStr(haystack, needle string) int {n, m : len(haystack), len(needle)if m 0 {return 0}pi : make([]int, m)for i, j : 1, 0; i < m; i {for j > 0 && needle[i] ! needle[j] {j pi[j-1]}if needle[i] needle[…

【微信小程序——案例——本地生活(列表页面)】

案例——本地生活&#xff08;列表页面&#xff09; 九宫格中实现导航跳转——以汽车服务为案例&#xff08;之后可以全部实现页面跳转——现在先实现一个&#xff09; 在app.json中添加新页面 修改之前的九宫格view改为navitage 效果图&#xff1a; 动态设置标题内容—…

【Java】内存可见性问题是什么?

文章目录 内存模型内存可见性解决方案volatile 内存模型 什么是JAVA 内存模型&#xff1f; Java Memory Model (JAVA 内存模型&#xff09;是描述线程之间如何通过内存(memory)来进行交互。 具体说来&#xff0c; JVM中存在一个主存区&#xff08;Main Memory或Java Heap Mem…

wpf下RTSP|RTMP播放器两种渲染模式实现

技术背景 在这篇blog之前&#xff0c;我提到了wpf下播放RTMP和RTSP渲染的两种方式&#xff0c;一种是通过控件模式&#xff0c;另外一种是直接原生RTSP、RTMP播放模块&#xff0c;回调rgb&#xff0c;然后在wpf下渲染&#xff0c;本文就两种方式做个说明。 技术实现 以大牛直…

信息系统项目管理师0051:管理基础(4信息系统管理—4.1管理方法—4.1.1管理基础)

点击查看专栏目录 文章目录 第四章 信息系统管理4.1管理方法4.1.1管理基础1.层次结构2.系统管理第四章 信息系统管理 在信息技术和数据资源要素的推动下,社会各领域已经并正在加速进入数字化的全新发展时期,基于智能、网络和大数据的新经济业态正在形成,从“数字融合”向“数…

OpenCV4.9图像金字塔

目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 pyrUp()和 pyrDown()对给定图像进行下采样或上采样。 理论 注意 下面的解释属于 Bradski 和 Kaehler 的 Learning OpenCV 一书。 通常&#xff0c;我们需要将图像转换为与原始图像不同的大小。为此…

CleanMyMac一键释放Mac潜力的智能助手

在数字化时代&#xff0c;我们的Mac电脑承载着日益增多的数据和文件&#xff0c;使得系统性能逐渐下降&#xff0c;运行缓慢。为了解决这个问题&#xff0c;我们需要一款能够深度清理、优化Mac性能的软件。CleanMyMac&#xff0c;作为Mac系统清理领域的佼佼者&#xff0c;凭借其…

Go语言入门|包、关键字和标识符

目录 Go语言 包文件 规则 关键字 规则 标识符 规则 预定义标识符 Go语言 Go语言是一种静态类型、编译型和并发型的编程语言&#xff0c;由Google开发。Go的源代码文件以.go为扩展名&#xff0c;文件名通常与包名保持一致。一个Go文件可以包含多个顶级声明&#xff0c;…

【opencv】示例-train_HOG.cpp 训练和测试基于支持向量机(SVM)的行人检测器

#include "opencv2/imgproc.hpp" // 包含OpenCV图像处理头文件 #include "opencv2/highgui.hpp" // 包含OpenCV高层GUI&#xff08;图形用户界面&#xff09;头文件 #include "opencv2/ml.hpp" // 包含OpenCV机器学习模块头文件 #includ…

jupyter切换不同的内核(虚拟环境)(anaconda 24.1.2)

jupyter切换不同的内核&#xff08;anaconda 24.1.2&#xff09; 主要的两条命令&#xff1a; conda install ipykernel python -m ipykernel install --user --name 环境名称 anaconda的版本号 conda --version实例&#xff1a; 一、首先可以看到已经创…

【JDBC入门学习】

JDBC简介 注意&#xff1a;1.注册驱动可以不写了 2.导入jar包时要注意点击右键添加 package com.wudreamer.jdbc;import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement;/* * jdbc 入门 * */ public class JdbcDemo {public static v…

软考中级工程师网络技术第二节网络体系结构

OSPF将路由器连接的物理网络划分为以下4种类型&#xff0c;以太网属于&#xff08;25&#xff09;&#xff0c;X.25分组交换网属于&#xff08;非广播多址网络NBMA&#xff09;。 A 点对点网络 B 广播多址网络 C 点到多点网络 D 非广播多址网络 试题答案 正确答案&#xff1a; …

SDUT lab5-2

7-2 sdut-JAVA-Credit Card Number Validation 分数 10 全屏浏览 切换布局 作者 马新娟 单位 山东理工大学 Each type of credit card begins with a prefix or range of prefixes and is of a certain length. Table 1 shows the details of two commonly used credit ca…

LeetCode-31-下一个排列问题

题目说明 实现获取下一个排列的函数&#xff0c;算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列&#xff0c;则将数字重新排列成最小的排列&#xff08;即升序排列&#xff09;。 必须原地修改&#xff0c;只允许使用额外常数空间。…

论文笔记:SmartPlay : A Benchmark for LLMs as Intelligent Agents

iclr 2024 reviewer评分 5688 引入了 SmartPlay&#xff0c;一种从 6 种不同游戏中提取的基准 衡量LLM作为智能体的能力 1 智能代理所需的能力 论文借鉴游戏设计的概念&#xff0c;确定了智能LLM代理的九项关键能力&#xff0c;并为每项能力确定了多个等级&#xff1a; 长文…

JVM虚拟机(五)强引用、软引用、弱引用、虚引用

目录 一、强引用二、软引用三、弱引用四、虚引用五、总结 引文&#xff1a; 在 Java 中一共存在 4 种引用&#xff1a;强、软、弱、虚。它们主要指的是&#xff0c;在进行垃圾回收的时候&#xff0c;对于不同的引用垃圾回收的情况是不一样的。下面我们就一起来看一下这 4 种引用…