pyQT + OpenCV相关练习
一、设计思路
1、思路分析与设计
本段代码是一个使用 PyQt6 和 OpenCV 创建的图像处理应用程序。其主要功能是通过一个图形界面让用户对图片进行基本的图像处理操作,如灰度化、翻转、旋转、亮度与对比度调整,以及一些滤镜效果(模糊、锐化、边缘检测等)。应用程序的核心思想是将图像通过不同的算法进行处理,并通过一个图形用户界面与用户进行交互。
2、主要设计思路:
界面设计:
通过 PyQt6 提供的 QWidget
基础类构建一个窗口界面。
在界面中使用了 QLabel
显示图像,使用 QPushButton
实现用户操作按钮,使用 QSlider
控制图像亮度和对比度,使用 QComboBox
提供滤镜选择。
图像加载与转换:
使用 OpenCV 的 cv2.imread()
函数加载图像。
将 OpenCV 中使用的 BGR 图像格式转换为适合 PyQt6 显示的 RGB 格式,并将其转换为 QImage
,然后再转换为 QPixmap
显示在 QLabel
上。
事件与信号槽机制:
通过 PyQt6 提供的信号-槽机制将 GUI 元素(如按钮、滑块、下拉框)与对应的处理函数进行关联。
点击按钮或滑动滑块时,程序会相应地调用相应的图像处理函数,处理后的图像通过更新 QLabel
的显示内容反馈给用户。
图像处理:
灰度化:将图片转换为灰度图像,通过 cv2.cvtColor()
函数实现。
翻转:通过 cv2.flip()
函数实现水平翻转。
旋转:通过 cv2.getRotationMatrix2D()
和 cv2.warpAffine()
函数实现图片的旋转。
亮度与对比度调整:通过滑块获取当前值,对图像进行线性亮度和对比度调整。
滤镜处理:通过下拉框选择不同的滤镜效果,如模糊、锐化、边缘检测等,利用 OpenCV 中的相应函数(如 cv2.blur()
、cv2.GaussianBlur()
、cv2.Canny()
)处理图像。
保存图片:
用户可以通过按钮将处理后的图像保存到本地。
二、设计到的函数方法
1. Qimg(self, img)
功能:将 OpenCV 图像格式(BGR)转换为 PyQt6 可以显示的格式(RGB 和 QImage
)。
实现:
使用 cv2.cvtColor()
将图像从 BGR 转换为 RGB 格式。
使用 QImage
类构造图像对象,准备好用于显示。
2. gray_image(self)
功能:将图像转换为灰度图像并更新显示。
实现:
使用 cv2.cvtColor()
将图像转换为灰度图。
更新 QLabel
中显示的图像。
3. rec(self)
功能:恢复原图,重新加载图片。
实现:
使用 cv2.imread()
重新加载原始图片并更新显示。
4. flip(self)
功能:翻转图像(水平翻转)。
实现:
使用 cv2.flip()
执行水平翻转。
更新显示的图像。
5. warp(self)
功能:旋转图像(90度旋转)。
实现:
使用 cv2.getRotationMatrix2D()
和 cv2.warpAffine()
进行旋转。
更新显示的图像。
6. bright(self)
功能:调整图像的亮度和对比度。
实现:
获取滑块的值,计算出相应的亮度和对比度调整系数。
使用这些系数调整图像的像素值,并更新显示。
7. save(self)
功能:保存当前图像到本地文件。
实现:
使用 cv2.imwrite()
保存图像。
8. dispose(self)
功能:根据选择的滤镜效果(模糊、锐化、边缘检测)处理图像。
实现:
使用下拉框选择不同的滤镜效果,并根据选择的内容应用相应的图像处理方法。
三、代码
import cv2
import numpy as npimport sysfrom PyQt6 import uic
from PyQt6.QtGui import QPixmap, QImage
from PyQt6.QtWidgets import QWidget, QApplication, QLabel, QPushButton, QSlider, QComboBox# 创建一个继承自QWidget的自定义窗口类
class MyWidget(QWidget):def __init__(self):super().__init__()# 加载并初始化UI文件ui = uic.loadUi("./Form.ui", self)# 加载初始图片,并为其创建副本和QImage对象self.img = cv2.imread("../demo.png") # 读取图片self.img_2 = self.img.copy() # 创建图片副本,用于亮度和对比度调整self.q_img = self.Qimg(self.img) # 将OpenCV格式的图像转换为QImage格式# 初始化UI组件,包括标签、按钮、滑块等self.label: QLabel = ui.labelself.pushButton: QPushButton = ui.pushButtonself.pushButton_2: QPushButton = ui.pushButton_2self.pushButton_3: QPushButton = ui.pushButton_3self.pushButton_4: QPushButton = ui.pushButton_4self.horizontalSlider: QSlider = ui.horizontalSlider # 亮度滑块self.horizontalSlider.setRange(0, 50) # 设置亮度调整范围self.horizontalSlider.setValue(0) # 设置默认亮度值为0self.horizontalSlider_2: QSlider = ui.horizontalSlider_2 # 对比度滑块self.horizontalSlider_2.setRange(1, 100) # 设置对比度调整范围self.horizontalSlider_2.setValue(1) # 设置默认对比度值为1self.pushButton_5: QPushButton = ui.pushButton_5 # 保存按钮self.comboBox: QComboBox = ui.comboBox # 下拉框,用于选择滤镜效果# 连接按钮的点击事件到相应的槽函数self.pushButton.clicked.connect(self.gray_image) # 点击“灰度化”按钮self.pushButton_2.clicked.connect(self.rec) # 点击“恢复”按钮self.pushButton_3.clicked.connect(self.flip) # 点击“翻转”按钮self.pushButton_4.clicked.connect(self.warp) # 点击“旋转”按钮self.horizontalSlider.valueChanged.connect(self.bright) # 亮度滑块改变时self.horizontalSlider_2.valueChanged.connect(self.bright) # 对比度滑块改变时self.pushButton_5.clicked.connect(self.save) # 点击“保存”按钮self.comboBox.currentIndexChanged.connect(self.dispose) # 选择滤镜时# 为下拉框添加滤镜选项list1 = [' ','模糊', '锐化', '边缘检测']self.comboBox.addItems(list1)# 将QImage转换为QPixmap并设置为label的图片显示self.label.setPixmap(QPixmap.fromImage(self.q_img))self.label.setScaledContents(True) # 设置图片自适应标签大小# 设置标志位,用于判断是否已经应用灰度化self.slot = False# 图片转换函数,将OpenCV格式的BGR图片转换为QImage格式def Qimg(self, img):img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 将BGR图像转换为RGBh, w, c = img_rgb.shape # 获取图像的高度、宽度和通道数bytes_per_line = c * w # 每行字节数q_img = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888) # 转换为QImagereturn q_img# 定义将图片灰度化的按钮响应函数def gray_image(self):if not self.slot: # 判断是否已经灰度化过self.img = cv2.cvtColor(self.img, cv2.COLOR_BGR2GRAY) # 将图片转换为灰度图q_img = self.Qimg(self.img) # 转换为QImage格式self.label.setPixmap(QPixmap.fromImage(q_img)) # 更新显示的图片self.slot = True # 更新标志位,表示已经灰度化# 定义恢复原图的按钮响应函数def rec(self):self.img = cv2.imread('../demo.png') # 重新加载原始图片self.q_img = self.Qimg(self.img) # 转换为QImage格式self.label.setPixmap(QPixmap(self.q_img)) # 更新显示的图片self.slot = False # 重置标志位,表示恢复为原图# 定义图片翻转的按钮响应函数def flip(self):self.img = cv2.flip(self.img, 1) # 进行水平翻转self.q_img = self.Qimg(self.img) # 转换为QImage格式self.label.setPixmap(QPixmap.fromImage(self.q_img)) # 更新显示的图片# 定义图片旋转的按钮响应函数def warp(self):M = cv2.getRotationMatrix2D((self.img.shape[1] / 2, self.img.shape[0] / 2), 90, 1) # 获取旋转矩阵self.img = cv2.warpAffine(self.img, M, (self.img.shape[1], self.img.shape[0])) # 应用旋转self.q_img = self.Qimg(self.img) # 转换为QImage格式self.label.setPixmap(QPixmap.fromImage(self.q_img)) # 更新显示的图片# 定义亮度和对比度调整的函数def bright(self):brightness = self.horizontalSlider.value() # 获取当前亮度值contrast = self.horizontalSlider_2.value() / 100 + 1 # 获取当前对比度值,范围在1到2之间img_copy = contrast * self.img_2 + brightness # 应用对比度和亮度调整img_copy = np.clip(img_copy, 0, 255) # 保证像素值在0到255之间img_copy = np.uint8(img_copy) # 转换为无符号8位整数类型self.img = img_copy # 更新图片self.q_img = self.Qimg(self.img) # 转换为QImage格式self.label.setPixmap(QPixmap.fromImage(self.q_img)) # 更新显示的图片# 定义保存图片的函数def save(self):cv2.imwrite('./img.png', self.img) # 保存当前图片到本地文件# 根据选择的滤镜效果处理图片def dispose(self):# - 模糊——使用cv2.GaussianBlur()实现# - 锐化——使用cv2.Laplacian()、cv2.Sobel()实现# - 边缘检测——使用cv2.Canny()实现if self.comboBox.currentText() == ' ':self.rec()elif self.comboBox.currentText() == '模糊':self.img = cv2.GaussianBlur(self.img, (5, 5), 0)self.q_img = self.Qimg(self.img) # 转换为QImage格式self.label.setPixmap(QPixmap.fromImage(self.q_img))elif self.comboBox.currentText() == '锐化':self.img = cv2.Laplacian(self.img, cv2.CV_64F)self.img = cv2.convertScaleAbs(self.img)self.q_img = self.Qimg(self.img) # 转换为QImage格式self.label.setPixmap(QPixmap.fromImage(self.q_img)) # 更新显示的图片elif self.comboBox.currentText() =='边缘检测':M = cv2.Canny(self.img, 100, 200) # 应用Canny边缘检测算法contours, h = cv2.findContours(M, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 查找轮廓self.img = cv2.drawContours(self.img, contours, -1, (0, 255, 0), 3) # 绘制轮廓self.q_img = self.Qimg(self.img) # 转换为QImage格式self.label.setPixmap(QPixmap.fromImage(self.q_img)) # 更新显示的图片# 主程序入口
if __name__ == '__main__':app = QApplication(sys.argv) # 创建应用对象myWidget = MyWidget() # 创建自定义窗口对象myWidget.show() # 显示窗口sys.exit(app.exec()) # 进入应用的事件循环
四、效果展示
原始界面
灰度化
恢复
翻转
旋转
亮度
对比度
模糊
锐化
边缘检测
保存
相关文章:
pyQT + OpenCV相关练习
一、设计思路 1、思路分析与设计 本段代码是一个使用 PyQt6 和 OpenCV 创建的图像处理应用程序。其主要功能是通过一个图形界面让用户对图片进行基本的图像处理操作,如灰度化、翻转、旋转、亮度与对比度调整,以及一些滤镜效果(模糊、锐化、边…...
石岩路边理发好去处
周末带娃去罗租公园玩,罗租公园旁边就是百佳华和如意豪庭小区,发现如意豪庭小区对面挺多路边理发摊点 理发摊点聚焦在这里的原因是刚好前面城管来了暂时避避,例如还有一个阿姨剪到一半就跟着过来。这里的城管只是拍了一处没有摊位的地方&…...
音视频入门基础:MPEG2-PS专题(2)——使用FFmpeg命令生成ps文件
一、错误的命令 通过FFmpeg命令可以将mp4文件转换为ps文件,PS文件中包含PS流数据。 由于PS流/PS文件对应的FFInputFormat结构为: const FFInputFormat ff_mpegps_demuxer {.p.name "mpeg",.p.long_name NULL_IF_CONFIG_SMALL…...
整合版canal ha搭建--基于1.1.4版本
开启MySql Binlog(1)修改MySql配置文件(2)重启MySql服务,查看配置是否生效(3)配置起效果后,创建canal用户,并赋予权限安装canal-admin(1)解压 canal.admin-1…...
[python SQLAlchemy数据库操作入门]-15.联合查询,跨表获取股票数据
哈喽,大家好,我是木头左! 在开始探讨如何利用SQLAlchemy实现复杂的联合查询之前,首先需要深入理解其核心组件——对象关系映射(ORM)。ORM允许开发者使用Python类来表示数据库中的表,从而以一种更直观、面向对象的方式来操作数据库。 SQLAlchemy中的JOIN操作详解 在SQLA…...
PTA数据结构作业一
6-1 链表的插入算法 本题要求实现一个插入函数,实现在链表llist中的元素x之后插入一个元素y的操作。 函数接口定义: int InsertPost_link(LinkList llist, DataType x, DataType y); 其中 llist是操作的链表,x是待插入元素y的前驱节点元素…...
前端(九)js介绍(2)
js介绍(2) 文章目录 js介绍(2)一、函数1.1函数的两种形式1.2函数的作用域1.3声明与提升 二、bom操作三、dom操作 一、函数 1.1函数的两种形式 //有参函数 //js中的函数只能返回一个值,如果要返回多个需要放在数组或对象中 function func(a,b){return ab } func(1,…...
CUTLASS:高性能 CUDA 线性代数模板库详解
CUTLASS:高性能 CUDA 线性代数模板库详解 引言什么是 CUTLASS?CUTLASS 的主要特点: CUTLASS 的用途如何安装 CUTLASS1. 环境准备2. 下载 CUTLASS3. 构建 CUTLASS4. 设置环境变量5. 验证安装 使用 CUTLASSCUTLASS 的优势总结 引言 在深度学习…...
关于CISP报名费用详情
CISP即“注册信息安全专业人员”,是中国信息安全测评中心实施的国家认证项目,旨在培养信息安全领域的专业人才。对于有意报考CISP的考生而言,了解报名考试费用是备考过程中不可或缺的一环。 CISP的报名考试费用主要包括培训费用、考试费用、…...
css 关于flex布局中子元素的属性flex
css flex布局中子元素的属性flex 1. flex 是 flex-grow、flex-shrink 和 flex-basis 的简写 语法格式: flex: [flex-grow] [flex-shrink] [flex-basis];各属性解析: flex-grow: 子元素如何按比例分配父元素的 剩余空间。 默认值:0&#…...
功率器件热设计基础(四)——功率半导体芯片温度和测试方法
/ 前言 / 功率半导体热设计是实现IGBT、碳化硅SiC高功率密度的基础,只有掌握功率半导体的热设计基础知识,才能完成精确热设计,提高功率器件的利用率,降低系统成本,并保证系统的可靠性。 功率器件热设计基础系列文章会…...
OpenStack系列第四篇:云平台基础功能与操作(Dashboard)
文章目录 1. 镜像(Image)添加镜像查看镜像删除镜像 2. 卷(Volume)创建卷查看卷删除卷 3. 网络(虚拟网络)创建网络查看网络删除网络 4. 实例类型创建实例类型查看实例类型删除实例类型 4. 密钥对(…...
WebSocket封装
提示:记录工作中遇到的需求及解决办法 文章目录 前言二、背景三、WebSocket3.1 什么是 WebSocket ?为什么使用他?四、封装 WebSocket4.1 Javascript 版本4.2 Typescript 版本4.3 如何使用?五、我的痛点如何处理前言 本文将介绍 WebSocket 的封装,比如:心跳机制,重连和一…...
面试题解,JVM的运行时数据区
一、请简述JVM运行时数据区的组成结构及各部分作用 总览 从线程持有的权限来看 线程私有区 虚拟机栈 虚拟机栈是一个栈结构,由许多个栈帧组成,一个方法分配一个栈帧,线程每执行一个方法时都会有一个栈帧入栈,方法执行结束后栈帧…...
【Ubuntu使用技巧】Ubuntu22.04无人值守Crontab工具实战详解
一个愿意伫立在巨人肩膀上的农民...... Crontab是Linux和类Unix操作系统下的一个任务调度工具,用于周期性地执行指定的任务或命令。Crontab允许用户创建和管理计划任务,以便在特定的时间间隔或时间点自动运行命令或脚本。这些任务可以按照分钟、小时、日…...
Caffeine Cache Java缓存组件
缓存组件Caffeine Cache 定义介绍整合springboot用法整合spring-boot-starter-cache用法 定义介绍 特性 高性能:基于高效并发设计和 TinyLFU 算法,命中率高。 丰富策略:支持容量限制、过期时间、异步加载、自定义清理策略。 统计监控&#x…...
电子电气架构 --- 什么是自动驾驶技术中的域控制单元(DCU)?
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...
Redis核心技术知识点全集
Redis数据结构和常用命令 1. String字符串2. Hash哈希3. List列表4. Set集合5. Sorted Set有序集合6. Redis常用命令参考Redis事务机制...
【每日学点鸿蒙知识】文件读写、屏幕宽度亮度、扫一扫权限、编码器问题、wlan设置
1、参照文档,在操作文件时,读取不到内容或出现程序闪退? 参照文档,进行文件写入和读取时,出现读取不到或闪退 export function createFile() {// 获取应用文件路径let context getContext(this) as common.UIAbilit…...
后端开发-Maven
环境说明: windows系统:11版本 idea版本:2023.3.2 Maven 介绍 Apache Maven 是一个 Java 项目的构建管理和理解工具。Maven 使用一个项目对象模型(POM),通过一组构建规则和约定来管理项目的构建…...
LiteFlow 流程引擎引入Spring boot项目集成pg数据库
文章目录 官网地址简要项目引入maven 所需jar包配置 PostgreSQL 数据库表使用LiteFlow配置 yml 文件通过 代码方式使用 liteflow数据库sql 数据在流程中周转 官网地址 https://liteflow.cc/ 简要 如果你要对复杂业务逻辑进行新写或者重构,用LiteFlow最合适不过。…...
电子电气架构 --- 汽车电子电器设计概述
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...
API 设计:从基础到最佳实践
https://levelup.gitconnected.com/api-design-101-from-basics-to-best-practices-a0261cdf8886 在本次深入研究中,我们将从基础开始,逐步了解 API 设计,并逐步实现定义卓越 API 的最佳实践。 作为开发人员,您可能熟悉其中的许多…...
简易内存池(中)
提示:文章 文章目录 前言一、背景二、第二版代码用例2用例3用例4用例5 总结 前言 前期疑问: 本文目标: 一、背景 最近 二、 针对上述失败用例,修改代码如下 第二版代码 #include <stdbool.h> #include <stdio.h>…...
svn不能添加.a文件
解决办法 在home目录下有一个.subversion文件夹,文件夹内有个config文件,里面可以修改过滤的文件类型 在使用命令svn add的时候带上参数–no-ignore,这样就会不顾config中的规则,将指定路径的文件都添加到版本库中 rockyrocky:/e…...
PH47代码框架 24241231 重要更新
仪式感一下:2024年最后一天,发布 PH47 代码框架的一次重要更新。当然这并不是有意的,而是直到现在才把更新的所有工作全部做完(希望确实如此)。 本次更新要点: 1、加入多IMU支持。本次更新正式加入对 MPU65…...
小程序信息收集(小迪网络安全笔记~
免责声明:本文章仅用于交流学习,因文章内容而产生的任何违法&未授权行为,与文章作者无关!!! 附:完整笔记目录~ ps:本人小白,笔记均在个人理解基础上整理,…...
用户界面的UML建模07
4.2 抽象表示层的行为(Abstract Presentation Behaviour) AbstractForm 类定义了一组如下所示的四种操作: showForm() , getData() , sendConfirmation() 和sendCancellation()。在该阶段的设计过程(desig…...
LabVIEW手部运动机能实验系统
在运动科学、人机交互和康复训练等领域,手部运动功能的研究具有重要的应用价值。开发了一个基于LabVIEW的手部运动机能实验系统设计,该系统利用力量作为关键参数,通过实时数据采集和反馈帮助受试者完成精确的手部动作,同时为研究人…...
Java Map 源码解析:核心原理与应用
Java Map 源码解析:核心原理与应用 Java 的 Map 接口是集合框架中一个重要的组成部分,专门用于存储键值对。其强大的功能和灵活的实现使其在各种应用场景中得到了广泛的使用。本文面向对 Java 集合框架有一定了解的开发者,通过对 Map 接口及…...
基于Mosquito源码理解MQTT5.0的属性概念
MQTT 5.0协议相比之前的版本(如MQTT 3.1.1)增加了很多属性,这些属性分布于报文的可变头部(Variable Header)和有效载荷(Payload)中。这些属性大大增强了协议的可扩展性和灵活性,使其能够更好地适应现代物联网应用的复杂需求。 属性的定义在源码包mosquitto-2.0.18/inc…...
easyui textbox使用placeholder无效
easyui textbox使用placeholder无效 在easyui 的textbox控件,请使用data-options 设定 示例 <input type text class easyui-textbox data-options "prompt:请输入您的邮箱"/>...
java AQS
什么是AQS AQS(AbstractQueuedSynchronizer,抽象队列同步器)是 Java 中并发控制的一种机制,位于 java.util.concurrent.locks 包下,它为构建锁、信号量等同步工具提供了一个框架。AQS 通过 队列 来管理多个线程之间的…...
机器人对物体重定向操作的发展简述
物体重定向操作的发展简述 前言1、手内重定向和外部重定向2、重定向原语3、重定向状态转换网络4、连续任意姿态的重定向5、利用其他环境约束重定向总结Reference 前言 对于一些特殊的任务(如装配和打包),对物体放置的位姿由明确的要求&#…...
数据结构与算法之动态规划: LeetCode 72. 编辑距离 (Ts版)
编辑距离 https://leetcode.cn/problems/edit-distance/description/ 描述 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数你可以对一个单词进行如下三种操作: 插入一个字符删除一个字符替换一个字符 示例 1 输入&…...
vue3 Teleport瞬移组件
Teleport是瞬移组件,也称为传送门组件 它是一个可以使元素从一个组件转到另一个组件的组件。 如对话框、自定义菜单、警告提示、徽章,以及许多其他需要出现在特殊位置的自定义UI组件。假设现在页面中有两个元素,分别为div元素和button按钮元…...
Go语言学习路线
以下是一个较为系统的Go语言学习路线: 一、基础阶段 环境搭建与工具链熟悉 安装Go语言开发环境。在Go官方网站(https://golang.org/dl/)下载适合您操作系统的安装包并完成安装。 配置Go环境变量,如GOPATH和GOROOT。GOROOT是Go语…...
摄像头监视脚本
摄像头监视脚本,若检测到摄像头画面有变化,保存这一段视频 一、使用方法 1.运行脚本 默认参数Threshold3, Period3, path./recordings python cam.py --threshold30 --period3 --path./recordings 2.参数说明 threshold:摄像头捕获到的画面变化量阈值…...
【Leecode】Leecode刷题之路第97天之交错字符串
题目出处 97-交错字符串-题目出处 题目描述 个人解法 思路: todo代码示例:(Java) todo复杂度分析 todo官方解法 97-交错字符串-官方解法 方法1:动态规划 思路: class Solution {public boolean isInte…...
MAC环境安装(卸载)软件
MAC环境安装(卸载)软件 jdknode安装node,并实现不同版本的切换背景 卸载node从node官网下载pkg安装的node卸载用 homebrew 安装的node如果你感觉删的不够干净,可以再细分删除验证删除结果 jdk 1.下载jdk 先去官网下载自己需要的版…...
Spring Boot + Redisson 封装分布式锁
目标:一行代码调用,简单粗暴。 基操:自动加锁,自动解锁,自动处理异常,自动处理锁超时等。 安装 redis redisson <dependency><groupId>org.springframework.boot</groupId><artifac…...
从零开发一套UWB定位系统需要多长时间?UWB超宽带定位系统源码
从零开发一套UWB定位系统需要多长时间? 从零开发一套UWB定位系统所需的时间会受到多种因素的影响,以下是详细分析: 一、系统复杂度 1、基本功能定位系统 如果只是开发一个简单的UWB定位系统,仅实现基本的定位功能,如在…...
DataCap 2024.4.1 版本发布:MongoDB 驱动支持、工作流引擎升级
尊敬的 DataCap 用户: DataCap 2024.4.1 版本现已正式发布。本次更新包含多项重要功能升级和性能优化,现将主要更新内容公布如下: 核心功能升级 数据库功能增强 (实现功能) 新增数据库管理功能:支持创建、删除和切换数据库完善表…...
常见端口(22、25、53、80、443、110、143、3306、6379、21)和服务的安装与配置手册
文章目录 一、系统初始设置1. 系统与工具的基础配置1.1 系统更新1.2 网络连接测试1.3 工具安装 2. 防火墙配置2.1 启用防火墙服务2.2 检查默认规则2.3 开放常用端口2.4 查看已开放端口 二、常见端口及其用途1. 端口 22(SSH)2. 端口 25(SMTP&a…...
使用maven-mvnd替换maven大大提升编译打包速度
先上结论!!! 多模块清理并打包提升:约3.5倍 多模块不清理打包提升:约5.5倍 单模块提升:约2倍 从计算结果来看,多模块提升的效率更高。在使用mvnd package打包多模块式,可在控制台…...
图像去雾 | 基于Matlab的图像去雾系统(四种方法)
图像去雾 | 基于Matlab的图像去雾系统(四种方法) 目录 图像去雾 | 基于Matlab的图像去雾系统(四种方法)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于Matlab的图像去雾系统(四种方法) 关于图像…...
【Ubuntu 系统 之 开启远程桌面SSH登录】
【Ubuntu 系统 之 开启远程桌面&SSH登录】 一、开启 SSH 登录二、开启远程桌面1、更新包管理器并安装 xrdp1.1、遇到错误1.2、解决方法 2、安装桌面环境(如果服务器上没有 GUI)3、配置 xrdp 使用默认的 GNOME 桌面环境4、配置防火墙允许远程桌面连接…...
利用 AI 生成 XMind 思维导图教程
本文将介绍如何使用 AI 工具(如 ChatGPT 等),从无到有生成层次分明、可直接导入到 XMind 的 Markdown 格式思维导图。主要步骤包括:选择主题、编写并润色 Markdown 文档、在 XMind 中进行导入与可视化。 一、为什么使用 AI XMind…...
电子应用设计方案81:智能AI冲奶瓶系统设计
智能 AI 冲奶瓶系统设计 一、引言 智能 AI 冲奶瓶系统旨在为父母或照顾者提供便捷、准确和卫生的冲奶服务,特别是在夜间或忙碌时,减轻负担并确保婴儿获得适宜的营养。 二、系统概述 1. 系统目标 - 精确调配奶粉和水的比例,满足不同年龄段婴…...
MySQL的索引
没有索引会怎么样 数据库中的数据最终是存储在磁盘上的。 mysql服务器,本质上是内存进程,CURD操作全都是在内存中进行的—索引也是如此。 所以,需要将数据从磁盘读进内存,才能进行操作。 如果没有索引,表中的数据会向…...