QCamera6.7笔记

news/2024/10/4 12:56:07/

1.QCamera​

.h文件

#include <QtWidgets/QMainWindow>
#include "ui_QCamera_test1.h"
#include <QCamera>
#include <QtMultimedia>
#include <QtMultimediaWidgets>
#include<QMediaCaptureSession>
#include <QMediaDevices>
#include <QImageCapture>//拍照
class QCamera_test1 : public QMainWindow
{Q_OBJECTpublic:QCamera_test1(QWidget* parent = nullptr);~QCamera_test1();private:Ui::QCamera_test1Class ui;QCamera* _camera;QMediaCaptureSession* _captureSession;//智能指针QScopedPointer<QImageCapture> imageCapture;//拍照public slots:void btn_sopen_clicked();void btn_ssave_clicked();void processCapturedImage(int requestId, const QImage& img);public://显示拍照的图像在当前第0个画布void displayImage();void displayCapturedImage();
};

.cpp代码

#include "QCamera_test1.h"
#include <QDateTime>
QCamera_test1::QCamera_test1(QWidget* parent): QMainWindow(parent)
{ui.setupUi(this);//信号与槽点击打开相机按钮connect(ui.btn_open, &QPushButton::clicked, this, &QCamera_test1::btn_sopen_clicked);//信号与槽点击保存相机按钮connect(ui.btn_save, &QPushButton::clicked, this, &QCamera_test1::btn_ssave_clicked);//初始化相机和捕获会话this->_camera = new QCamera(QMediaDevices::defaultVideoInput());this->_captureSession = new QMediaCaptureSession();//拍照功能,QImageCapture 类是一个高级图像录制类。它不是单独使用的,而是用于访问其他媒体对象的媒体录制功能this->imageCapture.reset(new QImageCapture);//imageCapture对象(通过get()方法获取原始指针)设置为mediaCaptureSession对象的图像捕捉设备this->_captureSession->setImageCapture(this->imageCapture.get());//连接信号和槽当图像被捕捉到时,imageCaptured信号会被触发,并调用processCapturedImage方法。connect(this->imageCapture.get(), &QImageCapture::imageCaptured, this, &QCamera_test1::processCapturedImage);// 获取系统上可用的视频输入设备列表存入QList列表中。const QList<QCameraDevice> cameras = QMediaDevices::videoInputs();//for循环,遍历所有摄像头for (const QCameraDevice& cameraDevice : cameras) {//打印摄像头信息qDebug() << cameraDevice.description();//创建摄像头对象,把遍历的摄像头设备放入摄像头对象中(只有一个摄像头的时候)把遍历的cameraDevice放入摄像头对象中_camera//设置摄像头设备,捕获会话视频输出以及摄像头。this->_camera->setCameraDevice(cameraDevice);//设置捕获会话视频输出this->_captureSession->setCamera(this->_camera);//把camera图像放入ui中;this->_captureSession->setVideoOutput(ui.videowidget);} 如果列表不为空,初始化相机和捕获会话  //if (!cameras.isEmpty()) {//	// 假设我们选择第一个摄像头(可以自己来决定)  //	QCameraDevice selectedCamera = cameras.first();//	// 初始化相机对象,并设置选定的摄像头设备  //	this->_camera = new QCamera(selectedCamera);//	// 初始化捕获会话对象,并设置相机和视频输出 ,把第一个相机放入媒体捕捉器中//	this->_captureSession->setCamera(this->_camera);//	//把camera图像放入ui中,在ui中显示。(选一个QWidget形状然后提升为QVideoWidget)//	this->_captureSession->setVideoOutput(ui.videowidget);//	// 开始捕获会话(如果需要的话)  //	// this->_captureSession->start();  //}//else {//	// 处理没有可用摄像头的情况  //	qDebug() << "No cameras available.";//}}QCamera_test1::~QCamera_test1()
{}
//打开摄像头
void QCamera_test1::btn_sopen_clicked()
{_camera->start();
}void QCamera_test1::processCapturedImage(int requestId, const QImage& img) {Q_UNUSED(requestId);QImage scaledImage = img.scaled(ui.videowidget->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);//显示当前图像,4秒之后不再显示,默认保存到系统相册路径下ui.viewfinder->setPixmap(QPixmap::fromImage(scaledImage));QTimer::singleShot(4000, this, &QCamera_test1::displayImage);displayCapturedImage();
}
//显示拍照的图像在当前第0个画布
void QCamera_test1::displayImage() {ui.stackedWidget->setCurrentIndex(0);
}void QCamera_test1::displayCapturedImage() {ui.stackedWidget->setCurrentIndex(1);
}//保存图片
void QCamera_test1::btn_ssave_clicked() {// 获取桌面路径  QString desktopPath = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);//获取当前时间QDateTime currentDataTime = QDateTime::currentDateTime();QString time = currentDataTime.toString("yyyyMMdd_hhmmss");// 构建完整的文件路径,这里使用了一个简单的文件名,你可以根据需要更改  QString filePath = desktopPath + "/captured_image" + time + ".jpg";// 调用 captureToFile 方法保存图片到指定路径  this->imageCapture->captureToFile(filePath);QMessageBox::information(this, "提示", "保存成功");
}

ui文件
在这里插入图片描述

2.QCamera

2.1加入分辨率与帧率的显示与获取
.h文件

#pragma once#include <QtWidgets/QMainWindow>
#include "ui_QCamera_test1.h"
#include <QCamera>
#include <QtMultimedia>
#include <QtMultimediaWidgets>
#include<QMediaCaptureSession>
#include <QMediaDevices>
#include <QImageCapture>//拍照
#include <QVideoSink>//获取分辨率
#include <QCameraDevice>//设置分辨率与帧率
class QCamera_test1 : public QMainWindow
{Q_OBJECTpublic:QCamera_test1(QWidget* parent = nullptr);~QCamera_test1();private:Ui::QCamera_test1Class ui;QCamera* _camera;QMediaCaptureSession* _captureSession;QScopedPointer<QImageCapture> imageCapture;//拍照//QCameraDevice* cameraDevice;//摄像头设备QSize _resolution;//分辨率QSize _frameRate;//帧率QVideoSink* sink;int currentFrameRate; // 新增成员变量来存储当前帧率
public slots:void btn_sopen_clicked();void btn_ssave_clicked();void processCapturedImage(int requestId, const QImage& img);void btn_setfenbianlv_clicked();void onFrameChanged(const QVideoFrame& frame);
public://显示拍照的图像在当前第0个画布void displayImage();void displayCapturedImage();void setCameraResolutionAndFrameRate(const QSize& resolution, int frameRate);};

.cpp文件

#include "QCamera_test1.h"
#include <QDateTime>
QCamera_test1::QCamera_test1(QWidget* parent): QMainWindow(parent)
{ui.setupUi(this);//信号与槽点击打开相机按钮connect(ui.btn_open, &QPushButton::clicked, this, &QCamera_test1::btn_sopen_clicked);//信号与槽点击保存相机按钮connect(ui.btn_save, &QPushButton::clicked, this, &QCamera_test1::btn_ssave_clicked);connect(ui.btn_set_fenbianlv, &QPushButton::clicked, this, &QCamera_test1::btn_setfenbianlv_clicked);//初始化相机和捕获会话this->_camera = new QCamera(QMediaDevices::defaultVideoInput());this->_captureSession = new QMediaCaptureSession();//拍照功能,QImageCapture 类是一个高级图像录制类。它不是单独使用的,而是用于访问其他媒体对象的媒体录制功能this->imageCapture.reset(new QImageCapture);//设置捕获会话this->_captureSession->setImageCapture(this->imageCapture.get());connect(this->imageCapture.get(), &QImageCapture::imageCaptured, this, &QCamera_test1::processCapturedImage);//QMediaDevices::videoInputs() 方法用于获取系统上可用的视频输入设备(如摄像头)的列表。// 这个方法返回一个 QList<QCameraDevice>,其中每个 QCameraDevice 对象都代表一个视频输入设备const QList<QCameraDevice> cameras = QMediaDevices::videoInputs();//for循环,遍历所有摄像头for (const QCameraDevice& cameraDevice : cameras) {//打印摄像头信息qDebug() << cameraDevice.description();//创建摄像头对象,把遍历的摄像头设备放入摄像头对象中(只有一个摄像头的时候)把遍历的cameraDevice放入摄像头对象中_camera//设置摄像头设备,捕获会话视频输出以及摄像头。this->_camera->setCameraDevice(cameraDevice);//设置捕获会话视频输出this->_captureSession->setCamera(this->_camera);//把camera图像放入ui中;this->_captureSession->setVideoOutput(ui.videowidget);}//关于sink的作用,里面包含了关于帧的一些基本信息sink = this->_captureSession->videoSink();connect(sink, &QVideoSink::videoFrameChanged, this, &QCamera_test1::onFrameChanged); 如果列表不为空,初始化相机和捕获会话  //if (!cameras.isEmpty()) {//	// 假设我们选择第一个摄像头(可以自己来决定)  //	QCameraDevice selectedCamera = cameras.first();//	// 初始化相机对象,并设置选定的摄像头设备  //	this->_camera = new QCamera(selectedCamera);//	// 初始化捕获会话对象,并设置相机和视频输出 ,把第一个相机放入媒体捕捉器中//	this->_captureSession->setCamera(this->_camera);//	//把camera图像放入ui中,在ui中显示。(选一个QWidget形状然后提升为QVideoWidget)//	this->_captureSession->setVideoOutput(ui.videowidget);//	// 开始捕获会话(如果需要的话)  //	// this->_captureSession->start();  //}//else {//	// 处理没有可用摄像头的情况  //	qDebug() << "No cameras available.";//}}QCamera_test1::~QCamera_test1()
{}
//打开摄像头
void QCamera_test1::btn_sopen_clicked()
{_camera->start();
}//保存图片
void QCamera_test1::btn_ssave_clicked() {// 获取桌面路径  QString desktopPath = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);//获取当前时间QDateTime currentDataTime = QDateTime::currentDateTime();QString time = currentDataTime.toString("yyyyMMdd_hhmmss");// 构建完整的文件路径,这里使用了一个简单的文件名,你可以根据需要更改  QString filePath = desktopPath + "/captured_image" + time + ".jpg";// 调用 captureToFile 方法保存图片到指定路径  this->imageCapture->captureToFile(filePath);QMessageBox::information(this, "提示", "保存成功");
}
/*** @brief显示图像* @param requestId* @param img*/
void QCamera_test1::processCapturedImage(int requestId, const QImage& img) {Q_UNUSED(requestId);//对获取到的图像进行缩放QImage scaledImage = img.scaled(ui.videowidget->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);//显示当前图像,4秒之后不再显示,默认保存到系统相册路径下ui.viewfinder->setPixmap(QPixmap::fromImage(scaledImage));QTimer::singleShot(4000, this, &QCamera_test1::displayImage);displayCapturedImage();
}
//显示拍照的图像在当前第0个画布
void QCamera_test1::displayImage() {ui.stackedWidget->setCurrentIndex(0);
}
//显示图像在当前第1个画布
void QCamera_test1::displayCapturedImage() {ui.stackedWidget->setCurrentIndex(1);
}//获取分辨率
void QCamera_test1::onFrameChanged(const QVideoFrame& frame) {QSize size = frame.size();qDebug() << "frame size: " << size << "frame rate: " << currentFrameRate;ui.lab_resl->setText(QString("%1 x %2 @ %3 fps").arg(QString::number(size.width()), QString::number(size.height()), QString::number(currentFrameRate)));
}
//设置分辨率
void QCamera_test1::btn_setfenbianlv_clicked() {// 设置相机的分辨率和帧率setCameraResolutionAndFrameRate(QSize(1280, 720), 30);
}
// 设置相机分辨率和帧率的函数
void QCamera_test1::setCameraResolutionAndFrameRate(const QSize& resolution, int frameRate)
{   // 获取相机支持的格式QList<QCameraFormat> supportedFormats = _camera->cameraDevice().videoFormats();for (const QCameraFormat& format : supportedFormats) {if (format.resolution() == resolution && format.maxFrameRate() >= frameRate) {_camera->setCameraFormat(format);currentFrameRate = format.maxFrameRate();break;}}
}

在这里插入图片描述

3.录制视频

.h

#pragma once#include <QtWidgets/QMainWindow>
#include "ui_QCamera_test1.h"
#include <QCamera>
#include <QtMultimedia>
#include <QtMultimediaWidgets>
#include<QMediaCaptureSession>
#include <QMediaDevices>
#include <QImageCapture>//拍照
#include <QVideoSink>//获取分辨率
#include <QCameraDevice>//设置分辨率与帧率
#include <QMediaRecorder>//录制视频
class QCamera_test1 : public QMainWindow
{Q_OBJECTpublic:QCamera_test1(QWidget* parent = nullptr);~QCamera_test1();//********************************************摄像头功能***********************************************
public:void InitCamera();//摄像头初始化
private:Ui::QCamera_test1Class ui;QCamera* _camera;//摄像头QMediaCaptureSession* _captureSession;//捕获会话
public slots:void btn_sopen_clicked();//打开摄像头//	**********************************************拍照功能***********************************************
public:void InitCameraCapture();//拍照初始化void displayImage();//显示拍照的图像在当前第0个画布void displayCapturedImage();//图像在当前第1个画布void setCameraResolutionAndFrameRate(const QSize& resolution, int frameRate);// 设置相机分辨率和帧率的函数
private:QScopedPointer<QImageCapture> imageCapture;//拍照QCameraDevice* cameraDevice;//摄像头设备QVideoSink* sink;//获取分辨率信息int currentFrameRate; // 新增成员变量来存储当前帧率
public slots:void btn_setfenbianlv_clicked();//设置分辨率void onFrameChanged(const QVideoFrame& frame);//获取分辨率void btn_ssave_clicked();//拍照并保存void processCapturedImage(int requestId, const QImage& img);//显示图像到ui界面//	**********************************************录像功能*************************************************
public:void InitRecorder();//录像初始化
private:QMediaRecorder* mediaRecorder;  // 录像器QAudioInput* audioInput;//录音
public slots:void startRecording();  // 开始录像  void stopRecording();   // 停止录像 void onRecorderStateChanged(QMediaRecorder::RecorderState state);//相机录像状态改变void onDurationChanged(qint64 duration);//录像时间
};

​.cpp

#include "QCamera_test1.h"
#include <QDateTime>
QCamera_test1::QCamera_test1(QWidget* parent): QMainWindow(parent)
{ui.setupUi(this);InitCamera();//摄像头初始化InitCameraCapture();//相机拍照初始化InitRecorder();//录制器初始化}QCamera_test1::~QCamera_test1()
{}
//********************************************摄像头功能start***********************************************
//********************************************摄像头功能start***********************************************
//********************************************摄像头功能start***********************************************
/*** @brief 摄像头初始化*/
void QCamera_test1::InitCamera() {//信号与槽点击打开相机按钮connect(ui.btn_open, &QPushButton::clicked, this, &QCamera_test1::btn_sopen_clicked);//初始化相机和捕获会话this->_camera = new QCamera(QMediaDevices::defaultVideoInput());this->_captureSession = new QMediaCaptureSession();//QMediaDevices::videoInputs() 方法用于获取系统上可用的视频输入设备(如摄像头)的列表。// 这个方法返回一个 QList<QCameraDevice>,其中每个 QCameraDevice 对象都代表一个视频输入设备const QList<QCameraDevice> cameras = QMediaDevices::videoInputs();//for循环,遍历所有摄像头for (const QCameraDevice& cameraDevice : cameras) {//打印摄像头信息qDebug() << cameraDevice.description();//创建摄像头对象,把遍历的摄像头设备放入摄像头对象中(只有一个摄像头的时候)把遍历的cameraDevice放入摄像头对象中_camera//设置摄像头设备,捕获会话视频输出以及摄像头。this->_camera->setCameraDevice(cameraDevice);//设置捕获会话视频输出this->_captureSession->setCamera(this->_camera);//把camera图像放入ui中;this->_captureSession->setVideoOutput(ui.videowidget);} 如果列表不为空,初始化相机和捕获会话  //if (!cameras.isEmpty()) {//	// 假设我们选择第一个摄像头(可以自己来决定)  //	QCameraDevice selectedCamera = cameras.first();//	// 初始化相机对象,并设置选定的摄像头设备  //	this->_camera = new QCamera(selectedCamera);//	// 初始化捕获会话对象,并设置相机和视频输出 ,把第一个相机放入媒体捕捉器中//	this->_captureSession->setCamera(this->_camera);//	//把camera图像放入ui中,在ui中显示。(选一个QWidget形状然后提升为QVideoWidget)//	this->_captureSession->setVideoOutput(ui.videowidget);//	// 开始捕获会话(如果需要的话)  //	// this->_captureSession->start();  //}//else {//	// 处理没有可用摄像头的情况  //	qDebug() << "No cameras available.";//}
}
//打开摄像头
void QCamera_test1::btn_sopen_clicked()
{_camera->start();
}
//********************************************摄像头功能end***********************************************
//********************************************摄像头功能end***********************************************
//********************************************摄像头功能end*********************************************************************************************拍照功能start*****************************************************************
**********************************************拍照功能start*****************************************************************
**********************************************拍照功能start*****************************************************************
/*** @brief 拍照初始化*/
void QCamera_test1::InitCameraCapture() {//拍照功能,QImageCapture 类是一个高级图像录制类。它不是单独使用的,而是用于访问其他媒体对象的媒体录制功能this->imageCapture.reset(new QImageCapture);//设置捕获会话this->_captureSession->setImageCapture(this->imageCapture.get());connect(this->imageCapture.get(), &QImageCapture::imageCaptured, this, &QCamera_test1::processCapturedImage);//信号与槽点击保存相机按钮connect(ui.btn_save, &QPushButton::clicked, this, &QCamera_test1::btn_ssave_clicked);connect(ui.btn_set_fenbianlv, &QPushButton::clicked, this, &QCamera_test1::btn_setfenbianlv_clicked);//关于sink的作用,里面包含了关于帧的一些基本信息sink = this->_captureSession->videoSink();connect(sink, &QVideoSink::videoFrameChanged, this, &QCamera_test1::onFrameChanged);}
//保存图片
void QCamera_test1::btn_ssave_clicked() {// 获取桌面路径  QString desktopPath = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);//获取当前时间QDateTime currentDataTime = QDateTime::currentDateTime();QString time = currentDataTime.toString("yyyyMMdd_hhmmss");// 构建完整的文件路径,这里使用了一个简单的文件名,你可以根据需要更改  QString filePath = desktopPath + "/captured_image" + time + ".jpg";// 调用 captureToFile 方法保存图片到指定路径  this->imageCapture->captureToFile(filePath);QMessageBox::information(this, "提示", "保存成功");
}
/*** @brief显示图像* @param requestId* @param img*/
void QCamera_test1::processCapturedImage(int requestId, const QImage& img) {Q_UNUSED(requestId);//对获取到的图像进行缩放QImage scaledImage = img.scaled(ui.videowidget->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);//显示当前图像,4秒之后不再显示,默认保存到系统相册路径下ui.viewfinder->setPixmap(QPixmap::fromImage(scaledImage));QTimer::singleShot(4000, this, &QCamera_test1::displayImage);displayCapturedImage();
}
//显示拍照的图像在当前第0个画布
void QCamera_test1::displayImage() {ui.stackedWidget->setCurrentIndex(0);
}
//显示图像在当前第1个画布
void QCamera_test1::displayCapturedImage() {ui.stackedWidget->setCurrentIndex(1);
}//获取分辨率
void QCamera_test1::onFrameChanged(const QVideoFrame& frame) {QSize size = frame.size();qDebug() << "frame size: " << size << "frame rate: " << currentFrameRate;ui.lab_resl->setText(QString("%1 x %2 @ %3 fps").arg(QString::number(size.width()), QString::number(size.height()), QString::number(currentFrameRate)));
}
//设置分辨率
void QCamera_test1::btn_setfenbianlv_clicked() {// 设置相机的分辨率和帧率setCameraResolutionAndFrameRate(QSize(1280, 720), 15);
}
// 设置相机分辨率和帧率的函数
void QCamera_test1::setCameraResolutionAndFrameRate(const QSize& resolution, int frameRate)
{// 获取相机支持的格式QList<QCameraFormat> supportedFormats = _camera->cameraDevice().videoFormats();for (const QCameraFormat& format : supportedFormats) {if (format.resolution() == resolution && format.maxFrameRate() >= frameRate) {_camera->setCameraFormat(format);currentFrameRate = format.maxFrameRate();break;}}
}
**********************************************拍照功能end*****************************************************************
**********************************************拍照功能end*****************************************************************
**********************************************拍照功能end***************************************************************************************************************录像功能start*****************************************************************
**********************************************录像功能start*****************************************************************
**********************************************录像功能start*****************************************************************/*** @brief 初始化媒体录制器*/
void QCamera_test1::InitRecorder() {//初始化媒体录制器mediaRecorder = new QMediaRecorder(this->_camera);connect(ui.btn_start_recording, &QPushButton::clicked, this, &QCamera_test1::startRecording);connect(ui.btn_stop_recording, &QPushButton::clicked, this, &QCamera_test1::stopRecording);connect(mediaRecorder, &QMediaRecorder::recorderStateChanged, this, &QCamera_test1::onRecorderStateChanged);connect(mediaRecorder, &QMediaRecorder::durationChanged, this, &QCamera_test1::onDurationChanged);
}//开始录像
void QCamera_test1::startRecording()
{// 初始化媒体录制器  _captureSession->setRecorder(mediaRecorder);mediaRecorder->setVideoResolution(1280, 720);  // 设置默认分辨率 mediaRecorder->setQuality(QMediaRecorder::HighQuality);mediaRecorder->setOutputLocation(QUrl::fromLocalFile(QCoreApplication::applicationDirPath() + "/demo.mp4"));mediaRecorder->setEncodingMode(QMediaRecorder::ConstantQualityEncoding);mediaRecorder->setAudioChannelCount(mediaRecorder->audioChannelCount());if (mediaRecorder->recorderState() != QMediaRecorder::RecordingState) {// 获取桌面路径用于保存录像    QString desktopPath = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);QDateTime currentDataTime = QDateTime::currentDateTime();QString time = currentDataTime.toString("yyyyMMdd_hhmmss");QString filePath = desktopPath + "/recorded_video" + time + ".mp4";mediaRecorder->setOutputLocation(QUrl::fromLocalFile(filePath));mediaRecorder->record();}else {qDebug() << "Camera is not active or already recording.";}
}
/*** @brief 停止录制*/
void QCamera_test1::stopRecording()
{mediaRecorder->stop();
}
/*** @brief* @param state 相机录像状态改变*/
void QCamera_test1::onRecorderStateChanged(QMediaRecorder::RecorderState state)
{switch (state) {case QMediaRecorder::RecordingState:qDebug() << "Recording started.";break;case QMediaRecorder::StoppedState:qDebug() << "Recording stopped.";QMessageBox::information(this, "提示", "录制成功");break;default:break;}
}
/*** @brief 录制时间* @param duration*/
void QCamera_test1::onDurationChanged(qint64 duration)
{qDebug() << "Recording duration:" << QTime::fromMSecsSinceStartOfDay(duration).toString("hh:mm:ss.zzz");ui.labelTime88->setText(QTime::fromMSecsSinceStartOfDay(duration).toString("hh:mm:ss.zzz"));
}
**********************************************录像功能end*****************************************************************
**********************************************录像功能end*****************************************************************
**********************************************录像功能end*****************************************************************

在这里插入图片描述


http://www.ppmy.cn/news/1534418.html

相关文章

Linux下驱动开发实例

驱动开发 驱动与硬件的分离 在传统的嵌入式系统开发中&#xff0c;硬件信息往往是直接硬编码在驱动代码中的。这样做的问题是&#xff0c;当硬件发生变化时&#xff0c;比如增加或更换设备&#xff0c;就需要修改驱动程序的代码&#xff0c;这会导致维护成本非常高。因此&…

Flume面试整理-Flume是什么?

Apache Flume 是一个分布式的、可靠的、高可用的数据收集和传输系统,专为从各种数据源(如日志文件、网络流)收集、聚合和传输大量数据而设计。它主要用于在大数据生态系统中,特别是Hadoop环境中,将数据从多个分散的来源实时地传输到一个集中的存储系统(如HDFS、HBase等)…

【30天玩转python】自动化与脚本编写

自动化与脚本编写 Python 因其简洁的语法和强大的标准库&#xff0c;非常适合用于自动化任务和编写脚本。通过编写 Python 脚本&#xff0c;可以自动执行重复性工作、简化日常任务、批量处理文件和数据&#xff0c;甚至管理服务器等。本篇文章将介绍如何使用 Python 编写自动化…

Go语言实现长连接并发框架 - 路由分组

文章目录 前言接口结构体接口实现项目地址最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;我们上篇博客实现了任务执行流的路由模块&#xff0c;接下来我们实现一下对任务执行流进行任务 接口 trait/router_group.go type RouterGroup interface {RouterGroup(flow ..…

yolov8/9/10模型在安全帽、安全衣检测中的应用【代码+数据集+python环境+GUI系统】

yolov8910模型安全帽、安全衣检测中的应用【代码数据集python环境GUI系统】 yolov8/9/10模型在安全帽、安全衣检测中的应用【代码数据集python环境GUI系统】 背景意义 安全帽和安全衣在工业生产、建筑施工等高风险作业环境中是保护工人免受意外伤害的重要装备。然而&#xff0…

Redis中String类型的常用命令(append,getrenge,setrange等命令)

Redis----String命令 前言.常见的String存储类型. 常见命令1. set 命令2. get 命令3. mget命令与mset命令4. setnx命令5. setex与psetex命令6. incr与incrby与incrbyfloat命令7. decr与decrby命令8. append命令9. getrange和setrange命令10. strlen命令. 前言. 常见的String存…

Tomcat监控与调优:比Tomcat Manager更加强大的Psi-Probe

这是一款 Tomcat 管理和监控工具&#xff0c;前身是 Lambda Probe。由于 Lambda Probe 2006不再更新&#xff0c;所以 PSI Probe 算是对其的一个 Fork 版本并一直更新至今。 Probe psi-probe是在相同的开源许可证(GPLV2)下分发的社区驱动的 Lambda Probe &#xff0c;psi-pro…

使用 cron 来设置定时任务

使用 cron 来设置定时任务&#xff0c;以便定期运行这个脚本。 在 Linux 系统中设置定时任务的步骤&#xff1a; 1. 编辑 cron 任务 打开终端并输入以下命令以编辑 crontab 文件&#xff1a; crontab -e2. 设置每天 8 点运行脚本 在 crontab 文件的最后&#xff0c;添加以下…