Ubunutu18.04+Qt5.14+Dlib19.24+Opencv3.4.16实时人眼监测实验

这篇具有很好参考价值的文章主要介绍了Ubunutu18.04+Qt5.14+Dlib19.24+Opencv3.4.16实时人眼监测实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


1 前言

  在Ubuntu18.04实现的一个人眼监测小程序,使用Qt5.14、Dlib19.24、Opencv3.4.16实现。
  其主要实现思想是,首先通过Opencv获取摄像头数据,然后通过Dlib提取人脸68关键点的算法对所输入图片中的人脸进行关键点检测,检测出眼部的关键点后,在用Opnecv中的画图命令进行绘制,再利用Qt进行界面展示。


2 效果

  人眼监测小程序效果如下图所示,将画面中的人眼处用绿色的线进行框选。

Ubunutu18.04+Qt5.14+Dlib19.24+Opencv3.4.16实时人眼监测实验


3 Ubuntu18.04下Qt、Opencv、Dlib的配置

3.0 Ubuntu18.04的安装以及一些基本配置

  U此部分涉及到buntu18.04系统的安装、配置一些基础的应用软件等过程。
  (1)引导盘的制作;(2)安装ubuntu18.04系统;(3)安装搜狗输入法;(4)安装百度网盘;(5)安装Chrome浏览器;(6)安装激活Pycharm;(7)安装VScode;
  整体的大概流程参照这篇博客https://blog.csdn.net/wang_chao118/article/details/130146392?spm=1001.2014.3001.5502

3.1 Qt

  从Qt官网下载链接https://download.qt.io/archive/qt/处下载所对应版本,我这里直接下载的是https://download.qt.io/archive/qt/5.14/5.14.2/这个页面下的这个qt-opensource-linux-x64-5.14.2.run文件.下载下来后直接命令行运行,按照步骤走即可,注意一下安装Qt的具体位置.

3.2 Opencv

  从github上下载Opencv的源码进行编译,我这次没下新版本,因为之前有用过这个Opnecv3.4.16,所以就下了这个https://github.com/opencv/opencv/tree/3.4.16版本,没有什么特别的用意,如果只是做一些小demo,仅仅用到一些opencv的基础操作如读取图片等操作,下哪个版本的都可以.
  在用到cmake-gui配置编译选项的时候,勾选编译opencv_world,这样的话所有的库文件全部打包成一个,可以简便pro文件的写法,也不用去查某个函数到底对应哪个库,这个libopencv_world.so.3.4.16也就20多MB吧.(此处是相对而言的,也可以不编译为一个库)

3.3 Dlib

  从github上下载Dlib的源码https://github.com/davisking/dlib进行编译,过程与编译opencv时类似.

4 核心代码

  本项目下的文件层级如下图所示.
Ubunutu18.04+Qt5.14+Dlib19.24+Opencv3.4.16实时人眼监测实验

4.1 pro文件

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++14

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    camera.cpp \
    fatiguedetect.cpp \
    main.cpp \
    widget.cpp

HEADERS += \
    camera.h \
    fatiguedetect.h \
    widget.h

FORMS += \
    widget.ui

#opencv库的路径opencv3.4.16
INCLUDEPATH += /home/ai/software/opencv3416_installed/include
LIBS += /home/ai/software/opencv3416_installed/lib/libopencv_world.so

# dlib19.24库的路径
INCLUDEPATH += /home/ai/software/dlib_installed/include
LIBS += /home/ai/software/dlib_installed/lib/libdlib.a

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

DISTFILES +=

4.2 Widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <iostream>


Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    camera_thread = new Camera();
    camera_thread->set_cam_number(0);
    connect(camera_thread, SIGNAL(sendPicture(QImage)),this,SLOT(receive(QImage)));
    camera_thread->open_camera();
}

Widget::~Widget()
{
    delete ui;
}


void Widget::receive(QImage img)
{
    QImage scaled_img = img.scaled(ui->label->width(), ui->label->height());
    ui->label->setPixmap(QPixmap::fromImage(scaled_img));
}


4.3 fatiguedetect.cpp

#include "fatiguedetect.h"

// 常量定义
const double close_standard = 0.45;
const int eye_l_len = 60;

// 判断状态的类
class JudgeCondition : public QObject {
    Q_OBJECT

public:
    explicit JudgeCondition(QObject *parent = nullptr) : QObject(parent), condition(0), heavy_flag(0) {};

    void judge(std::deque<int> &left_eye_l, std::deque<int> &right_eye_l)
    {
        int left_sum = std::accumulate(left_eye_l.begin(), left_eye_l.end(), 0);
        int right_sum = std::accumulate(right_eye_l.begin(), right_eye_l.end(), 0);

        if (left_sum == eye_l_len && right_sum == eye_l_len) {
            ++heavy_flag;
            if (heavy_flag > 100) {
                condition = 3;
            } else {
                condition = 2;
            }
        } else {
            heavy_flag = 0;
            condition = 1;
        }

        emit sendCondition(condition);
    };

signals:
    void sendCondition(int);

private:
    int condition;  // 状态:0=图像缺失 1=清醒 2=疲劳 3=重度疲劳
    int heavy_flag;  // 重度疲劳标志位
};


FatigueDetect::FatigueDetect(QObject *parent) : QObject(parent),
    noImageFlag(0),
    noImage(0)
{
    cout << "[INFO] loading facial landmark predictor..." << endl;
    dlib::deserialize("./model.dat") >> predictor;          //是直接调试运行,则在build文件夹内;如果为release则与.exe在同一文件夹内
    detector = dlib::get_frontal_face_detector();
}

cv::Mat FatigueDetect::detect(cv::Mat frame)
{
    std::vector<std::vector<cv::Point>> pos;
    cv::Mat resized_frame;
    cv::resize(frame, resized_frame, cv::Size(720, 720 * frame.rows / frame.cols));
    cv::Mat gray;
//    cv::cvtColor(resized_frame, gray, cv::COLOR_BGR2GRAY);

    cv_image<bgr_pixel> dlib_img(resized_frame);

    std::vector<dlib::rectangle> rects = detector(dlib_img, 0);    //这里放入detector的必须是dlib类型参数,不能是cv::Mat,不报错,但编译时出“问题”

    if (rects.size() == 0)
    {
        noImage = 1;
        emit noSignal(noImageFlag);
    }

    for (dlib::rectangle rect : rects)    //for(类型 变量名称 : 容器/数组等内容)
    {
        noImage = 0;

        dlib::full_object_detection shape = predictor(dlib_img, rect);

        std::vector<cv::Point> pos_;

        for (int i = 36; i <= 41; i++)   //左眼关键点标识
        {
            cv::Point point(shape.part(i).x(), shape.part(i).y());
            pos_.push_back(point);
        }

        for (int i = 42; i <= 47; i++)   //右眼关键点标识
        {
            cv::Point point(shape.part(i).x(), shape.part(i).y());
            pos_.push_back(point);
        }

        pos.push_back(pos_);

        draw_point_and_line(pos_, resized_frame);
    }

    cv::Mat resized_back_frame;
    cv::resize(resized_frame, resized_back_frame, cv::Size(frame.cols, frame.rows));
    return resized_back_frame;
}

void FatigueDetect::draw_point_and_line(std::vector<cv::Point> pos_, cv::Mat &image)
{
    int linewidth = 1;
    for (int i = 0; i < 5; i++)
    {
       cv::line(image, pos_[i], pos_[i + 1], cv::Scalar(0, 255, 0), linewidth);
    }
    cv::line(image, pos_[0], pos_[5], cv::Scalar(0, 255, 0), linewidth);
    for (int i = 6; i < 11; i++)
    {
       cv::line(image, pos_[i], pos_[i + 1], cv::Scalar(0, 255, 0), linewidth);
    }
    cv::line(image, pos_[6], pos_[11], cv::Scalar(0, 255, 0), linewidth);
    for (cv::Point point : pos_)
    {
      cv::circle(image, point, linewidth, cv::Scalar(255, 0, 0), -1);
    }
}

5 资源下载

本案例中涉及到的工程文件到此处下载https://download.csdn.net/download/wang_chao118/87700907。文章来源地址https://www.toymoban.com/news/detail-412576.html

到了这里,关于Ubunutu18.04+Qt5.14+Dlib19.24+Opencv3.4.16实时人眼监测实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Ubuntu18.04 Qt 实现MQTT

    什么是MQTT? 作用是什么(适用场景)? 与其他通讯协议相比,优缺点在那里? 使用 EMQ X(开源且可视化管理) 下载 EMQX 下载的是    emqx-5.0.26-ubuntu18.04-amd64.deb  直接访问:127.0.0.1:18083 无法访问的解决办法: 查看配置文件的默认端口号 (一般在 /etc/emqx/emqx.conf) 查看端口是

    2024年01月21日
    浏览(53)
  • UBuntu18.04 Qt之双HDMI屏切换

    UBuntu18.04 Qt之双HDMI接2个4K屏并分别设置分辨率、主屏、副屏 在main函数里面添加: mainwindow.h MainWIndow.cpp 左边的4k显示器和右边的4k显示器分别显示程序的主界面

    2024年02月12日
    浏览(59)
  • 在Ubuntu18.04中搭建基于QT的opencv环境

    前言 在看这篇文章之前,需要读者已经安装了qt环境如果还没有安装可以移步至这篇文章的后半断 链接: qt移植 获取cmake-gui sudo apt-get install cmake-gui 这一步主要是一会儿编译opencv的时候会用到 获取opencv的依赖环境 sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcod

    2024年01月17日
    浏览(47)
  • Win10平台VS2017+OpenCV3.4.0+Qt5.12配置教程

    本文专为图像处理开发项目人员准备,涉及多个软件和库的安装、配置教程,亲测可行。 1、 VS 是美国微软公司(Microsoft)开发的 集成开发环境 “Visual Studio” 的简称,是Windows平台最流行的应用程序集成开发环境。 注意区分:MSVC(Microsoft Visual C++ Compiler)是指微软的VC编译

    2024年02月05日
    浏览(61)
  • Linux Server 20.04 Qt5.14.2配置Jetson Orin Nano Developer Kit 交叉编译环境

    最近公司给了我一块Jetson Orin Nano的板子,先刷了系统(1.Jetson Orin Nano Developer Kit系统刷机)又让我搭建交叉编译环境,所以有了下面的文章 1.1设备环境 1.1.1 Server: 1.1.2 Jetson Orin Nano : 1.2 Qt相关下载地址 1.2.1 Qt源码下载 Qt源码下载(最好下载tar.xz,tar格式可能在windows下编辑过,后期

    2024年02月12日
    浏览(48)
  • pcl+vtk(二)Ubuntu18.04下载安装基于使用QT的pcl1.13+vtk8.2,以及卸载

    1.Qt版本 Qt5.4以前版本:QVTKWidget2/QVTKWidget。 Qt5.4以后版本:QVTKOpenGLWidget/QVTKOpenGLWidget。 2.VTK版本(Qt版本为5.4之后) 在VTK8.2以前的版本:QVTKOpenGLWidget; 在VTK8.2及以后的版本里:QVTKOpenGLNativeWidget; QVTKWidget:目前了解到的只可显示点云,没有在网上找到显示模型的例子。 QVTKOpen

    2024年02月04日
    浏览(68)
  • Linux系统 Ubuntu18.04安装的详细教程(提供18.04ubuntu镜像)

    镜像文件下载: 链接:https://pan.baidu.com/s/12bEdRBwO1YbLt23QKnrSrA 提取码:h7as 关于全名、用户名区别可先看第四部分 处理器和内核数量,根据需要配置就行。我是8核16线程,配置2,2。小白学习的话,配置低一点没关系。如果你只是为了学一些基础命令,配置成1,1应该也没问题

    2024年02月01日
    浏览(89)
  • Qt5.14和Qt5.15在线下载

    https://download.qt.io/archive/qt/5.14/5.14.2/ https://download.qt.io/official_releases/online_installers/ qt 安装太慢的问题如何解决? Qt学习 QT最新版本下载安装(QT5.15及QT6.X) 清华大学 Qt镜像下载中心

    2024年02月12日
    浏览(45)
  • Ubuntu(18.04)换源

    主要参考Ubuntu(18.04)更换国内源方法及注意事项_muxi_712的博客-CSDN博客 为防止其删除博客,本文简单重新梳理一遍: 跳转: 查看: 备份: 替换: 这里使用清华源:打开https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/,选择对应的Ubuntu版本。当然也可以选择其他源比如阿里源,中科大源

    2024年02月04日
    浏览(49)
  • ubuntu 18.04网络问题

    安装好系统之后,检查gcc和make是否已经安装 如果未安装,则安装gcc和make 安装openssh-server 安装网络工具和防火墙 开通端口 准备设置静态IP时,发现没有有线网卡,无法正常插网线进行联网。 执行ipconfig 查看网卡配置是否有 ethxx 或者 enxx ,也没有,则说明有线网卡的驱动需要

    2024年01月25日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包