当前位置: 首页 > news >正文

PyQt界面里如何加载本地视频以及调用摄像头实时检测(小白入门必看)

目录

1.PyQt介绍

2.代码实现

 2.1实时调用摄像头

2.2 使用YOLOv5推理

2.3 代码中用到的主要函数 


1.PyQt介绍

PyQt是一个用于创建桌面应用程序的Python绑定库,它基于Qt框架。Qt是一个跨平台的C++应用程序开发框架,提供了丰富的图形界面、网络通信、数据库操作等功能。PyQt通过将Qt框架与Python语言结合起来,使得开发者可以使用Python语言来快速、简便地创建功能强大的桌面应用程序。

以下是PyQt的一些主要特点和功能:

  1. 跨平台支持:PyQt可以在多个主要操作系统(如Windows、Linux和macOS)上运行,实现了跨平台的应用程序开发。这意味着你可以使用相同的代码来创建适用于不同操作系统的应用程序。

  2. 丰富的GUI库:PyQt提供了包括窗口、对话框、按钮、文本输入框、表格、树形视图、绘图等在内的丰富的图形用户界面组件。这些组件使开发者能够创建出具有吸引力和交互性的用户界面。

  3. 事件驱动编程:PyQt采用了事件驱动的编程模型。开发者可以通过响应用户的输入、鼠标点击、键盘事件等来触发特定的代码逻辑。这种模型使得应用程序能够高效地处理用户交互。

  4. 信号与槽机制:PyQt支持Qt的信号与槽机制,这是一种强大的机制,用于在对象之间进行通信和交互。通过信号与槽机制,开发者可以将不同对象的动作、事件等连接起来,实现灵活而高效的编程。

  5. 数据库集成:PyQt提供了对常见数据库的支持,包括SQLite、MySQL和PostgreSQL等。开发者可以使用PyQt的数据库模块来执行数据库查询、增删改操作,并将数据库与应用程序进行集成。

  6. 支持多线程:PyQt提供了对多线程的支持,可以在应用程序中处理并发任务,提高程序的响应性能。

2.代码实现

安装PyQt

pip install PyQt

 2.1实时调用摄像头

程序中主要包含两个类:VideoProcessingThreadMainWindow

VideoProcessingThread类是一个继承自QThread的线程类,用于在后台处理视频流。在run方法中,打开摄像头并循环读取视频帧。对每一帧进行处理,包括计算帧率、调整图像大小,并通过信号update_frame发送给主窗口进行更新显示。通过stop方法可以停止线程的运行。

MainWindow类是主窗口类,继承自QMainWindow。在init_ui方法中初始化界面,包括添加开始和停止按钮以及结果显示的标签。start_video_processing方法用于点击开始按钮时创建并启动VideoProcessingThread线程。stop_video_processing方法用于点击停止按钮时停止线程的运行。update_frame方法接收到新的帧后,将其转换为QImage格式,并在标签上进行显示。在关闭窗口时,会调用closeEvent方法停止线程的运行。

在主程序中,创建一个QApplication实例,并实例化MainWindow类作为主窗口。最后调用app.exec_()启动应用程序的事件循环。

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtCore import QThread, pyqtSignalimport utlis
from ours import *import cv2
import timeclass VideoProcessingThread(QThread):update_frame = pyqtSignal(object)def __init__(self, onnx_path, rtsp_url):super().__init__()self.onnx_path = onnx_pathself.rtsp_url = rtsp_urlself.running = Falsedef run(self):self.running = Truecap= cv2.VideoCapture(0)pTime = 0while True:# n_stamp, img = HIK.read()success, img2 = cap.read()cTime = time.time()fps = 1 / (cTime - pTime)pTime = cTimecv2.putText(img2, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 3)img2 = cv2.resize(img2,(480,360))# 在窗口中显示目标检测结果# cv2.imshow('result', img2)self.update_frame.emit(img2)# 等待用户按键,如果按下 'q' 键或者 Esc 键,则退出循环c = cv2.waitKey(1) & 0xFFif c == 27 or c == ord('q'):breakcap.release()def stop(self):self.running = Falseclass MainWindow(QMainWindow):def __init__(self, onnx_path, rtsp_url):super().__init__()self.onnx_path = onnx_pathself.rtsp_url = rtsp_urlself.video_thread = Noneself.init_ui()def init_ui(self):self.setWindowTitle('Video Processing')start_button = QPushButton('Start', self)start_button.setGeometry(10, 10, 100, 30)start_button.clicked.connect(self.start_video_processing)stop_button = QPushButton('Stop', self)stop_button.setGeometry(120, 10, 100, 30)stop_button.clicked.connect(self.stop_video_processing)self.result_label = QLabel(self)self.result_label.setGeometry(10, 50, 480, 360)self.setGeometry(100, 100, 500, 500)def start_video_processing(self):if self.video_thread is None or not self.video_thread.isRunning():self.video_thread = VideoProcessingThread(self.onnx_path, self.rtsp_url)self.video_thread.update_frame.connect(self.update_frame)self.video_thread.start()# def stop_video_processing(self):#     if self.video_thread is not None and self.video_thread.isRunning():#         self.video_thread.stop()#         self.video_thread.wait()def stop_video_processing(self):if self.video_thread is not None and self.video_thread.isRunning():self.video_thread.stop()def update_frame(self, frame):# 将cv2格式的帧转换为QImage格式qimg = QImage(frame.data, frame.shape[1], frame.shape[0], QImage.Format_BGR888)pixmap = QPixmap.fromImage(qimg)# 设置到QLabel控件上显示self.result_label.setPixmap(pixmap)def closeEvent(self, event):self.stop_video_processing()event.accept()if __name__ == '__main__':app = QApplication(sys.argv)onnx_path = 'yolov5s.onnx'rtsp_url = 'rtsp://admin:DING09503@192.168.1.64:554/h264/ch1/main/av_stream'main_window = MainWindow(onnx_path, rtsp_url)main_window.show()sys.exit(app.exec_())

 

代码详解

首先,导入所需的模块:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtCore import QThread, pyqtSignal
import cv2
import time

然后定义一个名为VideoProcessingThread的线程类,继承自QThread类。这个类用来处理视频流。

class VideoProcessingThread(QThread):update_frame = pyqtSignal(object)def __init__(self, onnx_path, rtsp_url):super().__init__()self.onnx_path = onnx_pathself.rtsp_url = rtsp_urlself.running = Falsedef run(self):self.running = Truecap= cv2.VideoCapture(0)pTime = 0while True:success, img2 = cap.read()cTime = time.time()fps = 1 / (cTime - pTime)pTime = cTimecv2.putText(img2, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 3)img2 = cv2.resize(img2,(480,360))self.update_frame.emit(img2)c = cv2.waitKey(1) & 0xFFif c == 27 or c == ord('q'):breakcap.release()def stop(self):self.running = False

VideoProcessingThread类中,我们定义了一个信号update_frame,它会在每一帧处理完毕后发射。

run方法是线程的主要执行逻辑。在这里,我们打开摄像头并循环读取视频帧。对每一帧进行处理,包括计算帧率、调整图像大小,并通过信号update_frame将图像发送给主窗口进行显示。我们还在窗口上显示了实时的帧率信息。同时,我们还检测按键事件,如果用户按下了'q'键或者Esc键,则退出循环。

stop方法用于停止线程的运行,将running标志设置为False。

接下来,定义一个名为MainWindow的主窗口类,继承自QMainWindow类。

class MainWindow(QMainWindow):def __init__(self, onnx_path, rtsp_url):super().__init__()self.onnx_path = onnx_pathself.rtsp_url = rtsp_urlself.video_thread = Noneself.init_ui()def init_ui(self):self.setWindowTitle('Video Processing')start_button = QPushButton('Start', self)start_button.setGeometry(10, 10, 100, 30)start_button.clicked.connect(self.start_video_processing)stop_button = QPushButton('Stop', self)stop_button.setGeometry(120, 10, 100, 30)stop_button.clicked.connect(self.stop_video_processing)self.result_label = QLabel(self)self.result_label.setGeometry(10, 50, 480, 360)self.setGeometry(100, 100, 500, 500)

MainWindow类中,我们首先定义了构造函数,接收两个参数onnx_pathrtsp_url,分别表示ONNX模型的路径和视频流的URL。

init_ui方法用于初始化用户界面。我们设置了窗口标题为"Video Processing",创建了开始和停止按钮,并将其与对应的槽函数连接起来。我们还创建了一个标签用于显示视频帧的结果,并设置了标签的位置和尺寸。最后,我们设置了窗口的位置和尺寸。

    def start_video_processing(self):if self.video_thread is None or not self.video_thread.isRunning():self.video_thread = VideoProcessingThread(self.onnx_path, self.rtsp_url)self.video_thread.update_frame.connect(self.update_frame)self.video_thread.start()def stop_video_processing(self):if self.video_thread is not None and self.video_thread.isRunning():self.video_thread.stop()

start_video_processing方法在点击开始按钮时被调用。它首先检查线程是否已经存在或者正在运行,如果不是的话,就创建一个新的VideoProcessingThread线程,并将其与update_frame信号连接起来,然后启动线程。

stop_video_processing方法在点击停止按钮时被调用。它检查线程是否存在并且正在运行,如果是的话,就调用线程的stop方法停止线程的运行。

    def update_frame(self, frame):qimg = QImage(frame.data, frame.shape[1], frame.shape[0], QImage.Format_BGR888)pixmap = QPixmap.fromImage(qimg)self.result_label.setPixmap(pixmap)def closeEvent(self, event):self.stop_video_processing()event.accept()

update_frame方法用于更新显示的视频帧。它接收到一帧图像后,将其转换为QImage格式,并创建一个QPixmap对象。然后将该QPixmap对象设置到标签上进行显示。

closeEvent方法在窗口关闭时被调用。我们在这里停止视频处理线程,并接受窗口关闭事件。

最后,在主程序中创建一个QApplication实例,并实例化MainWindow类作为主窗口。最后调用app.exec_()启动应用程序的事件循环。

它实现了一个简单的视频处理应用程序,可以通过界面显示摄像头捕获到的实时视频流。你可以根据需要进行修改和扩展。

2.2 使用YOLOv5推理


from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtCore import QThread, pyqtSignalfrom example1 import *
import utlis
from ours import *import cv2
import timeclass VideoProcessingThread(QThread):update_frame = pyqtSignal(object)def __init__(self, onnx_path, rtsp_url):super().__init__()self.onnx_path = onnx_pathself.rtsp_url = rtsp_urlself.running = Falsedef run(self):self.running = Trueonnx_path = 'yolov5s.onnx'model = Yolov5ONNX(onnx_path)cap= cv2.VideoCapture(0)pTime = 0while True:t0 = time.time()# n_stamp, img = HIK.read()success, img = cap.read()img2, box_coords = model.detect(img)cTime = time.time()fps = 1 / (cTime - pTime)pTime = cTimecv2.putText(img2, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 3)img2 = cv2.resize(img2,(480,360))# 在窗口中显示目标检测结果# cv2.imshow('result', img2)self.update_frame.emit(img2)# 等待用户按键,如果按下 'q' 键或者 Esc 键,则退出循环c = cv2.waitKey(1) & 0xFFif c == 27 or c == ord('q'):breakHIK.release()def stop(self):self.running = Falseclass MainWindow(QMainWindow):def __init__(self, onnx_path, rtsp_url):super().__init__()self.onnx_path = onnx_pathself.rtsp_url = rtsp_urlself.video_thread = Noneself.init_ui()def init_ui(self):self.setWindowTitle('Video Processing')start_button = QPushButton('Start', self)start_button.setGeometry(10, 10, 100, 30)start_button.clicked.connect(self.start_video_processing)stop_button = QPushButton('Stop', self)stop_button.setGeometry(120, 10, 100, 30)stop_button.clicked.connect(self.stop_video_processing)self.result_label = QLabel(self)self.result_label.setGeometry(10, 50, 480, 360)self.setGeometry(100, 100, 500, 500)def start_video_processing(self):if self.video_thread is None or not self.video_thread.isRunning():self.video_thread = VideoProcessingThread(self.onnx_path, self.rtsp_url)self.video_thread.update_frame.connect(self.update_frame)self.video_thread.start()def stop_video_processing(self):if self.video_thread is not None and self.video_thread.isRunning():self.video_thread.stop()self.video_thread.wait()# def stop_video_processing(self):#     if self.video_thread is not None and self.video_thread.isRunning():#         self.video_thread.stop()def update_frame(self, frame):# 将cv2格式的帧转换为QImage格式qimg = QImage(frame.data, frame.shape[1], frame.shape[0], QImage.Format_BGR888)pixmap = QPixmap.fromImage(qimg)# 设置到QLabel控件上显示self.result_label.setPixmap(pixmap)def closeEvent(self, event):self.stop_video_processing()event.accept()if __name__ == '__main__':app = QApplication(sys.argv)onnx_path = 'yolov5s.onnx'rtsp_url = 'rtsp://admin:DING09503@192.168.1.64:554/h264/ch1/main/av_stream'main_window = MainWindow(onnx_path, rtsp_url)main_window.show()sys.exit(app.exec_())

2.3 代码中用到的主要函数 

cv2.VideoCapture: 用于打开视频文件或者设备,返回一个cv2.VideoCapture对象。

  • cap = cv2.VideoCapture(0)
    
  • cv2.cvtColor: 用于将图像从一个颜色空间转换为另一个颜色空间。

  • img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
  • cv2.resize: 用于调整图像的大小。

  • img_resized = cv2.resize(img, (width, height))
    
  • cv2.putText: 用于在图像上绘制文本。

  • cv2.putText(img, text, (x, y), font, size, color, thickness)
    
  • cv2.imshow: 用于在窗口中显示图像。

  • cv2.imshow('image', img)
    
  • cv2.waitKey: 用于等待键盘事件。

  • key = cv2.waitKey(delay)
    
  • cv2.destroyAllWindows: 用于关闭所有窗口。

  • cv2.destroyAllWindows()
    
  • QApplication: 用于创建Qt应用程序对象。

  • app = QApplication(sys.argv)
    
  • QMainWindow: 用于创建Qt主窗口。

  • class MainWindow(QMainWindow):def __init__(self):super().__init__()# ...
    
  • QPushButton: 用于创建Qt按钮对象。

  • start_button = QPushButton('Start', self)
    
  • QLabel: 用于创建Qt标签对象,用于显示图像、文本等内容。

  • self.result_label = QLabel(self)
    self.result_label.setGeometry(10, 50, 480, 360)
    
  • QThread: 用于创建Qt线程对象。

class VideoProcessingThread(QThread):

觉得有用朋友点个赞!

万分感谢

相关文章:

PyQt界面里如何加载本地视频以及调用摄像头实时检测(小白入门必看)

目录 1.PyQt介绍 2.代码实现 2.1实时调用摄像头 2.2 使用YOLOv5推理 2.3 代码中用到的主要函数 1.PyQt介绍 PyQt是一个用于创建桌面应用程序的Python绑定库,它基于Qt框架。Qt是一个跨平台的C应用程序开发框架,提供了丰富的图形界面、网络通信、数据…...

Ubuntu:VS Code IDE安装ESP-IDF【保姆级】

物联网开发学习笔记——目录索引 参考: VS Code官网:Visual Studio Code - Code Editing. Redefined 乐鑫官网:ESP-IDF 编程指南 - ESP32 VSCode ESP-ID Extension Install 一、前提条件 Visual Studio Code IDE安装ESP-IDF扩展&…...

软考高级系统架构设计师系列之:快速掌握软件工程核心知识点

软考高级系统架构设计师系列之:快速掌握软件工程核心知识点 一、软件开发方法二、软件开发模型三、软件开发模型-瀑布模型四、软件开发模型-经典模型汇总五、软件开发模型-增量模型与螺旋模型六、软件开发模型-V模型七、软件开发模型-构件组装模型八、软件开发模型-统一过程九…...

Java基础面试-ArrayList和LinkedList的区别

ArrayList: 基于动态数组,连续内存存储,适合下标访问(随机访问),扩容机制: 因为数组长度固定,超出长度存数据时需要新建数组,然后将老数组的数据拷贝到新数组,如果不是尾部插入数据还会涉及到元素的移动(往…...

如何从 Pod 内访问 Kubernetes 集群的 API

Kubernetes API 是您检查和管理集群操作的途径。您可以使用Kubectl CLI、工具(例如curl)或流行编程语言的官方集成库来使用 API 。 该 API 也可供集群内的应用程序使用。Kubernetes Pod 会自动获得对 API 的访问权限,并且可以使用提供的服务帐户进行身份验证。您可以通过使…...

计网面试复习自用

五层: 应用层:应用层是最高层,负责为用户提供网络服务和应用程序。在应用层,用户应用程序与网络进行交互,发送和接收数据。典型的应用层协议包括HTTP(用于网页浏览)、SMTP(用于电子邮…...

【Android 性能优化:内存篇】——WebView 内存泄露治理

背景:笔者在公司项目中优化内存泄露时发现WebView 相关的内存泄露问题非常经典,一个 Fragment 页面使用的 WebView 有多条泄露路径,故记录下。 Fragment、Activity 使用WebView不释放 项目中一个Fragment 使用 Webview,在 Fragm…...

C++入门(一)

文章目录 前言一、C的发展史二、c关键字二、c命名空间1、代码演示2、::(域作用限定符) 和namespace(命名空间)3、命名空间可以嵌套使用4、同一个工程中的相同名字的命名空间 三、c的输入&&输出1、iostream(输入…...

C#控制台程序读取输入按键非阻塞方式

参考内容: http://www.dutton.me.uk/2009-02-24/non-blocking-keyboard-input-in-c/ 相关代码: while (true) {if (Console.KeyAvailable){ConsoleKeyInfo key Console.ReadKey(true);switch (key.Key){case ConsoleKey.F1:Console.WriteLine("Y…...

小程序框架->框架,视图层,生命周期(逻辑层)

框架视图层生命周期(逻辑层) 1.框架 小程序开发框架的目标是通过尽可能简单、高效的方式让开发者可以在微信中开发具有原生 APP 体验的服务。 整个小程序框架系统分为两部分:**[逻辑层](https://developers.weixin.qq.com/miniprogram/dev/framework/app-service/)…...

Spring framework Day14:配置类的Lite模式和Full模式

前言 Lite模式和Full模式是指在软件或系统中的不同配置选项。一般来说,Lite模式是指较为简洁、轻量级的配置,而Full模式则是指更加完整、功能更丰富的配置。 Lite模式通常会去除一些不常用或占用资源较多的功能,以提高系统的运行效率和响应…...

公司要做大数据可视化看板,除了EXCEL以外有没有好用的软件可以用

当企业需要进行大数据可视化看板的设计和开发时,除了Excel,还有许多其他强大且适合大数据可视化的软件工具。以下是几种常用的好用软件,以及它们的特点和优势,供您参考。 一、Datainside 特点和优势: - **易于使用**…...

掌握深入挖掘数据本质的方法

文章目录 掌握深入挖掘数据本质的方法1. 确定数据类型2. 数据清洗3. 数据可视化4. 探索性数据分析5. 特征工程6. 机器学习算法7. 自然语言处理 📕我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华…...

MyBatisPlus的学习项目页面

MyBatisPlus通过扫描实体类,并基于反射获取实体类信息作为数据库表信息 类名驼峰转下划线作为表名 名为id的字段作为主键 变量名驼峰转下划线作为表的字段名 常见注解 TableName:用来指定表名 Tableld:用来指定表中的主键字段信息 Tabl…...

基于EtherCAT的机器人多轴同步运动控制

随着工业自动化的发展,机器人在生产线上的应用越来越广泛。为了实现高效、精确的运动控制,机器人的多轴运动必须能够实现同步操作,它能够提高机器人的运动精度和稳定性,实现更高效的生产线操作。同时,它也为机器人的协…...

彩虹易支付 9.27 最新版加订单查询 sy 更新版

彩虹易支付 9.27 最新版加订单查询 sy 更新版 修复客服 2023/09/25: 1. 新增支付宝红包支付插件 2. 新增支付宝 APP 支付转 H5 支付 3. 更新了几个支付插件 安装教程: 环境:php7.2 上传后访问域名进行安装即可 源码下载:ht…...

python树状打印项目路径

学习这个的需求来自于,我想把项目架构告诉gpt问问它,然后不太会打印项目架构😂 联想到Linux的tree指令 import osclass DirectoryTree:def __init__(self, path):self.path pathdef print_tree(self, methoddefault):if method default:sel…...

mysql误删误操作恢复数据,比传统方式和binlog2sql更快速用的恢复方式-reverse_sql恢复数据(单表多表)

场景: 误操作删除了某个表的数据,本文只讲工具的使用,首先自己通过mysqlbinlog或者记录找到误操作的时间范围:开始时间和结束时间,已经确定好是哪个binlog了下面以误删为例。 查看binlog是否开启 show variables like …...

CORE: Cooperative Reconstruction for Multi-Agent Perception 论文阅读

论文连接 CORE: Cooperative Reconstruction for Multi-Agent Perception 0. 摘要 本文提出了 CORE,一种概念简单、有效且通信高效的多智能体协作感知模型。 从合作重建的新颖角度解决了该任务: 合作主体共同提供对环境的更全面的观察整体观察可以作为…...

MySQL连接方式: Unix套接字 TCP/IP

今天连接mysql数据库使用mysql -u root -p指令的时候遇到了这个问题: 解决之后来总结一下mysql的连接方式 文章目录 1. Unix套接字(或Windows命名管道)特点:场景: 2. TCP/IP特点:场景: 3.对比总…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...

实战设计模式之模板方法模式

概述 模板方法模式定义了一个操作中的算法骨架&#xff0c;并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下&#xff0c;重新定义算法中的某些步骤。简单来说&#xff0c;就是在一个方法中定义了要执行的步骤顺序或算法框架&#xff0c;但允许子类…...

机器学习的数学基础:线性模型

线性模型 线性模型的基本形式为&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...

CSS3相关知识点

CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...