【OpenCV-PyQt5-PyGame-imutils】探索Python中的图像和视频捕获:性能分析与选择指南

news2025/2/25 13:52:23

前言

随着计算机视觉和多媒体应用的不断发展,图像和视频捕获变得越来越重要。在Python中,有多种库和工具可供选择,用于打开摄像头、捕获图像、以及处理视频流。本文旨在为读者提供对这些捕获方法的全面了解,并介绍如何计算平均帧率以评估性能。

文章目录

  • 前言
  • 环境配置
    • 新的空白解释器环境创建
      • Windows
      • Linux
      • 相关库配置
  • Python中的视频流处理:不同库和工具的使用
    • 1. OpenCV
    • 2. Pillow
    • 3. Pygame
    • 4. PyQt
    • 5. imutils
    • 6. av
    • 7. SimpleCV
  • 测试函数,捕捉100帧并返回平均帧率
    • python3
      • 可处理摄像头或视频帧
        • 1. OpenCV Frame Capture
        • 2. Pygame Frame Capture
        • 3. PyQt Frame Capture
        • 4. imutils Frame Capture
      • 分析和总结:
      • 捕获屏幕帧
        • 1. pyautogui Frame Capture
      • 音频和视频捕捉
        • 2. av Frame Capture
    • python 2
      • SimpleCV Frame Capture
  • 总结

环境配置

新的空白解释器环境创建

解释器环境创建方式基于
半自动化使用.bat手动打包迁移python项目

Windows

python -m venv venv
call venv\Scripts\activate.bat
python -m pip install -i https://mirrors.aliyun.com/pypi/simple/ --upgrade pip setuptools

注:以下报错是由于你在powershell输入了以上命令,你需要切换成cmd,直接输入cmd即可

PS E:\PRODUCE\dli\recognition-dlib\RetinaFace-FaceNet> call
venv\Scripts\activate.bat call : 无法将“call”项识别为
cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。 所在位置 行:1 字符: 1

  • call venv\Scripts\activate.bat
  •   + CategoryInfo          : ObjectNotFound: (call:String) [], CommandNotFoundException
      + FullyQualifiedErrorId : CommandNotFoundException
    

Linux

python -m venv venv 
source venv/bin/activate
python -m pip install -i https://mirrors.aliyun.com/pypi/simple/ --upgrade pip setuptools
  • 你也可以使用conda管理你的 Python 环境,但是我实际使用时的体验来看,以上方法当你的电脑已经安装了任意版本的python,打开cmd即可使用,且比conda安装新的包更快,速度与直接pip install在系统解释器中几乎一致
  • 若使用conda,你必须先下载conda,但是conda可以很好的处理各种包不匹配的问题,也可以下载到的很多pip找不到的特殊版本

以上两种方法就对应PyCharm中的这两种方法
在这里插入图片描述

相关库配置

1. OpenCV

pip install -i https://mirrors.aliyun.com/pypi/simple/ opencv-python==4.5.3.56

2. Pygame

pip install -i https://mirrors.aliyun.com/pypi/simple/ Pygame

3. pyqt5

pip install -i https://mirrors.aliyun.com/pypi/simple/ pyqt5 pyqt5-sip pyqt5-tools

建议三个库相关库一起装不然可能会报错

This application failed to start because no Qt platform plugin could be
initialized.Reinstalling the application may fix this problem.

在这里插入图片描述

4. imutils

pip install -i https://mirrors.aliyun.com/pypi/simple/ imutils

5. pyautogui

pip install -i https://mirrors.aliyun.com/pypi/simple/ pyautogui

6. av

pip install -i https://mirrors.aliyun.com/pypi/simple/ av

7. SimpleCV
Python2库,python3已不支持

pip install -i https://mirrors.aliyun.com/pypi/simple/ SimpleCV

Python中的视频流处理:不同库和工具的使用

视频流处理在计算机视觉和多媒体应用中占据着重要地位。本文将介绍Python中的不同库和工具,用于摄像头捕捉、图像处理和视频流处理。我们将提供示例代码和描述,以帮助读者了解这些工具的使用方法。

1. OpenCV

OpenCV 是一个流行的计算机视觉库,可以用于摄像头捕捉和图像处理。以下是使用 OpenCV 打开摄像头并拍照的示例代码:

import cv2

# 初始化摄像头
cap = cv2.VideoCapture(0)

if not cap.isOpened():
    print("摄像头未找到或无法访问。")
else:
    while True:
        # 捕获一帧图像
        ret, frame = cap.read()

        cv2.imshow("Press Space to Capture", frame)

        key = cv2.waitKey(1)

        if key == 32:  # 按下空格键
            # 将图像保存为文件
            cv2.imwrite('captured_image.jpg', frame)
            print("拍照成功!图像已保存为captured_image.jpg")
            break

    # 释放摄像头
    cap.release()
    cv2.destroyAllWindows()


2. Pillow

Pillow 是一个强大的图像处理库,也可以用于摄像头捕捉。以下是使用 Pillow 打开摄像头并拍照的示例代码:

from PIL import Image
from io import BytesIO
import requests

# 初始化摄像头
with Image.open(requests.get('http://localhost:8080/picture/1/current/', stream=True).raw) as camera:
    # 拍照
    camera.save("pillow_capture.jpg")

3. Pygame

Pygame 是一个游戏开发库,也可以用于摄像头捕捉。以下是使用 Pygame 打开摄像头并拍照的示例代码:

import pygame
import pygame.camera
from pygame.locals import *

def main():
    pygame.init()
    pygame.camera.init()

    # 打开默认摄像头
    camera = pygame.camera.Camera(pygame.camera.list_cameras()[0])
    camera.start()

    # 设置窗口尺寸和标题
    screen = pygame.display.set_mode((640, 480))
    pygame.display.set_caption('Camera Feed')

    capturing = False

    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                camera.stop()
                pygame.quit()
                return
            elif event.type == KEYDOWN and event.key == K_c:
                # 按 'C' 键来拍照
                image = camera.get_image()
                pygame.image.save(image, 'captured_image.png')
                capturing = True

        if not capturing:
            # 从摄像头获取图像并显示
            image = camera.get_image()
            screen.blit(image, (0, 0))
            pygame.display.update()
        else:
            # 显示拍摄的照片
            captured_image = pygame.image.load('captured_image.png')
            screen.blit(captured_image, (0, 0))
            pygame.display.update()

if __name__ == "__main__":
    main()

4. PyQt

PyQt 是一个GUI库,它也提供了摄像头访问和图像捕捉功能。你可以使用 PyQt 的相机模块来实现这一功能。

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QPushButton
from PyQt5.QtMultimedia import QCamera, QCameraInfo
from PyQt5.QtMultimediaWidgets import QCameraViewfinder
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QImage

class CameraApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Camera App')
        self.setGeometry(100, 100, 640, 480)

        self.central_widget = QWidget(self)
        self.setCentralWidget(self.central_widget)
        self.layout = QVBoxLayout(self.central_widget)

        self.viewfinder = QCameraViewfinder(self)
        self.layout.addWidget(self.viewfinder)

        self.camera_info = QCameraInfo.defaultCamera()
        self.camera = QCamera(self.camera_info)
        self.camera.setViewfinder(self.viewfinder)
        self.camera.start()

        self.capture_button = QPushButton('拍照', self)
        self.layout.addWidget(self.capture_button)
        self.capture_button.clicked.connect(self.capture_image)

    def capture_image(self):
        image = self.viewfinder.grab()
        if not image.isNull():
            image.save('captured_image.png', 'PNG')

    def closeEvent(self, event):
        self.camera.stop()
        self.camera.unload()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = CameraApp()
    window.show()
    sys.exit(app.exec_())

5. imutils

imutils 是一个用于图像处理的工具集,它包括了一些用于打开摄像头并捕捉图像的函数。

from imutils.video import VideoStream
import cv2

def main():
    vs = VideoStream(src=0).start()  # 打开默认摄像头

    frame_count = 0

    while True:
        frame = vs.read()  # 读取一帧图像

        # 显示图像
        cv2.imshow('Camera', frame)

        key = cv2.waitKey(1)

        if key == 32:  # 如果按下空格键,拍照
            # 保存图像
            cv2.imwrite(f'photo_{frame_count}.jpg', frame)
            frame_count += 1

        if key == 27:  # 如果按下ESC键,退出循环
            break

    # 释放摄像头和销毁窗口
    vs.stop()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    capture_frame_count = 0
    main()

6. av

av 是一个多媒体处理库,它支持音频和视频捕捉。虽然它主要用于音视频处理,但也可以用于摄像头捕捉。

import av
import numpy as np
from av.video import VideoFrame

# 打开摄像头
container = av.open("R.mp4")

# 获取视频流
stream = container.streams.video[0]

# 读取图像帧
for frame in container.decode(stream):
    img = frame.to_image()
    img.save("av_capture.jpg")
    break  # 捕捉一帧后退出

7. SimpleCV

python2方法,python3不可用
SimpleCV 是一个计算机视觉库,内置了摄像头捕捉和图像处理工具。

from SimpleCV import Camera

# 初始化摄像头
camera = Camera()

# 拍照
image = camera.getImage()
image.save("simplecv_capture.jpg")

测试函数,捕捉100帧并返回平均帧率

平均帧率(Average Frame Rate)的计算方法是将总共捕获的帧数除以经过的时间,以得到每秒的帧数(FPS)。以下是具体的计算步骤:

  1. 记录一个起始时间 start_time,通常使用毫秒为单位。你可以使用类似 QTime.currentTime() 的方法来获取当前时间。

  2. 在每一帧捕获之后,递增一个帧数计数器 frame_count,用于跟踪已捕获的帧数。

  3. 当达到指定的帧数(例如100帧)时,停止捕获过程。

  4. 记录一个结束时间 end_time,通常也以毫秒为单位。

  5. 计算经过的时间,即结束时间减去起始时间,以毫秒为单位。这可以使用下面的方法计算:elapsed_time = end_time - start_time

  6. 将经过的时间转换为秒,因为帧率通常以每秒的帧数(FPS)表示。这可以通过将elapsed_time除以1000来实现,得到经过的时间(秒)。

  7. 计算帧率 frame_rate,将已捕获的帧数 frame_count除以经过的时间(秒)。帧率的计算公式为:frame_rate = frame_count / elapsed_time

  8. 最后,你可以将 frame_rate 打印出来,以表示捕获的平均帧率。

这个帧率表示了程序在捕获和显示帧的过程中的性能。通常,帧率越高,程序运行得越流畅。这个值对于评估图像处理应用程序的性能非常重要。

python3

可处理摄像头或视频帧

1. OpenCV Frame Capture

OpenCV 是一个流行的计算机视觉库,可以用于摄像头捕捉和图像处理。这个程序测试使用 OpenCV 打开摄像头并返回平均帧率。

import cv2
import timeit


def capture_and_display_opencv():
    cap = cv2.VideoCapture(0)
    frame_count = 0
    start_time = timeit.default_timer()

    while frame_count < 100:
        ret, frame = cap.read()
        frame_count += 1

        # 显示捕获的帧
        cv2.imshow("Camera Feed", frame)

        if cv2.waitKey(1) & 0xFF == 27:  # 按下 ESC 键退出
            break

    cap.release()
    cv2.destroyAllWindows()

    end_time = timeit.default_timer()
    elapsed_time = end_time - start_time
    frame_rate = frame_count / elapsed_time
    return frame_rate


if __name__ == "__main__":
    frame_rate = capture_and_display_opencv()
    print("OpenCV Frame Rate:", frame_rate)


OpenCV Frame Rate: 23.629290831107372

此程序使用 OpenCV 打开摄像头,捕捉100帧并返回平均帧率。请将此代码保存为一个单独的Python文件并运行。

2. Pygame Frame Capture

Pygame 是一个游戏开发库,也可以用于摄像头捕捉。以下是测试使用 Pygame 打开摄像头并返回平均帧率的程序:

import pygame.camera
from pygame.locals import *
import timeit
import pygame

def capture_and_display_pygame():
    pygame.init()
    pygame.camera.init()
    camera = pygame.camera.Camera(pygame.camera.list_cameras()[0])
    camera.start()

    # 创建 Pygame 窗口用于显示摄像头画面
    screen = pygame.display.set_mode((640, 480))
    pygame.display.set_caption("Camera Feed")

    frame_count = 0
    start_time = timeit.default_timer()

    running = True
    while running:
        for event in pygame.event.get():
            if event.type == QUIT:
                running = False

        # 捕获摄像头画面
        image = camera.get_image()

        # 将捕获的画面显示在 Pygame 窗口上
        screen.blit(image, (0, 0))
        pygame.display.flip()

        frame_count += 1

        if frame_count >= 100:
            running = False

    end_time = timeit.default_timer()
    elapsed_time = end_time - start_time
    frame_rate = frame_count / elapsed_time

    # 关闭 Pygame 窗口
    pygame.quit()

    return frame_rate

if __name__ == "__main__":
    frame_rate = capture_and_display_pygame()
    print("Pygame Frame Rate:", frame_rate)

此程序使用 Pygame 打开摄像头,捕捉100帧并返回平均帧率。请将此代码保存为一个单独的Python文件并运行。
Pygame Frame Rate: 28.42875197551398

3. PyQt Frame Capture

PyQt 是一个强大的GUI库,它包括了对摄像头的访问功能。以下是测试使用 PyQt 打开摄像头并返回平均帧率的程序:

import sys
from PyQt5.QtCore import Qt, QTimer, QTime
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget
from PyQt5.QtMultimedia import QCamera, QCameraInfo
from PyQt5.QtMultimediaWidgets import QCameraViewfinder

class CameraApp(QMainWindow):
    def __init__(self, capture_frame_count):
        super().__init__()
        self.capture_frame_count = capture_frame_count
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Camera Feed')
        self.setGeometry(100, 100, 640, 480)

        self.central_widget = QWidget(self)
        self.setCentralWidget(self.central_widget)
        self.layout = QVBoxLayout(self.central_widget)

        self.viewfinder = QCameraViewfinder(self)
        self.layout.addWidget(self.viewfinder)

        self.camera_info = QCameraInfo.defaultCamera()
        self.camera = QCamera(self.camera_info)
        self.camera.setViewfinder(self.viewfinder)
        self.camera.start()

        self.frame_count = 0
        self.start_time = QTime.currentTime()

        self.timer = QTimer(self)
        self.timer.timeout.connect(self.capture_frame)
        self.timer.start(30)  # 30毫秒更新一次

    def capture_frame(self):
        if self.frame_count < self.capture_frame_count:
            self.frame_count += 1
            # 实时显示捕获的帧
            self.viewfinder.show()
        else:
            self.timer.stop()
            self.camera.stop()
            self.camera.unload()
            self.close()

    def closeEvent(self, event):
        elapsed_time = self.start_time.msecsTo(QTime.currentTime())
        frame_rate = self.frame_count / (elapsed_time / 1000)
        print("PyQt5 Frame Rate:", frame_rate)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    capture_frame_count = 100
    window = CameraApp(capture_frame_count)
    window.show()
    sys.exit(app.exec_())

PyQt5 Frame Rate: 26.32964718272775

此程序使用 PyQt 打开摄像头,捕捉100帧并返回平均帧率。请将此代码保存为一个单独的Python文件并运行。

接下来,我们将继续介绍使用 SimpleCV、imutils 和其他捕捉方法的程序。

4. imutils Frame Capture

使用 imutils 库可以方便地捕获视频帧,但要显示图像,您通常仍然需要使用 OpenCV 或其他类似的库。 imutils 用于帮助处理图像和视频帧的读取、处理和转换,但它本身不提供图像显示的功能。所以在捕获和实时显示视频帧时,通常需要结合使用 imutils 和 OpenCV。

import time
import timeit
import cv2
from imutils.video import VideoStream

def capture_imutils(capture_frame_count):
    vs = VideoStream(src=0).start()  # 打开默认摄像头
    time.sleep(2.0)  # 等待摄像头预热

    frame_count = 0
    start_time = timeit.default_timer()

    while frame_count < capture_frame_count:
        frame = vs.read()
        cv2.imshow("Frame", frame)

        if cv2.waitKey(1) & 0xFF == 27:  # 按下 ESC 键退出
            break

        frame_count += 1

    end_time = timeit.default_timer()
    vs.stop()
    cv2.destroyAllWindows()

    elapsed_time = end_time - start_time
    frame_rate = frame_count / elapsed_time
    return frame_rate

if __name__ == "__main__":
    capture_frame_count = 100  # 指定捕获帧数
    frame_rate = capture_imutils(capture_frame_count)
    print("imutils Frame Rate:", frame_rate)

imutils Frame Rate: 100.61413256692732

此程序使用 imutils 打开摄像头,捕捉100帧并返回平均帧率。请将此代码保存为一个单独的Python文件并运行。

分析和总结:

根据提供的数据,imutils 明显具有最高的帧速率,远高于其他库。这可能是因为 imutils 专注于提供快速的计算机视觉函数。
Pygame 也表现出相对较高的帧速率,但低于 imutils。
OpenCV 和 PyQt5 的帧速率较低,但仍然足够处理许多计算机视觉和多媒体应用程序的需求。
帧速率的选择通常取决于您的应用程序要求。如果您需要更高的性能和实时处理,imutils 或 Pygame 可能是更好的选择。如果您开发桌面应用程序或不需要高帧速率,OpenCV 和 PyQt5 可能足够满足您的需求。

捕获屏幕帧

1. pyautogui Frame Capture

如果您想在代码中使用pyautogui,您需要导入pyautogui模块。以下是修改后的代码:

import cv2
import numpy as np
import timeit
import pyautogui

def capture_and_display_frames(num_frames):
    frame_count = 0
    start_time = timeit.default_timer()

    # 创建一个窗口来显示捕获的屏幕帧
    cv2.namedWindow("Screen Capture", cv2.WINDOW_NORMAL)

    while frame_count < num_frames:
        # 截取屏幕上的帧
        screenshot = pyautogui.screenshot()
        screenshot = np.array(screenshot)

        # 显示捕获的屏幕帧
        cv2.imshow("Screen Capture", cv2.cvtColor(screenshot, cv2.COLOR_BGR2RGB))
        frame_count += 1

        # 按下q键退出循环
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    end_time = timeit.default_timer()
    elapsed_time = end_time - start_time
    frame_rate = frame_count / elapsed_time
    return frame_rate

if __name__ == "__main__":
    num_frames = 100
    frame_rate = capture_and_display_frames(num_frames)
    print(f"Frame Rate for {num_frames} frames: {frame_rate:.2f} FPS")

    # 关闭窗口并释放资源
    cv2.destroyAllWindows()

这段代码已经导入了pyautogui模块,并可以使用pyautogui来捕获屏幕帧。按下"q"键可以提前退出捕获过程。确保您已经安装了相关库,然后运行这段代码以执行所需的操作。

音频和视频捕捉

2. av Frame Capture

av 是一个多媒体处理库,它支持音频和视频捕捉。虽然它主要用于音视频处理,但也可以用于摄像头捕捉。以下是测试使用 av 打开摄像头并返回平均帧率的程序:

import av
import timeit

def capture_av():
    container = av.open("R.mp4")
    stream = container.streams.video[0]

    frame_count = 0
    start_time = timeit.default_timer()

    while frame_count < 100:
        frame = next(container.decode(stream))
        img = frame.to_image()
        # Process the captured frame as needed
        pass
        frame_count += 1

    end_time = timeit.default_timer()
    elapsed_time = end_time - start_time
    frame_rate = frame_count / elapsed_time
    return frame_rate

if __name__ == "__main__":
    frame_rate = capture_av()
    print("av Frame Rate:", frame_rate)

此程序使用 av 打开摄像头,捕捉100帧并返回平均帧率。请将此代码保存为一个单独的Python文件并运行。

接下来,我们将继续介绍使用 Twisted 和其他捕捉方法的程序。

python 2

SimpleCV Frame Capture

SimpleCV 是一个用于计算机视觉任务的库,它内置了摄像头捕捉和图像处理功能。以下是测试使用 SimpleCV 打开摄像头并返回平均帧率的程序:

from SimpleCV import Camera
import timeit

def capture_simplecv():
    camera = Camera()

    frame_count = 0
    start_time = timeit.default_timer()

    while frame_count < 100:
        image = camera.getImage()
        # Process the captured frame as needed
        pass
        frame_count += 1

    end_time = timeit.default_timer()
    elapsed_time = end_time - start_time
    frame_rate = frame_count / elapsed_time
    return frame_rate

if __name__ == "__main__":
    frame_rate = capture_simplecv()
    print("SimpleCV Frame Rate:", frame_rate)

此程序使用 SimpleCV 打开摄像头,捕捉100帧并返回平均帧率。请将此代码保存为一个单独的Python文件并运行。

总结

图像和视频帧捕获是计算机视觉和多媒体应用的基本组成部分。在Python中,有多种库和工具可供选择,适用于不同的需求和场景。本文提供了一个全面的指南,帮助读者了解不同的捕获方法,包括OpenCV、Pillow、Pygame、PyQt、imutils、av和SimpleCV。我们还强调了计算平均帧率的重要性,以评估性能。通过本文的指南,读者可以更好地选择适合其项目的图像和视频帧捕获方法,从而实现更高质量

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

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

相关文章

堆专题2 向上调整构建大顶堆

题目&#xff1a; 样例&#xff1a; 输入 6 3 2 6 5 8 7 输出 8 6 7 2 5 3 思路&#xff1a; 向上调整&#xff0c;就是从叶子结点开始 往 根节点 往上面调整&#xff0c;操作与 向下调整 操作类似&#xff0c;只是不用判断左右孩子&#xff0c;由于我们是从叶子结点开始 往 …

mac电脑版数字图像处理软件:ACDSee Photo Studio 9最新 for Mac

ACDSee Photo Studio 9是一款由ACD Systems开发的功能强大的照片管理和编辑软件&#xff0c;专为Mac用户提供一站式解决方案&#xff0c;方便用户轻松浏览、管理和编辑照片。该软件提供了许多实用的工具和功能&#xff0c;包括高效的导入和排序工具、强大的编辑工具、智能组织和…

淘宝价格,淘宝商品优惠券数据接口,淘宝商品销量接口,淘宝商品详情数据接口,淘宝API接口

淘宝价格和商品优惠券数据接口是淘宝平台提供的官方数据接口&#xff0c;通过调用接口&#xff0c;可以获取到淘宝商品的价格信息和优惠券数据。 获取淘宝价格和商品优惠券数据接口的步骤如下&#xff1a; 输入淘宝网址登陆淘宝账号密码。点击获取key和secret。调用获取buyer…

JS DataTable中导出PDF右侧列被截断的问题解决

JS DataTable中导出PDF右侧列被截断的问题解决 文章目录 JS DataTable中导出PDF右侧列被截断的问题解决一. 问题二. 解决办法三. 代码四. 参考资料 一. 问题 二. 解决办法 设置PDF大小和版型 orientation: landscape, pageSize: LEGAL,上述代码设置打印的PDF尺寸为LEGAL&…

400电话申请办理:为企业提供高效沟通的必备工具

在当今竞争激烈的商业环境中&#xff0c;企业需要与客户保持紧密联系&#xff0c;提供高效沟通渠道。而400电话作为一种便捷的客服热线&#xff0c;成为越来越多企业的首选。本文将介绍400电话的申请办理过程&#xff0c;帮助企业了解如何获得这一重要的沟通工具。 首先&#…

Xcode升级到15.0 解决DT_TOOLCHAIN_DIR问题

根据个人开发遇到的问题做的总结&#xff0c;公司要求Xcode 14.2 &#xff0c;Swift 5.7开发&#xff0c;由于升级了Mac 14.0系统后&#xff0c;Xcode 14.2不能使用&#xff0c;解决方案目前有2个 一、在原来Xcode 14.2 的显示包内容&#xff0c;如图 二、升级到Xcode的15.0后…

Android笔记(五):结合Compose组件利用ActivityResultLauncher解决多活动跳转返回数据

在本人博客中Android活动返回不在再支持startActivityForResult()后的处理方法已经记录采用ActivityResultLauncher来处理多活动的返回并传回数据的方式。但是采用的是布局xmlviewBinding技术。目前&#xff0c;谷歌官方推荐使用JetPack Compose组件来定义界面。在本文中&#…

DRESIS:全球首个综合耐药性数据库

耐药性已成为全球卫生保健的关键问题。目前已有的耐药相关数据库大都是针对某些疾病。本研究建立一个数据库DRESIS&#xff0c;全面描述具有耐药性的疾病和所有类型的耐药机制。公开访问网址&#xff1a;https://idrblab.org/dresis/ 01、ADTT:药物治疗靶点的变异; 02、IDUE:药…

cocos2d-x C++与Lua交互

Cocos版本&#xff1a; 3.10 Lua版本&#xff1a; 5.1.4 环境&#xff1a; window Visual Studio 2013 Lua Lua作为一种脚本语言&#xff0c; 它的运行需要有宿主的存在&#xff0c;通过Lua虚拟栈进行数据交互。 它的底层实现是C语言&#xff0c;C语言封装了很多的API接口&a…

【Jetpack Compose】BOM是什么?

前言 本篇旨在帮助小伙伴们了解和使用Compose中BOM相关的知识&#xff0c;在Compose的开发过程中更加便捷、统一的管理相关依赖信息。 BOM基础知识 Compose推出的BOM为物料清单的意思&#xff0c;BOM全称为Bill Of Materials&#xff0c;Compose推出BOM的意义旨在通过指定的…

【赠书活动】python自动售货机销售数据分析

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

Win10删除文件需要TrustedInstaller权限的解决方法

在Win10电脑中&#xff0c;有时候在我们尝试删除某些文件或文件夹时&#xff0c;系统却提示要有TrustedInstaller权限才能删除成功。这是由于一些特定的系统文件或文件夹被保护&#xff0c;确保系统的稳定性和安全性。如果大家在删除文件也遇到这样的提示&#xff0c;那么可以按…

React18入门(第三篇)——React Hooks详解,React内置Hooks、自定义Hooks使用

文章目录 概述一、内置 Hook——useState1.1 响应式数据更新1.2 什么是 state1.3 state 特点&#xff08;一&#xff09;——异步更新1.4 state 特点&#xff08;二&#xff09;——可能会被合并1.5 state 特点&#xff08;三&#xff09;——不可变数据&#xff08;重要&#…

看一下链表结构

序、慢慢来才是最快的方法。 背景 链表(Linked List) 链表是一种常见的基础数据结构&#xff0c;是一种线性表。与顺序表不同的是&#xff0c;链表中的每个节点不是顺序存储的&#xff0c;而是通过节点的指针域指向到下一个节点。 1.链表的优缺点 2.链表的类型 单链表、双链表…

UDP 的报文结构

UDP的报文结构&#xff1a; 其中前面的源端口号和目的端口号&#xff0c;UDP长度和UDP检验和&#xff0c;它们都是2个字节。 那么什么是UDP长度呢&#xff0c;它指的是后面的数据的长度&#xff0c;换算单位也就是64kb&#xff0c;因此一个数据报&#xff08;数据&#xff09;最…

idea 启动项目报错 Command line is too long

1.idea 启动报错 Command line is too long&#xff0c;启动报错信息&#xff1a;Error running ‘Application‘: Command line is too long. 2.如何解决&#xff1f; 1&#xff09;idea打开一个项目。 2.打开项目下的*.idea* 文件夹下的 workspace.xml 文件。 3.在<co…

【高阶数据结构】图详解第三篇:最小生成树(Kruskal算法+Prim算法)

文章目录 最小生成树1. 最小生成树概念2. Kruskal算法算法思想代码实现测试 3. Prim算法算法思想代码实现测试 4. 源码 最小生成树 1. 最小生成树概念 在了解最小生成树之前&#xff0c;我们先来回顾一下生成树的概念&#xff0c;这是我们之前文章提到过的&#xff1a; 无向图…

QMA6100P 姿态传感器使用

QMA6100P 姿态传感器使用 项目用途&#xff1a;分析和记录设备位置信息变化&#xff08;设备安装在车辆内部&#xff09; 通讯接口&#xff1a;I2C&#xff0c;地址0x13&#xff0c;标准I2C通讯采用IO模拟 功能需求&#xff1a;读取三轴加速度 芯片初始化设置 参考手册说明和…

STM32 芯片怎么选型?

SMT32概览&#xff1a; STM32F051R8T6x xx 代表的含义 STM32MPU产品型号含义 STM32芯片封装&#xff1a;

浮点数运算以及溢出问题

一、浮点数加减运算的步骤 对阶&#xff1a;小阶向大阶对齐&#xff0c;阶小的那个数尾数右移&#xff0c;对于IEEE754标准表示的浮点数来说&#xff0c;右移时要注意将隐含的一位1右移到小数部分尾数加减&#xff1a;注意要先还原隐藏位尾数规格化&#xff1a;直到将第一位1移…