Opencv与PyQt5设计一个摄像头界面

一、前言

本篇的内容是学习的这一位博主的:程序界面设计_Doc_Cheng的博客-CSDN博客。

这是我见过很详细的教你如何使用的PyQt5来完成UI界面设计的,专注于UI界面设计。对我而言,这教程就像是一个实用工具,因为我只需要能够显示图像并展示模型推理的结果即可。

最近一直在努力改进网络和编写脚本,已经有一段时间没写博客了。因此,我打算重新整理这位博主的内容,争取以更简单的方式呈现。

二、UI界面设计

预览图如下所示:

这里我们主要讲解代码部分,UI文件我会直接的提供给大家,大家可以下载下来后再对照着学习。

三、代码讲解

当我们使用PyUIC生成代码的时候,一般情况下这个类下有两个函数:setupUi和retranslateUi。

一般而言,这两个方法用于设置用户界面的初始化和翻译文本。在 setupUi 中,会设置窗口、布局、按钮、文本框等元素的属性和初始状态;而在 retranslateUi 中,会设置用户界面元素的文本内容。

如果我们只是想要一个像上面的一个浏览图,你可以直接使用下面的代码直接进行预览,它本身并没有任何的功能,只是将UI界面的布局展示出来了,要想做更多的事情,那就需要给这个类补充更多的功能。

from OboardCamDisp import Ui_MainWindowimport sys
from PyQt5.QtWidgets import QApplication, QMainWindowclass CamShow(QMainWindow, Ui_MainWindow):def __init__(self, parent=None):super(CamShow, self).__init__(parent)self.setupUi(self)if __name__ == '__main__':app = QApplication(sys.argv)ui=CamShow()ui.show()sys.exit(app.exec_())

你随意的点击滑动这些控件是没有任何用的,这里的CamShow 类继承自 QMainWindow 和 Ui_MainWindow,通过调用 setupUi 方法初始化界面。

1,滑动条与微调框的连接

当我运行上面的文件时候,我们发现移动滑动条或者给微调框调整是各改各的,这里我们可以通过将滑块的 valueChanged 信号连接到对应微调框的 setValue 槽,以及将微调框的 valueChanged 信号连接到对应滑块的 setValue 槽。

    def PrepSliders(self):self.RedColorSld.valueChanged.connect(self.RedColorSpB.setValue)self.RedColorSpB.valueChanged.connect(self.RedColorSld.setValue)self.GreenColorSld.valueChanged.connect(self.GreenColorSpB.setValue)self.GreenColorSpB.valueChanged.connect(self.GreenColorSld.setValue)self.BlueColorSld.valueChanged.connect(self.BlueColorSpB.setValue)self.BlueColorSpB.valueChanged.connect(self.BlueColorSld.setValue)self.ExpTimeSld.valueChanged.connect(self.ExpTimeSpB.setValue)self.ExpTimeSpB.valueChanged.connect(self.ExpTimeSld.setValue)self.GainSld.valueChanged.connect(self.GainSpB.setValue)self.GainSpB.valueChanged.connect(self.GainSld.setValue)self.BrightSld.valueChanged.connect(self.BrightSpB.setValue)self.BrightSpB.valueChanged.connect(self.BrightSld.setValue)self.ContrastSld.valueChanged.connect(self.ContrastSpB.setValue)self.ContrastSpB.valueChanged.connect(self.ContrastSld.setValue)

这里通信成功,像上面的self.RedColorSld和self.RedColorSpB都是继承的Ui_MainWindow下面的,名字,还有数值都需要自己去修改。

其实也就是这下面的两个地方:

2,相机的初始化和参数设置

这里通过 cv2.VideoCapture 初始化了相机,并设置了一些相机参数,例如曝光时间、增益、亮度和对比度。通过连接滑动条和微调框,能使用户能够动态地调整这些参数。

    def PrepCamera(self):try:self.camera = cv2.VideoCapture(0)self.MsgTE.clear()self.MsgTE.append('Oboard camera connected.')self.MsgTE.setPlainText()except Exception as e:self.MsgTE.clear()self.MsgTE.append(str(e))def PrepParameters(self):self.RecordPath='D:/PythonProject/pythonProject1/OpencvPyQt5/'self.FilePathLE.setText(self.RecordPath)   # 默认显示self.RecordFlag=0self.Image_num=0self.R=1self.G=1self.B=1self.ExpTimeSld.setValue(self.camera.get(15))self.SetExposure()self.GainSld.setValue(self.camera.get(14))self.SetGain()self.BrightSld.setValue(self.camera.get(10))self.SetBrightness()self.ContrastSld.setValue(self.camera.get(11))self.SetContrast()self.MsgTE.clear()

3,界面按钮和相关功能

在这一步中,为界面上的按钮添加了一些功能,例如启动相机、停止相机、录像等。通过连接这些按钮的点击事件,我们实现了相应的功能。特别是,通过 CallBackFunctions 函数,我们将按钮的点击事件与后台函数进行了关联。

    def StartCamera(self):self.ShowBt.setEnabled(False)self.StopBt.setEnabled(True)self.RecordBt.setEnabled(True)self.GrayImgCkB.setEnabled(True)if self.GrayImgCkB.isChecked() == 0:self.RedColorSld.setEnabled(True)self.RedColorSpB.setEnabled(True)self.GreenColorSld.setEnabled(True)self.GreenColorSpB.setEnabled(True)self.BlueColorSld.setEnabled(True)self.BlueColorSpB.setEnabled(True)self.ExpTimeSld.setEnabled(True)self.ExpTimeSpB.setEnabled(True)self.GainSld.setEnabled(True)self.GainSpB.setEnabled(True)self.BrightSld.setEnabled(True)self.BrightSpB.setEnabled(True)self.ContrastSld.setEnabled(True)self.ContrastSpB.setEnabled(True)self.RecordBt.setText('录像')self.Timer.start(1)self.timelb = time.perf_counter()

在最开始运行的时候,有些需要禁用,比如,比如在上面的地方灰度的checkbox没有被点击可以调试R、G、B。

    def StopCamera(self):if self.StopBt.text()=='暂停':self.StopBt.setText('继续')self.RecordBt.setText('保存')self.Timer.stop()elif self.StopBt.text()=='继续':self.StopBt.setText('暂停')self.RecordBt.setText('录像')self.Timer.start(1)

这是一个很简单的逻辑,在这个函数中,如果当前按钮的文本为 ‘暂停’,则将其设置为 ‘继续’ ,并将录像按钮的文本设置为 ‘保存’,最后停止计时器;如果当前按钮的文本为 ‘继续',则将其设置为 ‘暂停’,将录像按钮的文本设置为 ‘录像’ ,并重新启动计时器。

    def RecordCamera(self):tag=self.RecordBt.text()if tag=='保存':try:image_name=self.RecordPath+'image'+time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))+'.jpg'print(image_name)cv2.imwrite(image_name, self.Image)self.MsgTE.clear()self.MsgTE.setPlainText('Image saved.')except Exception as e:self.MsgTE.clear()self.MsgTE.setPlainText(str(e))elif tag == '录像':self.RecordBt.setText('停止')video_name = self.RecordPath + 'video' + time.strftime('%Y%m%d%H%M%S',time.localtime(time.time())) + '.avi'fps = self.FmRateLCD.value()size = (self.Image.shape[1],self.Image.shape[0])fourcc = cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')self.video_writer = cv2.VideoWriter(video_name, fourcc,self.camera.get(5), size)self.RecordFlag=1self.MsgTE.setPlainText('Video recording...')self.StopBt.setEnabled(False)self.ExitBt.setEnabled(False)elif tag == '停止':self.RecordBt.setText('录像')self.video_writer.release()self.RecordFlag = 0self.MsgTE.setPlainText('Video saved.')self.StopBt.setEnabled(True)self.ExitBt.setEnabled(True)

如果按钮的文本为 '保存',则执行保存图片的操作。首先构造图片文件名,使用 cv2.imwrite 将当前图像保存为 JPG 文件,然后清空消息显示框并显示保存成功或者错误信息。如果按钮的文本为 '录像',则执行开始录像的操作。构造视频文件名,设置录像相关参数(帧率、大小等),创建 cv2.VideoWriter 对象开始录像,并在消息显示框中显示录像信息。同时禁用停止按钮和退出按钮,防止在录像时进行其他操作。如果按钮的文本为 '停止',则执行停止录像的操作。将按钮文本设置为 '录像',释放 cv2.VideoWriter 对象,停止录像标志,显示录像保存成功的消息,并启用停止按钮和退出按钮。

4,图像处理与显示

    def ColorAdjust(self, img):try:B = img[:, :, 0]G = img[:, :, 1]R = img[:, :, 2]# 根据滑动条的值进行颜色通道的调整B = B * self.BG = G * self.GR = R * self.Rimg_adjusted = img.copy()img_adjusted[:, :, 0] = Bimg_adjusted[:, :, 1] = Gimg_adjusted[:, :, 2] = Rreturn img_adjustedexcept Exception as e:self.MsgTE.setPlainText(str(e))def DispImg(self):if self.GrayImgCkB.isChecked():img = cv2.cvtColor(self.Image, cv2.COLOR_BGR2GRAY)else:img = cv2.cvtColor(self.Image, cv2.COLOR_BGR2RGB)qimg = qimage2ndarray.array2qimage(img)self.DispLb.setPixmap(QPixmap(qimg))self.DispLb.show()

ColorAdjust函数用于进行颜色调整。然后,通过 qimage2ndarray 将处理后的图像转换为 QImage,最后使用 QPixmap 在界面上的 DispLb 标签上显示图像。这样,我们完成了图像处理与显示的步骤。

5,使用回调函数将功能与控件进行连接

    def CallBackFunctions(self):self.FilePathBt.clicked.connect(self.SetFilePath)self.ShowBt.clicked.connect(self.StartCamera)self.StopBt.clicked.connect(self.StopCamera)self.RecordBt.clicked.connect(self.RecordCamera)self.ExitBt.clicked.connect(self.ExitApp)self.GrayImgCkB.stateChanged.connect(self.SetGray)self.ExpTimeSld.valueChanged.connect(self.SetExposure)self.GainSld.valueChanged.connect(self.SetGain)self.BrightSld.valueChanged.connect(self.SetBrightness)self.ContrastSld.valueChanged.connect(self.SetContrast)self.RedColorSld.valueChanged.connect(self.SetR)self.GreenColorSld.valueChanged.connect(self.SetG)self.BlueColorSld.valueChanged.connect(self.SetB)def SetR(self):R=self.RedColorSld.value()self.R=R/255def SetG(self):G=self.GreenColorSld.value()self.G=G/255def SetB(self):B=self.BlueColorSld.value()self.B=B/255def SetContrast(self):contrast_toset=self.ContrastSld.value()try:self.camera.set(11,contrast_toset)self.MsgTE.setPlainText('The contrast is set to ' + str(self.camera.get(11)))except Exception as e:self.MsgTE.setPlainText(str(e))def SetBrightness(self):brightness_toset=self.BrightSld.value()try:self.camera.set(10,brightness_toset)self.MsgTE.setPlainText('The brightness is set to ' + str(self.camera.get(10)))except Exception as e:self.MsgTE.setPlainText(str(e))def SetGain(self):gain_toset=self.GainSld.value()try:self.camera.set(14,gain_toset)self.MsgTE.setPlainText('The gain is set to '+str(self.camera.get(14)))except Exception as e:self.MsgTE.setPlainText(str(e))def SetExposure(self):try:exposure_time_toset=self.ExpTimeSld.value()self.camera.set(15,exposure_time_toset)self.MsgTE.setPlainText('The exposure time is set to '+str(self.camera.get(15)))except Exception as e:self.MsgTE.setPlainText(str(e))def SetGray(self):if self.GrayImgCkB.isChecked():self.RedColorSld.setEnabled(False)self.RedColorSpB.setEnabled(False)self.GreenColorSld.setEnabled(False)self.GreenColorSpB.setEnabled(False)self.BlueColorSld.setEnabled(False)self.BlueColorSpB.setEnabled(False)else:self.RedColorSld.setEnabled(True)self.RedColorSpB.setEnabled(True)self.GreenColorSld.setEnabled(True)self.GreenColorSpB.setEnabled(True)self.BlueColorSld.setEnabled(True)self.BlueColorSpB.setEnabled(True)

四、其他补充

如果报错PyQt下载不了,是缺少了C++,下一个Visual Studio然后安装一个C++桌面开发就可以了。

如果运行出现:

DeprecationWarning: sipPyTypeDict() is deprecated, the extension module should use sipPyTypeDictRef() instead class CamShow(QMainWindow, Ui_MainWindow):

说的是sip版本不对,这个不影响运行,可以不用理会。

五、资源下载

PyQt5-opencv-UIdesign/Camshow at main · Auorui/PyQt5-opencv-UIdesign (github.com)

主函数文件:

from OboardCamDisp import Ui_MainWindow
import sys
from PyQt5.QtWidgets import QApplication,QMainWindow,QFileDialog
from PyQt5.QtCore import QTimer,QCoreApplication
from PyQt5.QtGui import QPixmap
import cv2
import qimage2ndarray
import timeclass CamShow(QMainWindow,Ui_MainWindow):def __del__(self):try:self.camera.release()  # 释放资源except:returndef __init__(self,parent=None):super(CamShow,self).__init__(parent)self.setupUi(self)self.PrepSliders()self.PrepWidgets()self.PrepParameters()self.CallBackFunctions()self.Timer=QTimer()self.Timer.timeout.connect(self.TimerOutFun)# 滑动条与微调框的连接def PrepSliders(self):self.RedColorSld.valueChanged.connect(self.RedColorSpB.setValue)self.RedColorSpB.valueChanged.connect(self.RedColorSld.setValue)self.GreenColorSld.valueChanged.connect(self.GreenColorSpB.setValue)self.GreenColorSpB.valueChanged.connect(self.GreenColorSld.setValue)self.BlueColorSld.valueChanged.connect(self.BlueColorSpB.setValue)self.BlueColorSpB.valueChanged.connect(self.BlueColorSld.setValue)self.ExpTimeSld.valueChanged.connect(self.ExpTimeSpB.setValue)self.ExpTimeSpB.valueChanged.connect(self.ExpTimeSld.setValue)self.GainSld.valueChanged.connect(self.GainSpB.setValue)self.GainSpB.valueChanged.connect(self.GainSld.setValue)self.BrightSld.valueChanged.connect(self.BrightSpB.setValue)self.BrightSpB.valueChanged.connect(self.BrightSld.setValue)self.ContrastSld.valueChanged.connect(self.ContrastSpB.setValue)self.ContrastSpB.valueChanged.connect(self.ContrastSld.setValue)# 相机的初始化和参数设置def PrepCamera(self):try:self.camera=cv2.VideoCapture(0)self.MsgTE.clear()self.MsgTE.append('Oboard camera connected.')self.MsgTE.setPlainText()except Exception as e:self.MsgTE.clear()self.MsgTE.append(str(e))def PrepParameters(self):self.RecordFlag = 0self.RecordPath ='D:/PythonProject/pythonProject1/OpencvPyQt5/Camshow'self.FilePathLE.setText(self.RecordPath)self.Image_num = 0self.R = 1self.G = 1self.B = 1self.ExpTimeSld.setValue(self.camera.get(15))self.SetExposure()self.GainSld.setValue(self.camera.get(14))self.SetGain()self.BrightSld.setValue(self.camera.get(10))self.SetBrightness()self.ContrastSld.setValue(self.camera.get(11))self.SetContrast()self.MsgTE.clear()# 相机的初始化和参数设置def StartCamera(self):self.ShowBt.setEnabled(False)self.StopBt.setEnabled(True)self.RecordBt.setEnabled(True)self.GrayImgCkB.setEnabled(True)if self.GrayImgCkB.isChecked() == 0:self.RedColorSld.setEnabled(True)self.RedColorSpB.setEnabled(True)self.GreenColorSld.setEnabled(True)self.GreenColorSpB.setEnabled(True)self.BlueColorSld.setEnabled(True)self.BlueColorSpB.setEnabled(True)self.ExpTimeSld.setEnabled(True)self.ExpTimeSpB.setEnabled(True)self.GainSld.setEnabled(True)self.GainSpB.setEnabled(True)self.BrightSld.setEnabled(True)self.BrightSpB.setEnabled(True)self.ContrastSld.setEnabled(True)self.ContrastSpB.setEnabled(True)self.RecordBt.setText('录像')self.Timer.start(1)self.timelb=time.perf_counter()def StopCamera(self):if self.StopBt.text()=='暂停':self.StopBt.setText('继续')self.RecordBt.setText('保存')self.Timer.stop()elif self.StopBt.text()=='继续':self.StopBt.setText('暂停')self.RecordBt.setText('录像')self.Timer.start(1)def RecordCamera(self):tag = self.RecordBt.text()if tag == '保存':try:image_name=self.RecordPath+'image'+time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))+'.jpg'print(image_name)cv2.imwrite(image_name, self.Image)self.MsgTE.clear()self.MsgTE.setPlainText('Image saved.')except Exception as e:self.MsgTE.clear()self.MsgTE.setPlainText(str(e))elif tag == '录像':self.RecordBt.setText('停止')video_name = self.RecordPath + 'video' + time.strftime('%Y%m%d%H%M%S',time.localtime(time.time())) + '.avi'fps = self.FmRateLCD.value()size = (self.Image.shape[1],self.Image.shape[0])fourcc = cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')self.video_writer = cv2.VideoWriter(video_name, fourcc,self.camera.get(5), size)self.RecordFlag=1self.MsgTE.setPlainText('Video recording...')self.StopBt.setEnabled(False)self.ExitBt.setEnabled(False)elif tag == '停止':self.RecordBt.setText('录像')self.video_writer.release()self.RecordFlag = 0self.MsgTE.setPlainText('Video saved.')self.StopBt.setEnabled(True)self.ExitBt.setEnabled(True)# 图像处理与显示def ColorAdjust(self, img):try:B = img[:, :, 0]G = img[:, :, 1]R = img[:, :, 2]# 根据滑动条的值进行颜色通道的调整B = B * self.BG = G * self.GR = R * self.Rimg_adjusted = img.copy()img_adjusted[:, :, 0] = Bimg_adjusted[:, :, 1] = Gimg_adjusted[:, :, 2] = Rreturn img_adjustedexcept Exception as e:self.MsgTE.setPlainText(str(e))def DispImg(self):if self.GrayImgCkB.isChecked():img = cv2.cvtColor(self.Image, cv2.COLOR_BGR2GRAY)else:img = cv2.cvtColor(self.Image, cv2.COLOR_BGR2RGB)qimg = qimage2ndarray.array2qimage(img)self.DispLb.setPixmap(QPixmap(qimg))self.DispLb.show()def TimerOutFun(self):success, img = self.camera.read()if success:self.Image = self.ColorAdjust(img)self.DispImg()self.Image_num += 1if self.RecordFlag:self.video_writer.write(img)if self.Image_num % 10 == 9:frame_rate = 10/(time.perf_counter()-self.timelb)self.FmRateLCD.display(frame_rate)self.timelb = time.perf_counter()self.ImgWidthLCD.display(self.camera.get(3))self.ImgHeightLCD.display(self.camera.get(4))else:self.MsgTE.clear()self.MsgTE.setPlainText('Image obtaining failed.')def PrepWidgets(self):self.PrepCamera()self.StopBt.setEnabled(False)self.RecordBt.setEnabled(False)self.GrayImgCkB.setEnabled(False)self.RedColorSld.setEnabled(False)self.RedColorSpB.setEnabled(False)self.GreenColorSld.setEnabled(False)self.GreenColorSpB.setEnabled(False)self.BlueColorSld.setEnabled(False)self.BlueColorSpB.setEnabled(False)self.ExpTimeSld.setEnabled(False)self.ExpTimeSpB.setEnabled(False)self.GainSld.setEnabled(False)self.GainSpB.setEnabled(False)self.BrightSld.setEnabled(False)self.BrightSpB.setEnabled(False)self.ContrastSld.setEnabled(False)self.ContrastSpB.setEnabled(False)def SetR(self):R=self.RedColorSld.value()self.R=R/255def SetG(self):G=self.GreenColorSld.value()self.G=G/255def SetB(self):B=self.BlueColorSld.value()self.B=B/255def SetContrast(self):contrast_toset=self.ContrastSld.value()try:self.camera.set(11,contrast_toset)self.MsgTE.setPlainText('The contrast is set to ' + str(self.camera.get(11)))except Exception as e:self.MsgTE.setPlainText(str(e))def SetBrightness(self):brightness_toset=self.BrightSld.value()try:self.camera.set(10,brightness_toset)self.MsgTE.setPlainText('The brightness is set to ' + str(self.camera.get(10)))except Exception as e:self.MsgTE.setPlainText(str(e))def SetGain(self):gain_toset=self.GainSld.value()try:self.camera.set(14,gain_toset)self.MsgTE.setPlainText('The gain is set to '+str(self.camera.get(14)))except Exception as e:self.MsgTE.setPlainText(str(e))def SetExposure(self):try:exposure_time_toset=self.ExpTimeSld.value()self.camera.set(15,exposure_time_toset)self.MsgTE.setPlainText('The exposure time is set to '+str(self.camera.get(15)))except Exception as e:self.MsgTE.setPlainText(str(e))def SetGray(self):if self.GrayImgCkB.isChecked():self.RedColorSld.setEnabled(False)self.RedColorSpB.setEnabled(False)self.GreenColorSld.setEnabled(False)self.GreenColorSpB.setEnabled(False)self.BlueColorSld.setEnabled(False)self.BlueColorSpB.setEnabled(False)else:self.RedColorSld.setEnabled(True)self.RedColorSpB.setEnabled(True)self.GreenColorSld.setEnabled(True)self.GreenColorSpB.setEnabled(True)self.BlueColorSld.setEnabled(True)self.BlueColorSpB.setEnabled(True)def SetFilePath(self):dirname = QFileDialog.getExistingDirectory(self, "浏览", '.')if dirname:self.FilePathLE.setText(dirname)self.RecordPath=dirname+'/'def CallBackFunctions(self):self.FilePathBt.clicked.connect(self.SetFilePath)self.ShowBt.clicked.connect(self.StartCamera)self.StopBt.clicked.connect(self.StopCamera)self.RecordBt.clicked.connect(self.RecordCamera)self.ExitBt.clicked.connect(self.ExitApp)self.GrayImgCkB.stateChanged.connect(self.SetGray)self.ExpTimeSld.valueChanged.connect(self.SetExposure)self.GainSld.valueChanged.connect(self.SetGain)self.BrightSld.valueChanged.connect(self.SetBrightness)self.ContrastSld.valueChanged.connect(self.SetContrast)self.RedColorSld.valueChanged.connect(self.SetR)self.GreenColorSld.valueChanged.connect(self.SetG)self.BlueColorSld.valueChanged.connect(self.SetB)def ExitApp(self):self.Timer.Stop()self.camera.release()self.MsgTE.setPlainText('Exiting the application..')QCoreApplication.quit()if __name__ == '__main__':app = QApplication(sys.argv)ui=CamShow()ui.show()sys.exit(app.exec_())

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

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

相关文章

nodejs01

nodejs作用 Node.js 是一个免费的、开源的、跨平台的 JavaScript 运行时环境,允许开发人员在浏览器之外编写命令行工具和服务器端脚本. 是javascript的一个运行环境,,, nodejs stream 是前端工程化的基础 nodejs可以作为中间层&…

SpringMVC-@RequestMapping注解

0. 多个方法对应同一个请求 RequestMapping("/")public String toIndex(){return "index";}RequestMapping("/")public String toIndex2(){return "index";}这种情况是不允许的,会报错。 1. 注解的功能 RequestMapping注…

《程序员的自我修养--链接,装载与库》

第一章:温故而知新 过度优化的问题: 我们知道volatile关键字可以阻止过度优化,因为它可以完成两件事: 阻止编译器为了提高速度将一个变量缓存到寄存器而不写回阻止编译器调整操作volatile变量的指令顺序 然而,在优…

如何使用csdn中的c知道进行学习?

1.c知道 猜测是通过chatgpt训练链接到CSDN内部的文章内容等,进行生成的一款应用。 2.如何使用呢 打比方说,我想学习下多目标跟踪中的ukf,那么就可以输入这个关键字。 那既然是学习,就要进一步深究,有三种方式&#…

uniapp向上拉加载,下拉刷新

目录 大佬1大佬2 大佬1 大佬地址:https://blog.csdn.net/wendy_qx/article/details/135077822 大佬2 大佬2:https://blog.csdn.net/chen__hui/article/details/122497140

<软考高项备考>《论文专题 - 51 进度管理(2) 》

3 过程2-定义活动 3.1 问题 4W1H过程做什么识别和记录为完成项目可交付成果而须采取的具体行动的过程作用:将工作包分解为进度活动,作为对项目工作进行进度估算、规划、执行、监督和控制的基础为什么做对活动才能更详细更准确的分配资源、时间、成本谁…

C#,数值计算,求平方根之巴比伦算法(Babylonian algorithm)的源代码

平方根的巴比伦算法。 1 巴比伦算法介绍一 巴比伦算法可能算是最早的用于计算$sqrt{S}$的算法之一,因为其可以用牛顿法导出,因此在很多地方也被成为牛顿法。其核心思想在于为了计算x的平方根,可以从某个任意的猜测值g开始计算。在真实的运算…

屏幕截图--Snagit

Snagit是一款优秀的屏幕、文本和视频捕获、编辑与转换软件。它不仅可以捕获静止的图像,还能获得动态的图像和声音。软件界面干净清爽,功能板块一目了然,为用户提供专业的屏幕录制方案。可以根据自己的需求调整录制视频的分辨率、帧数、输出格…

探索Flutter中常用的系统组件

Flutter 是一款强大的开源移动应用框架,其丰富的系统组件使得开发者可以轻松构建漂亮且高性能的移动应用。在本文中,我们将深入探讨一些常用的 Flutter 系统组件,帮助开发者更好地理解和应用它们。 1. Scaffold(脚手架&#xff0…

Linux命令入门及ls命令

由于大家第一次接触到Linux命令,故此篇会详细讲述什么是命令,什么又是命令行?Linux命令的基础结构,什么是工作目录,什么又是HOME目录?并且带大家熟悉ls命令的基础使用。 1.命令和命令行 命令行&#xff1a…

使用spring cloud gateway作为服务网关

Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关。网关作为流量的,在微服务系统中有着非常作用,网关常见的功能有路由转发、权限校验、限流控制等作用。 gateway需要注册到nacos中去,需要引入以下的依…

【PgSQL】聚合函数string_agg

在工作中,遇到了这样的需求,需要根据某一个字段A分组查询,统计数量,同时还要查询另一个字段B,但是呢这个字段B在分组后的记录中存在不同的值。最开始不知道有聚合函数可以实现这一功能,在代码中进行了处理。…

[嵌入式C][入门篇] 快速掌握基础3 (运算符)

开发环境: 网页版:跳转本地开发(Vscode):跳转 文章目录 一、 简介二、算术运算符(1)示例代码:(2)和--的先后顺序(直接看效果) 三、逻辑运算符(1)示例代码 四…

网络对讲终端 网络音频终端 网络广播终端SV-7011V使用说明

高速路sip广播对讲求助 隧道sip对讲调度SIP-7011 网络广播终端SV-7011 壁挂式对讲终端网络监听终端SIP广播终端 sip语音对讲终端SIP-7011 SV-7011网络对讲终端网络对讲、网络厂播、监听 SV-7101网络解码终端提供一路线路输出接功放或有源音箱。 SV-7102网络解码广播终端两…

HNU-数据库系统-讨论课2

第二次小班讨论课安排如下: 主题: 数据库系统设计与应用开发。 目的:让学生通过练习和讨论充分掌握数据库系统的设计与应用开发。 内容: 设计和实现一个数据库及应用系统。设计内容包括系统分析、系统设计、 数据库设计(需求分析、概念结构设计、逻辑…

Ranger UserSync

作用 同步User到RangerDb 架构 解析 启动一个while(True) 进程定时同步,程序入口 source sink 掉接口获取Ranger User 并且Cache 计算delta 同步

JavaScript基础(24)_dom查询练习(一)

<!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><link rel"stylesheet" href"../browser_default_style/reset.css"><title>dom查询练习一</title><style>.text {widt…

Anaconda 环境中安装OpenCV (cv2)

1、使用Anaconda 的对应环境&#xff0c;查看环境中的Python版本号 (1)使用Anaconda 查看存在的环境&#xff1a;conda info --env (2)激活环境&#xff1a;conda activate XXX 2、根据版本号&#xff0c;下载对应的 python-opencv 包 &#xff08;1&#xff09;选择国内源的…

【算法Hot100系列】括号生成

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

Android RecyleView 使用 Gilde 加载图片引发的卡顿问题

Glide 是一个用于 Android 的图片加载和缓存库。它可以帮助开发者快速、高效地加载网络图片、本地文件和视频帧&#xff0c;并且能够自动缓存图片数据&#xff0c;减少网络请求。Glide 具有良好的性能和易用的 API&#xff0c;支持常见的图片加载需求&#xff0c;例如图片压缩、…