基于OpenCV的人脸签到系统

效果图

在这里插入图片描述

目录文件

在这里插入图片描述

camerathread.h 功能实现全写在.h里了

class CameraThread : public QThread
{Q_OBJECT
public:CameraThread(){//打开序号为0的摄像头m_cap.open(0);if (!m_cap.isOpened()) {qDebug() << "Error: Cannot open camera";}//判断是否有文件,人脸识别模型,检测和识别用的if(!m_cascada.load("D:/research/CV/Opencv/haarcascade_frontalface_alt2.xml")){QMessageBox::information(NULL,"失败", "人脸识别模型装载失败");}//实例化定时器,子线程中数据传输到中线程并显示出来m_timer = new QTimer(this);//绑定时间信号及获取图像帧的图像connect(m_timer,SIGNAL(timeout()),this,SLOT(readFarme()));//大概每秒24帧//开始定时器m_timer->start(42);//打卡模块// 定义 FisherFaceRecognizer 模型,训练用的模型m_model = LBPHFaceRecognizer::create();// 加载训练好的模型,自己训练的模型m_model->read("MyFaceLBPHModel.xml");if (m_model.empty()){qDebug() << "Error: Failed to load model!";}else{qDebug() << "Model loaded successfully!";}//录入时候的定时器,录入大概几秒,获取二十张灰色图像并保存,等待训练//实例化定时器m_Very_timer = new QTimer(this);//数据库的初始化部分//链接数据库m_db = QSqlDatabase::addDatabase("QMYSQL");m_db.setHostName("localhost");  // 主机名m_db.setDatabaseName("face");  // 数据库名m_db.setUserName("root");  // 用户名m_db.setPassword("31415926");  // 密码}~CameraThread(){//释放摄像头m_cap.release();}void run() override{}//图像数据类型转换QImage MatImageToQt(const cv::Mat &src){if(src.type() == CV_8UC1){QImage qImage(src.cols,src.rows,QImage::Format_Indexed8);qImage.setColorCount(256);for(int i = 0; i < 256; i ++){qImage.setColor(i,qRgb(i,i,i));}uchar *pSrc = src.data;for(int row = 0; row < src.rows; row ++){uchar *pDest = qImage.scanLine(row);memcmp(pDest,pSrc,src.cols);pSrc += src.step;}return qImage;}else if(src.type() == CV_8UC3){const uchar *pSrc = (const uchar*)src.data;QImage qImage(pSrc,src.cols,src.rows,src.step,QImage::Format_RGB888);return qImage.rgbSwapped();}else if(src.type() == CV_8UC4){const uchar *pSrc = (const uchar*)src.data;QImage qImage(pSrc, src.cols, src.rows, src.step, QImage::Format_ARGB32);return qImage.copy();}else{return QImage();}}//人脸检测void Check(Mat &image, Mat &gray){//直方图均匀化(改善图像的对比度和亮度)Mat equalizedImg;equalizeHist(gray,equalizedImg);int flags = CASCADE_SCALE_IMAGE; //检测多个人Size minFeatureSize(30,30);float searchScaleFactor = 1.1f; //默认1.1倍int minNeighbors = 4;m_cascada.detectMultiScale(equalizedImg,m_faces,searchScaleFactor,minNeighbors,flags,minFeatureSize);m_current_people = m_faces.size();//检测到的个数//qDebug() << "检测到人脸的个数:" << m_faces.size() << endl;QString str;str.setNum(m_faces.size());//qDebug() << m_current_people << endl;//        //画矩形框Mat face;
//        for(int i = 0; i < m_faces.size(); i++)
//        {
//            if(m_faces[i].height > 0 && m_faces[i].width >0 )
//            {
//                face = gray(m_faces[i]);
//                m_text_lb = Point(m_faces[i].x,m_faces[i].y);
//                rectangle(image, m_faces[i], Scalar(50, 50, 150), 2, 8, 0); //线太细了会导致在QLabel上面丢失线框//            }
//            int iP = Predict(image);//        }// 画矩形框和显示姓名for(int i = 0; i < m_faces.size(); i++){string name; // 从数据库中获取姓名if(m_faces[i].height > 0 && m_faces[i].width >0 ){face = gray(m_faces[i]);m_text_lb = Point(m_faces[i].x,m_faces[i].y);rectangle(image, m_faces[i], Scalar(50, 50, 150), 2, 8, 0); // 画矩形框//灰度图Mat tImagGray;cvtColor(image, tImagGray, COLOR_BGR2GRAY);// 识别人脸int id = Predict(tImagGray);if (!m_db.open()){qDebug() << "Failed to connect to database:" ;}// 执行查询语句QSqlQuery query;QString queryString = QString("SELECT name FROM staff_info WHERE num = %1").arg(id);if (!query.exec(queryString)){qDebug() << "Failed to execute query:";m_db.close();}// 处理查询结果if (query.next()){name = query.value(0).toString().toUtf8().constData();m_db.close();}else{m_db.close();name = "Unknown";}}qDebug() << name.data();// 在图像上显示姓名Point textPosition(m_faces[i].x, m_faces[i].y - 10); // 文本位置在矩形框上方一点putText(image, name.data(), textPosition, FONT_HERSHEY_SIMPLEX, 0.5, Scalar(255, 255, 255), 1, LINE_AA);}m_faces.clear();}// 裁剪出的脸部区域的图像cv::Mat cropFace(const cv::Mat& faceImg, const cv::Rect& faceRect) {// 不再进行颜色空间转换,直接使用输入的 faceImgcv::Mat frame_gray = faceImg;// 确保矩形区域在图像范围内if (faceRect.x >= 0 && faceRect.y >= 0 &&faceRect.x + faceRect.width <= frame_gray.cols &&faceRect.y + faceRect.height <= frame_gray.rows){// 使用区域选择功能提取矩形区域cv::Mat faceROI = frame_gray(faceRect).clone(); // 使用 clone() 来复制图像区域return faceROI;}else{// 处理矩形区域超出图像范围的情况// 这里可以选择合适的处理方式,比如调整矩形区域的大小或者放弃处理该脸部区域return cv::Mat();}}// 在文本文件末尾添加数据void appendToTextFile(const QString& filename, const QString& data){QFile file(filename);if (file.open(QIODevice::Append | QIODevice::Text)){QTextStream out(&file);out << data << "\n";file.close();}else{qDebug() << "Failed to open file for appending.";}}//预测功能,检测输入的图像中的人脸是否在训练集中int Predict(Mat src_image){Mat face_test;int ispredict = 0;//截取的ROI人脸尺寸调整if (src_image.rows >= 120){//改变图像大小,使用双线性差值resize(src_image, face_test, Size(92, 112));}//判断是否正确检测ROIif (!face_test.empty()){//测试图像应该是灰度图ispredict = m_model->predict(face_test);}//cout << ispredict << endl;return ispredict;}signals://向主线程传输图像void Set_image(QImage *image);//打卡之后设置ui部分和数据库部分void Send_Card_Data(QSqlDatabase *m_db,QString num);public slots://摄像头读取函数void readFarme(){//读取一帧图像m_cap.read(m_src_image) ;//处理一下数据,人脸检测//生成灰度图Mat dst_gray;cvtColor(m_src_image, dst_gray, COLOR_BGR2GRAY);Check(m_src_image, dst_gray);//转换图像数据类型QImage imag = MatImageToQt(m_src_image);//发送图像Set_image(&imag);}//执行二十次检测人脸并保存下来的功能void Verity(){//判断目前摄像头中的脸有几个if (!m_facenum.isEmpty()){//如果目前只有一个人if(m_current_people == 1){qDebug() << m_executionCount;//裁剪出人脸区域Mat faceROI = cropFace(m_src_image, m_faces[0]);if (!faceROI.empty()){// 调整裁剪后的脸部图像大小cv::Mat resizedFace;cv::resize(faceROI, resizedFace, cv::Size(92, 112));// 将调整大小后的脸部图像存储在 m_src_image 中m_src_image = resizedFace.clone();} else{qDebug() << "裁剪后的脸部图像为空! ";}//存储的地址QString dir_str = "D:\\research\\CV\\Opencv\\facedata\\" + m_facenum + "\\" + QString::number(m_executionCount) + ".jpg";//用来判断这个地址的文件夹是否存在QString is_dir = "D:\\research\\CV\\Opencv\\facedata\\" + m_facenum;qDebug() << dir_str;QDir dir(is_dir);if (!dir.exists()){if (!dir.mkpath(".")){qDebug() << "default ";}}//扣的脸部的图像如果不为空if (!faceROI.empty()){string filename = dir_str.toStdString();// 将彩色图像转换为灰度图像cv::Mat frame_gray;cv::cvtColor(faceROI, frame_gray, cv::COLOR_BGR2GRAY);//存储图像imwrite(filename, frame_gray);//在存储训练集需要的图片的地址的txt里也更新地址QString csvsave = "D:/research/CV/Opencv/facedata/" + m_facenum + "/" + QString::number(m_executionCount) + ".jpg" + ";" + m_facenum ;//存放要训练的模型的图片的地址的txtQString csvfilename = "D:\\research\\CV\\Opencv\\at.txt";//添加数据appendToTextFile(csvfilename, csvsave);m_executionCount++; // 每次执行计数器加一} else{qDebug() << "脸部图像为空,无法写入文件! ";}//存储20张之后if (m_executionCount >= 20){m_executionCount = 0;m_Very_timer->stop();}}}else{QMessageBox::about(NULL, "提示", "请输入工号!");m_executionCount = 0;m_Very_timer->stop();//delete m_Very_timer;}}//录入脸void Set_Verity_face(QString facenum,QString facename){m_facenum = facenum;m_facename = facename;qDebug()<< QSqlDatabase::drivers();//判断数据库是否开着if (!m_db.open()){qDebug() << "Failed to connect to database:" ;} else{qDebug() << "Connected to database!";}//查找全部,看数量以便添加idQSqlQuery countQuery("SELECT COUNT(*) FROM staff_info");if (countQuery.exec() && countQuery.next()){int rowCount = countQuery.value(0).toInt(); // 获取数据条数int newId = rowCount + 1; // 新的 ID 就是数据条数加一QSqlQuery query;query.prepare("INSERT INTO staff_info (num, id, name) VALUES (:facenum, :faceid, :facename)");query.bindValue(":facenum", m_facenum);query.bindValue(":faceid", newId); // 使用新的 IDquery.bindValue(":facename", m_facename);if (query.exec()){qDebug() << "Data inserted into database successfully!";}else{qDebug() << "Failed to insert data into database:" ;}}else{qDebug() << "Failed to retrieve row count from database:" ;}//关闭数据库m_db.close();qDebug() << "开始录入\n";//绑定时间信号及获取图像帧的图像connect(m_Very_timer, SIGNAL(timeout()), this, SLOT(Verity()));//开始定时器m_Very_timer->start(200);}//设置打卡部分void Set_Card(){Mat gray;cvtColor(m_src_image, gray, CV_BGR2GRAY); // 将输入图像转换为灰度图像vector<Rect> faces; // 存放检测到的人脸矩形的向量容器// 使用级联分类器检测人脸m_cascada.detectMultiScale(gray, faces, 1.1, 4, 0, Size(30, 30), Size(500, 500));// 遍历检测到的每张人脸for (size_t i = 0; i < faces.size(); i++){Rect faceRect = faces[i]; // 获取当前人脸的矩形框// 从灰度图像中提取当前人脸区域Mat faceROI = gray(faceRect);// 检查人脸区域是否为空if (!faceROI.empty()){// 调用 Predict 函数对人脸进行预测int temp = Predict(faceROI);qDebug() << "预测结果:" << temp;// 发送打卡数据,然后让主线程在数据库中查找Send_Card_Data(&m_db,QString::number(temp));}}faces.clear();}private://声明opencv的视频类cv::VideoCapture m_cap;//更新显示的定时器QTimer *m_timer;//录入的定时器QTimer *m_Very_timer;//声明Mat类图像变量,存储当前摄像头前的图像cv::Mat m_src_image;//检测的分类器CascadeClassifier m_cascada;//矩形框的点Point m_text_lb;//人脸个数vector<Rect> m_faces;// 声明一个录入计数器变量int m_executionCount = 0;//工号和姓名QString m_facenum;QString m_facename;//识别的模型Ptr<LBPHFaceRecognizer> m_model;//当前镜头前识别出的人数int m_current_people = 0;//数据库QSqlDatabase m_db;
};#endif // CAMERATHREAD_H

faceverify.cpp


#include "faceverify.h"
#include "ui_faceverify.h"#include <QDebug>
#include <QCamera>              //管理摄像头的大类
#include <QCameraInfo>          //管理摄像头的设备表
#include <QCameraViewfinder>    //管理摄像头显示区域
#include <QCameraImageCapture>  //管理图片
#include <QDateTime>            //管理时间
#include <QString>              //管理字符串
#include "verityface.h"#pragma execution_character_set("utf-8")FaceVerify::FaceVerify(QWidget *parent): QWidget(parent), ui(new Ui::FaceVerify)
{ui->setupUi(this);}FaceVerify::~FaceVerify()
{delete m_cthread;delete ui;
}void FaceVerify::Get_image(QImage *image)
{//设置图片大小和label的长宽一致QImage timage = image->scaled(ui->Camera->width(), ui->Camera->height(),Qt::IgnoreAspectRatio, Qt::SmoothTransformation);ui->Camera->setPixmap(QPixmap::fromImage(timage));
}//打开摄像头
void FaceVerify::on_pushButton_Open_Camera_clicked()
{if(ui->pushButton_Open_Camera->text() ==  "打开摄像头"){m_cthread = new CameraThread();connect(m_cthread, &CameraThread::Set_image, this, &FaceVerify::Get_image);ui->pushButton_Open_Camera->setText("关闭摄像头");}else{disconnect(m_cthread, &CameraThread::Set_image, this, &FaceVerify::Get_image);delete m_cthread;m_cthread = nullptr;ui->Camera->clear();ui->pushButton_Open_Camera->setText("打开摄像头");}
}//打卡
void FaceVerify::on_pushButton_Card_clicked()
{// 先断开之前的连接disconnect(this, &FaceVerify::Send_Card, m_cthread, &CameraThread::Set_Card);disconnect(m_cthread, &CameraThread::Send_Card_Data, this, &FaceVerify::Show_Data);// 连接信号和槽connect(this, &FaceVerify::Send_Card, m_cthread, &CameraThread::Set_Card);connect(m_cthread, &CameraThread::Send_Card_Data, this, &FaceVerify::Show_Data);// 发送信号emit Send_Card();}
//打卡数据显示
void FaceVerify::Show_Data(QSqlDatabase *m_db,QString num)
{if (!m_db->open()){qDebug() << "Failed to connect to database:";}else{qDebug() << "Connected to database!";// 执行检查并插入数据QSqlQuery query;query.prepare("SELECT * FROM record_info WHERE num = :facenum AND DATE(mtime) = CURDATE()");query.bindValue(":facenum", num);if (query.exec()){if (query.next()){// 如果有记录,表示今天已经签到QMessageBox::information(NULL, tr("提示 "), tr("今天已签到 "));// 读取数据库中的数据并显示在textEdit_data中QString data;QSqlRecord record = query.record();int numField = record.indexOf("num"); // 获取字段索引int timeField = record.indexOf("mtime");// 遍历查询结果do{QString num = query.value(numField).toString(); // 获取编号QString time = query.value(timeField).toDateTime().toString("yyyy-MM-dd hh:mm:ss"); // 获取时间data += "编号: " + num + ", 时间: " + time + "\n";} while (query.next());// 将数据显示在textEdit_data中ui->textEdit_data->setText(data);}else{QDateTime currentDateTime = QDateTime::currentDateTime();QString currentTimeString = currentDateTime.toString("yyyy-MM-dd hh:mm:ss");qDebug() << "Current time:" << currentTimeString;// 如果没有记录,表示今天还未签到,执行插入操作query.prepare("INSERT INTO record_info (num, id, mtime) VALUES (:facenum, :faceid, :facemtime)");query.bindValue(":facenum", num);query.bindValue(":faceid", num); // 使用相同的 num 作为 idquery.bindValue(":facemtime", currentTimeString);if (query.exec()){QMessageBox::information(NULL, tr("提示 "), tr("签到成功 "));}else{QMessageBox::critical(NULL, tr("错误 "), tr("签到失败: ") ); // 显示错误信息}}}else{QMessageBox::critical(NULL, tr("错误"), tr("查询数据失败: "));}// 关闭数据库连接m_db->close();}}//录入人脸
void FaceVerify::on_pushButton_face_clicked()
{//打开录入界面m_verifity = new VerityFace();connect(m_verifity, &VerityFace::Send_Face, this, &FaceVerify::GetFaceNum);m_verifity->show();
}//训练模型
void FaceVerify::on_pushButton_Train_clicked()
{m_train = new train();connect(m_train, &train::finished, this, &FaceVerify::Train_Finish);m_train->run();}
//模型训练完
void FaceVerify::Train_Finish()
{delete m_train;QMessageBox::information(NULL,"训练", "训练完成");
}

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

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

相关文章

iframe实现pdf预览,并使用pdf.js修改内嵌标题,解决乱码问题

项目中遇到文件预览功能,并且需要可以打印文件.下插件对于内网来说有点麻烦,正好iframe预览比较简单,且自带下载打印等功能按钮. 问题在于左上方的文件名乱码,网上找了一圈没有看到解决的,要么就是要收费要会员(ztmgs),要么直接说这东西改不了. 使用: 1.引入 PDF.js 库&…

Spring Boot集成Redisson实现延迟队列

项目场景&#xff1a; 在电商、支付等领域&#xff0c;往往会有这样的场景&#xff0c;用户下单后放弃支付了&#xff0c;那这笔订单会在指定的时间段后进行关闭操作&#xff0c;细心的你一定发现了像某宝、某东都有这样的逻辑&#xff0c;而且时间很准确&#xff0c;误差在1s内…

与AI对话:探索最佳国内可用的ChatGPT网站

与AI对话&#xff1a;探索最佳国内可用的ChatGPT网站 &#x1f310; 链接&#xff1a; GPTGod 点击可注册 &#x1f3f7;️ 标签&#xff1a; GPT-4 支持API 支持绘图 Claude &#x1f4dd; 简介&#xff1a;GPTGod 是一个功能全面的平台&#xff0c;提供GPT-4的强大功能&…

JavaEE——Spring Boot + jwt

目录 什么是Spring Boot jwt&#xff1f; 如何实现Spring Boot jwt&#xff1a; 1. 添加依赖 2、创建JWT工具类 3. 定义认证逻辑 4. 添加过滤器 5、 http请求测试 什么是Spring Boot jwt&#xff1f; Spring Boot和JWT&#xff08;JSON Web Token&#xff09;是一对常…

苍穹外卖学习

并不包含全部视频内容&#xff0c;大部分都按照操作文档来手搓代码&#xff0c;资料&#xff0c;代码都上传git。 〇、实际代码 0.1 Result封装 package com.sky.result;import lombok.Data;import java.io.Serializable;/*** 后端统一返回结果* param <T>*/ Data pub…

软考 系统架构设计师系列知识点之软件可靠性基础知识(5)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之软件可靠性基础知识&#xff08;4&#xff09; 所属章节&#xff1a; 第9章. 软件可靠性基础知识 第1节 软件可靠性基本概念 9.1.3 可靠性目标 前文定量分析软件的可靠性时&#xff0c;使用失效强度来表示软件缺陷对…

20232937文兆宇 2023-2024-2 《网络攻防实践》实践七报告

20232937文兆宇 2023-2024-2 《网络攻防实践》实践七报告 1.实践内容 &#xff08;1&#xff09;使用Metasploit进行Linux远程渗透攻击 任务&#xff1a;使用Metasploit渗透测试软件&#xff0c;攻击Linux靶机上的Samba服务Usermap_script安全漏洞&#xff0c;获取目标Linux…

机器学习day3

一、距离度量 1.欧氏距离 2.曼哈顿距离 3.切比雪夫距离 4.闵可夫斯基距离 二、特征与处理 1.数据归一化 数据归一化是一种将数据按比例缩放&#xff0c;使之落入一个小的特定区间的过程。 代码实战 运行结果 2.数据标准化 数据标准化是将数据按照其均值和标准差进行缩放的过…

2024新版计算机网络视频教程65集完整版(视频+配套资料)

今日学计算机网络&#xff0c;众生皆叹难理解。 却见老师神乎其技&#xff0c;网络通畅如云烟。 协议层次纷繁复杂&#xff0c;ARP、IP、TCP、UDP。 路由器交换机相连&#xff0c;数据包穿梭无限。 网络安全重于泰山&#xff0c;防火墙、加密都来添。 恶意攻击时刻存在&#xf…

Visual Studio Code使用

目录 1.python的调试 2.c的运行 方法1&#xff1a; 方法2&#xff1a; 3.c的调试 3.1调试方法一&#xff1a;先生成执行文件&#xff0c;再调试 3.2调试方法二&#xff1a;同时生成执行文件&#xff0c;调试 4.tasks.json 与launch.json文件的参考 4.1C生成执行文件tas…

AI视频教程下载:用ChatGPT和 MERN 堆栈构建 SAAS 项目

这是一个关于 掌握ChatGPT 开发应用的全面课程&#xff0c;它将带领你进入 AI 驱动的 SAAS 项目的沉浸式世界。该课程旨在使你具备使用动态的 MERN 堆栈和无缝的 Stripe 集成来构建强大的 SAAS 平台所需的技能。 你将探索打造智能解决方案的艺术&#xff0c;深入研究 ChatGPT 的…

使用R语言进行简单的主成分分析(PCA)

主成分分析&#xff08;PCA&#xff09;是一种广泛使用的数据降维技术&#xff0c;它可以帮助我们识别数据中最重要的特征并简化复杂度&#xff0c;同时尽量保留原始数据的关键信息。在这篇文章中&#xff0c;我们将通过一个具体的例子&#xff0c;使用R语言实现PCA&#xff0c…

主成分分析(PCA):揭秘数据的隐藏结构

在数据分析的世界里&#xff0c;我们经常面临着处理高维数据的挑战。随着维度的增加&#xff0c;数据处理、可视化以及解释的难度也随之增加&#xff0c;这就是所谓的“维度的诅咒”。主成分分析&#xff08;PCA&#xff09;是一种强大的统计工具&#xff0c;用于减少数据的维度…

Maven的仓库、周期和插件

一、简介 随着各公司的Java项目入库方式由老的Ant改为Maven后&#xff0c;相信大家对Maven已经有了个基本的熟悉。但是在实际的使用、入库过程中&#xff0c;笔者发现挺多人对Maven的一些基本知识还缺乏了解&#xff0c;因此在此处跟大家简单地聊下Maven的相关内容&#xff0c…

基于STM32单片机的天然气与温湿度检测报警系统设计

基于STM32单片机的天然气与温湿度检测报警系统设计 一、引言 随着科技的发展和安全生产意识的提高&#xff0c;对于地下矿井等封闭环境中的天然气泄漏和温湿度变化的监控变得尤为重要。本文设计了一种基于STM32单片机的天然气与温湿度检测报警系统&#xff0c;旨在实时监控环…

OpenCV实现霍夫变换

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV 如何实现边缘检测器 下一篇 :OpenCV 实现霍夫圆变换 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 HoughLines()和 HoughLinesP()检测图像中的线条。…

Error opening file a bytes-like object is required,not ‘NoneType‘

错误显示&#xff0c;打开的是一个无效路径的文件 查看json文件内容&#xff0c;索引的路径与json文件保存的路径不同 方法&#xff1a;使用python脚本统一修改json文件路径 import json import os import argparse import cv2 from tqdm import tqdm import numpy as np impo…

python爬虫学习------scrapy第二部分(第三十天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

10、了解JVM判断对象可回收的神秘法则!

10.1、垃圾回收触发时机? 在我们之前的学习中,我们已经了解到,当我们的系统在运行过程中创建对象时,这些对象通常会被优先分配在所谓的“新生代”内存区域,如下图所示。 在新生代中,当对象数量逐渐增多,接近填满整个空间时,会触发垃圾回收机制。这个机制的作用是回收…

LabVIEW专栏七、队列

目录 一、队列范例二、命令簇三、队列应用1.1、并行循环队列1.2、命名队列和匿名队列1.2.1、命名队列1.2.2、匿名队列 1.3、长度为1的队列 队列是一种特殊的线性表&#xff0c;就是队列里的元素都是按照顺序进出。 队列的数据元素又称为队列元素。在队列中插入一个队列元素称为…