Python3 以网络摄像头 fps 处理并显示网络摄像头流

2023-11-21

如何读取相机并以相机帧速率显示图像?

我想连续从网络摄像头读取图像(进行一些快速预处理),然后在窗口中显示图像。这应该以我的网络摄像头提供的帧速率(29 fps)运行。 OpenCV GUI 和 Tkinter GUI 似乎太慢,无法以这样的帧速率显示图像。这些显然是我实验中的瓶颈。即使没有预处理,图像的显示速度也不够快。我使用的是 MacBook Pro 2018。

这是我尝试过的。网络摄像头始终使用 OpenCV 读取:

  • 一切都发生在主线程中,图像使用 OpenCV 显示:12 fps
  • 读取相机并在单独的线程中进行预处理,在主线程中使用 OpenCV 显示图像:20 fps
  • 多线程如上,但不显示图像:29 fps
  • 像上面一样多线程,但是用 Tkinter 显示图像:不知道确切的 fps,但感觉

这是代码:

单循环,OpenCV GUI:

import cv2
import time


def main():
    cap = cv2.VideoCapture(0)
    window_name = "FPS Single Loop"
    cv2.namedWindow(window_name, cv2.WINDOW_NORMAL)

    start_time = time.time()
    frames = 0

    seconds_to_measure = 10
    while start_time + seconds_to_measure > time.time():
        success, img = cap.read()
        img = img[:, ::-1]  # mirror
        time.sleep(0.01)  # simulate some processing time
        cv2.imshow(window_name, img)
        cv2.waitKey(1)
        frames = frames + 1

    cv2.destroyAllWindows()

    print(
        f"Captured {frames} in {seconds_to_measure} seconds. FPS: {frames/seconds_to_measure}"
    )


if __name__ == "__main__":
    main()

Captured 121 in 10 seconds. FPS: 12.1

多线程,opencv 图形用户界面:

import logging
import time
from queue import Full, Queue
from threading import Thread, Event

import cv2

logger = logging.getLogger("VideoStream")


def setup_webcam_stream(src=0):
    cap = cv2.VideoCapture(src)
    width, height = (
        cap.get(cv2.CAP_PROP_FRAME_WIDTH),
        cap.get(cv2.CAP_PROP_FRAME_HEIGHT),
    )
    logger.info(f"Camera dimensions: {width, height}")
    logger.info(f"Camera FPS: {cap.get(cv2.CAP_PROP_FPS)}")
    grabbed, frame = cap.read()  # Read once to init
    if not grabbed:
        raise IOError("Cannot read video stream.")
    return cap


def video_stream_loop(video_stream: cv2.VideoCapture, queue: Queue, stop_event: Event):
    while not stop_event.is_set():
        try:
            success, img = video_stream.read()
            # We need a timeout here to not get stuck when no images are retrieved from the queue
            queue.put(img, timeout=1)
        except Full:
            pass  # try again with a newer frame


def processing_loop(input_queue: Queue, output_queue: Queue, stop_event: Event):
    while not stop_event.is_set():
        try:
            img = input_queue.get()
            img = img[:, ::-1]  # mirror
            time.sleep(0.01)  # simulate some processing time
            # We need a timeout here to not get stuck when no images are retrieved from the queue
            output_queue.put(img, timeout=1)
        except Full:
            pass  # try again with a newer frame


def main():
    stream = setup_webcam_stream(0)
    webcam_queue = Queue()
    processed_queue = Queue()
    stop_event = Event()
    window_name = "FPS Multi Threading"
    cv2.namedWindow(window_name, cv2.WINDOW_NORMAL)

    start_time = time.time()
    frames = 0

    seconds_to_measure = 10
    try:
        Thread(
            target=video_stream_loop, args=[stream, webcam_queue, stop_event]
        ).start()
        Thread(
            target=processing_loop, args=[webcam_queue, processed_queue, stop_event]
        ).start()
        while start_time + seconds_to_measure > time.time():
            img = processed_queue.get()
            cv2.imshow(window_name, img)
            cv2.waitKey(1)
            frames = frames + 1
    finally:
        stop_event.set()

    cv2.destroyAllWindows()

    print(
        f"Captured {frames} frames in {seconds_to_measure} seconds. FPS: {frames/seconds_to_measure}"
    )
    print(f"Webcam queue: {webcam_queue.qsize()}")
    print(f"Processed queue: {processed_queue.qsize()}")


if __name__ == "__main__":
    logging.basicConfig(level=logging.DEBUG)
    main()
INFO:VideoStream:Camera dimensions: (1280.0, 720.0)
INFO:VideoStream:Camera FPS: 29.000049
Captured 209 frames in 10 seconds. FPS: 20.9
Webcam queue: 0
Processed queue: 82

在这里您可以看到第二个队列中剩余图像,其中图像被获取以显示它们。

当我取消注释这两行时:

cv2.imshow(window_name, img)
cv2.waitKey(1)

那么输出是:

INFO:VideoStream:Camera dimensions: (1280.0, 720.0)
INFO:VideoStream:Camera FPS: 29.000049
Captured 291 frames in 10 seconds. FPS: 29.1
Webcam queue: 0
Processed queue: 0

因此,它能够以网络摄像头的速度处理所有帧,而无需 GUI 显示它们。

多线程,Tkinter 图形用户界面:

import logging
import time
import tkinter
from queue import Full, Queue, Empty
from threading import Thread, Event

import PIL
from PIL import ImageTk
import cv2

logger = logging.getLogger("VideoStream")


def setup_webcam_stream(src=0):
    cap = cv2.VideoCapture(src)
    width, height = cap.get(cv2.CAP_PROP_FRAME_WIDTH), cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
    logger.info(f"Camera dimensions: {width, height}")
    logger.info(f"Camera FPS: {cap.get(cv2.CAP_PROP_FPS)}")
    grabbed, frame = cap.read()  # Read once to init
    if not grabbed:
        raise IOError("Cannot read video stream.")
    return cap, width, height


def video_stream_loop(video_stream: cv2.VideoCapture, queue: Queue, stop_event: Event):
    while not stop_event.is_set():
        try:
            success, img = video_stream.read()
            # We need a timeout here to not get stuck when no images are retrieved from the queue
            queue.put(img, timeout=1)
        except Full:
            pass  # try again with a newer frame


def processing_loop(input_queue: Queue, output_queue: Queue, stop_event: Event):
    while not stop_event.is_set():
        try:
            img = input_queue.get()
            img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
            img = img[:, ::-1]  # mirror
            time.sleep(0.01)  # simulate some processing time
            # We need a timeout here to not get stuck when no images are retrieved from the queue
            output_queue.put(img, timeout=1)
        except Full:
            pass  # try again with a newer frame


class App:
    def __init__(self, window, window_title, image_queue: Queue, image_dimensions: tuple):
        self.window = window
        self.window.title(window_title)

        self.image_queue = image_queue

        # Create a canvas that can fit the above video source size
        self.canvas = tkinter.Canvas(window, width=image_dimensions[0], height=image_dimensions[1])
        self.canvas.pack()

        # After it is called once, the update method will be automatically called every delay milliseconds
        self.delay = 1
        self.update()

        self.window.mainloop()

    def update(self):
        try:
            frame = self.image_queue.get(timeout=0.1)  # Timeout to not block this method forever
            self.photo = ImageTk.PhotoImage(image=PIL.Image.fromarray(frame))
            self.canvas.create_image(0, 0, image=self.photo, anchor=tkinter.NW)
            self.window.after(self.delay, self.update)
        except Empty:
            pass  # try again next time


def main():
    stream, width, height = setup_webcam_stream(0)
    webcam_queue = Queue()
    processed_queue = Queue()
    stop_event = Event()
    window_name = "FPS Multi Threading"

    try:
        Thread(target=video_stream_loop, args=[stream, webcam_queue, stop_event]).start()
        Thread(target=processing_loop, args=[webcam_queue, processed_queue, stop_event]).start()
        App(tkinter.Tk(), window_name, processed_queue, (width, height))
    finally:
        stop_event.set()

    print(f"Webcam queue: {webcam_queue.qsize()}")
    print(f"Processed queue: {processed_queue.qsize()}")


if __name__ == "__main__":
    logging.basicConfig(level=logging.DEBUG)
    main()
INFO:VideoStream:Camera dimensions: (1280.0, 720.0)
INFO:VideoStream:Camera FPS: 29.000049
Webcam queue: 0
Processed queue: 968

关于这个答案我分享一些考虑相机帧率 VS 显示帧率以及一些演示的代码示例:

  • FPS计算基础知识;
  • 如何提高显示 FPS29 fps to 300+ fps;
  • 如何使用threading and queue有效地以相机支持的最接近的最大 fps 进行拍摄;

对于遇到您的问题的任何人,以下是需要首先回答的几个重要问题:

  • 捕获的图像大小是多少?
  • 您的网络摄像头支持多少 FPS? (相机帧率)
  • 从网络摄像头抓取帧并将其显示在窗口中的速度有多快? (显示帧率)

相机 FPS VS 显示 FPS

The 相机帧率指的是相机的硬件能力。例如,ffmpeg告诉我,在 640x480 分辨率下,我的相机可以返回最小 15 fps,最大 30 fps,以及其他格式:

ffmpeg -list_devices true -f dshow -i dummy
ffmpeg -f dshow -list_options true -i video="HP HD Camera"

[dshow @ 00000220181cc600]   vcodec=mjpeg  min s=640x480 fps=15 max s=640x480 fps=30
[dshow @ 00000220181cc600]   vcodec=mjpeg  min s=320x180 fps=15 max s=320x180 fps=30
[dshow @ 00000220181cc600]   vcodec=mjpeg  min s=320x240 fps=15 max s=320x240 fps=30
[dshow @ 00000220181cc600]   vcodec=mjpeg  min s=424x240 fps=15 max s=424x240 fps=30
[dshow @ 00000220181cc600]   vcodec=mjpeg  min s=640x360 fps=15 max s=640x360 fps=30
[dshow @ 00000220181cc600]   vcodec=mjpeg  min s=848x480 fps=15 max s=848x480 fps=30
[dshow @ 00000220181cc600]   vcodec=mjpeg  min s=960x540 fps=15 max s=960x540 fps=30
[dshow @ 00000220181cc600]   vcodec=mjpeg  min s=1280x720 fps=15 max s=1280x720 fps=30

这里重要的认识是,尽管能够在内部捕获 30 fps,但不能保证应用程序能够在一秒钟内从相机中提取这 30 帧。以下各节阐明了其背后的原因。

The 显示帧率指的是每秒可以在一个窗口中绘制多少张图像。这个数字完全不受相机的限制,通常远高于相机的 fps。正如您稍后将看到的,可以创建每秒从相机提取 29 个图像并每秒绘制超过 300 次的应用程序。这意味着在从相机中拉出下一帧之前,会在窗口中多次绘制来自相机的相同图像。

我的网络摄像头可以捕获多少 FPS?

以下应用程序简单演示了如何打印相机使用的默认设置(大小、fps)以及如何从中检索帧、将其显示在窗口中并计算正在渲染的 FPS 量:

import numpy as np
import cv2
import datetime
    
def main():
    # create display window
    cv2.namedWindow("webcam", cv2.WINDOW_NORMAL)

    # initialize webcam capture object
    cap = cv2.VideoCapture(0)

    # retrieve properties of the capture object
    cap_width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
    cap_height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
    cap_fps = cap.get(cv2.CAP_PROP_FPS)
    fps_sleep = int(1000 / cap_fps)
    print('* Capture width:', cap_width)
    print('* Capture height:', cap_height)
    print('* Capture FPS:', cap_fps, 'ideal wait time between frames:', fps_sleep, 'ms')

    # initialize time and frame count variables
    last_time = datetime.datetime.now()
    frames = 0

    # main loop: retrieves and displays a frame from the camera
    while (True):
        # blocks until the entire frame is read
        success, img = cap.read()
        frames += 1

        # compute fps: current_time - last_time
        delta_time = datetime.datetime.now() - last_time
        elapsed_time = delta_time.total_seconds()
        cur_fps = np.around(frames / elapsed_time, 1)

        # draw FPS text and display image
        cv2.putText(img, 'FPS: ' + str(cur_fps), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv2.LINE_AA)
        cv2.imshow("webcam", img)

        # wait 1ms for ESC to be pressed
        key = cv2.waitKey(1)
        if (key == 27):
            break

    # release resources
    cv2.destroyAllWindows()
    cap.release()


if __name__ == "__main__":
    main()

Output:

* Capture width: 640.0
* Capture height: 480.0
* Capture FPS: 30.0 wait time between frames: 33 ms

如前所述,我的相机默认能够以 30 fps 的速度拍摄 640x480 的图像,尽管上面的循环非常简单,但我的相机显示帧率较低:我只能检索帧并以 28 或 29 fps 的速度显示它们,并且中间不执行任何自定义图像处理。这是怎么回事?

现实情况是,尽管循环看起来非常简单,但幕后发生的一些事情只花费了足够的处理时间,使得循环的一次迭代很难在不到 33 毫秒的时间内发生:

  • cap.read()对相机驱动程序执行 I/O 调用以提取新数据。此函数会阻止应用程序的执行,直到数据完全传输为止;
  • 需要使用新像素设置 numpy 数组;
  • 需要其他调用来显示窗口并在其中绘制像素,即cv2.imshow(),通常运行缓慢;
  • 还有 1ms 的延迟,这要归功于cv2.waitKey(1)保持窗户打开所需的;

所有这些操作,尽管很小,却使应用程序调用起来非常困难cap.read(),获取一个新帧并以 30 fps 精确显示。

您可以尝试多种方法来加快应用程序的速度,以便能够显示比相机驱动程序允许的更多的帧,并且这个帖子很好地覆盖它们。请记住这一点:你将无法捕获更多帧来自摄像头的内容比驱动程序所说的支持的内容要多。但是,您将能够显示更多帧.

如何增加显示帧率 to 300+? A threading例子。

用于增加每秒显示的图像数量的方法之一依赖于threading包来创建一个单独的线程来连续从相机中提取帧。发生这种情况是因为应用程序的主循环没有被阻止cap.read()不再等待它返回新帧,从而增加每秒可以显示(或绘制)的帧数。

Note:此方法会在窗口上多次渲染同一图像,直到从相机检索到下一个图像。请记住,它甚至可能会在其内容仍在使用来自相机的新数据进行更新时绘制图像。

以下应用程序只是一个学术示例,我不建议将其作为生产代码,以增加窗口中每秒显示的帧数:

import numpy as np
import cv2
import datetime
from threading import Thread

# global variables
stop_thread = False             # controls thread execution
img = None                      # stores the image retrieved by the camera


def start_capture_thread(cap):
    global img, stop_thread

    # continuously read fames from the camera
    while True:
        _, img = cap.read()

        if (stop_thread):
            break


def main():
    global img, stop_thread

    # create display window
    cv2.namedWindow("webcam", cv2.WINDOW_NORMAL)

    # initialize webcam capture object
    cap = cv2.VideoCapture(0)

    # retrieve properties of the capture object
    cap_width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
    cap_height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
    cap_fps = cap.get(cv2.CAP_PROP_FPS)
    fps_sleep = int(1000 / cap_fps)
    print('* Capture width:', cap_width)
    print('* Capture height:', cap_height)
    print('* Capture FPS:', cap_fps, 'wait time between frames:', fps_sleep)

    # start the capture thread: reads frames from the camera (non-stop) and stores the result in img
    t = Thread(target=start_capture_thread, args=(cap,), daemon=True) # a deamon thread is killed when the application exits
    t.start()

    # initialize time and frame count variables
    last_time = datetime.datetime.now()
    frames = 0
    cur_fps = 0

    while (True):
        # blocks until the entire frame is read
        frames += 1

        # measure runtime: current_time - last_time
        delta_time = datetime.datetime.now() - last_time
        elapsed_time = delta_time.total_seconds()

        # compute fps but avoid division by zero
        if (elapsed_time != 0):
            cur_fps = np.around(frames / elapsed_time, 1)

        # TODO: make a copy of the image and process it here if needed

        # draw FPS text and display image
        if (img is not None):
            cv2.putText(img, 'FPS: ' + str(cur_fps), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv2.LINE_AA)
            cv2.imshow("webcam", img)

        # wait 1ms for ESC to be pressed
        key = cv2.waitKey(1)
        if (key == 27):
            stop_thread = True
            break

    # release resources
    cv2.destroyAllWindows()
    cap.release()


if __name__ == "__main__":
    main()

如何以相机支持的最接近的最大fps进行拍摄? Athreading and queue例子。

使用的问题queue就性能而言,您获得的结果取决于应用程序每秒可以从相机中提取多少帧。如果相机支持 30 fps 那么这就是您的应用程序might只要正在完成的图像处理操作很快即可。否则,显示的帧数(每秒)将会下降,并且队列的大小将缓慢增加,直到所有 RAM 内存耗尽。为了避免这个问题,请确保设置queueSize一个数字可以防止队列增长超出操作系统的处理能力。

以下代码是一个简单的实现,它创建了一个专用的thread从相机中抓取帧并将它们放入queue稍后由应用程序的主循环使用:

import numpy as np
import cv2
import datetime
import queue
from threading import Thread

# global variables
stop_thread = False             # controls thread execution


def start_capture_thread(cap, queue):
    global stop_thread

    # continuously read fames from the camera
    while True:
        _, img = cap.read()
        queue.put(img)

        if (stop_thread):
            break


def main():
    global stop_thread

    # create display window
    cv2.namedWindow("webcam", cv2.WINDOW_NORMAL)

    # initialize webcam capture object
    cap = cv2.VideoCapture(0)
    #cap = cv2.VideoCapture(0 + cv2.CAP_DSHOW)

    # retrieve properties of the capture object
    cap_width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
    cap_height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
    cap_fps = cap.get(cv2.CAP_PROP_FPS)
    print('* Capture width:', cap_width)
    print('* Capture height:', cap_height)
    print('* Capture FPS:', cap_fps)

    # create a queue
    frames_queue = queue.Queue(maxsize=0)

    # start the capture thread: reads frames from the camera (non-stop) and stores the result in img
    t = Thread(target=start_capture_thread, args=(cap, frames_queue,), daemon=True) # a deamon thread is killed when the application exits
    t.start()

    # initialize time and frame count variables
    last_time = datetime.datetime.now()
    frames = 0
    cur_fps = 0

    while (True):
        if (frames_queue.empty()):
            continue

        # blocks until the entire frame is read
        frames += 1

        # measure runtime: current_time - last_time
        delta_time = datetime.datetime.now() - last_time
        elapsed_time = delta_time.total_seconds()

        # compute fps but avoid division by zero
        if (elapsed_time != 0):
            cur_fps = np.around(frames / elapsed_time, 1)

        # retrieve an image from the queue
        img = frames_queue.get()

        # TODO: process the image here if needed

        # draw FPS text and display image
        if (img is not None):
            cv2.putText(img, 'FPS: ' + str(cur_fps), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv2.LINE_AA)
            cv2.imshow("webcam", img)

        # wait 1ms for ESC to be pressed
        key = cv2.waitKey(1)
        if (key == 27):
            stop_thread = True
            break

    # release resources
    cv2.destroyAllWindows()
    cap.release()


if __name__ == "__main__":
    main()

之前我说过might这就是我的意思:即使我使用专用的thread从相机中提取帧并queue为了存储它们,显示的 fps 仍被限制为 29.3,而它本应为 30 fps。在这种情况下,我假设相机驱动程序或后端实现使用VideoCapture可以归咎于这个问题。在 Windows 上,默认使用的后端是MSMF.

可以强制VideoCapture通过在构造函数上传递正确的参数来使用不同的后端:

cap = cv2.VideoCapture(0 + cv2.CAP_DSHOW)

我的经验DShow太可怕了:返回CAP_PROP_FPS从相机是0并且显示的 FPS 被卡住了14。这只是一个示例,用于说明后端捕获驱动程序如何对相机捕获产生负面干扰。

但这是你可以探索的事情。也许在操作系统上使用不同的后端可以提供更好的结果。这是一个不错的OpenCV 视频 I/O 模块的高级概述列出了支持的后端:

Update

在这个答案的评论之一中,OP 在 Mac OS 上将 OpenCV 4.1 升级到 4.3,并观察到 ​​FPS 渲染有明显的改进。看起来这是一个与以下相关的性能问题cv2.imshow().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python3 以网络摄像头 fps 处理并显示网络摄像头流 的相关文章

  • Argparse nargs="+" 正在吃位置参数

    这是我的解析器配置的一小部分 parser add argument infile help The file to be imported type argparse FileType r default sys stdin parser
  • 填充两个函数之间的区域

    import matplotlib pyplot as plt import numpy as np def domain x np arange 0 10 0 001 f1 lambda x 2 x x 2 0 5 plt plot x
  • 如何在 Ubuntu 16.04 上的 Python 3 / Matplotlib 2 中安装底图?

    I tried pip3 install basemap but Basemap https sourceforge net projects matplotlib files matplotlib toolkits 好像不在 PyPI 上
  • 从零开始的 numpy 形状意味着什么

    好的 我发现数组的形状中可以包含 0 对于将 0 作为唯一维度的情况 这对我来说是有意义的 它是一个空数组 np zeros 0 但如果你有这样的情况 np zeros 0 100 让我很困惑 为什么这么定义呢 据我所知 这只是表达空数组的
  • 如何创建一个语句来打印以特定单词开头的单词? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何在 python 中打印从特定字母开始的单词 而不使用函数 而是使用方法或循环 1 我有一个字符串 想要打印以 m 开头的单词 S
  • 为什么Python的curses中escape键有延迟?

    In the Python curses module I have observed that there is a roughly 1 second delay between pressing the esc key and getc
  • 以同步方式使用 FastAPI,如何获取 POST 请求的原始正文?

    在中使用 FastAPIsync not async模式 我希望能够接收 POST 请求的原始 未更改的正文 我能找到的所有例子都显示async代码 当我以正常同步方式尝试时 request body 显示为协程对象 当我通过发布一些内容来
  • 使用 OLS 回归预测未来值(Python、StatsModels、Pandas)

    我目前正在尝试在 Python 中实现 MLR 但不确定如何将我找到的系数应用于未来值 import pandas as pd import statsmodels formula api as sm import statsmodels
  • 如何在进入新活动之前终止线程和处理程序

    大家好 在我尝试清理处理程序时 这段代码可能有点混乱 因为我一直在尝试追踪崩溃发生的位置 我有一个对话框活动 显示密码输入 进度条由线程和处理程序动画显示 似乎当我试图查看进度条是否完成并尝试终止线程时 当我尝试进入新活动时 我这样做的方式
  • Numpy 过滤器平滑零区域

    我有一个 0 及更大整数的 2D numpy 数组 其中值代表区域标签 例如 array 9 9 9 0 0 0 0 1 1 1 9 9 9 9 0 7 1 1 1 1 9 9 9 9 0 2 2 1 1 1 9 9 9 8 0 2 2 1
  • 将 JSON 对象传递给带有请求的 url

    所以 我想利用 Kenneth 的优秀请求模块 https github com kennethreitz requests 在尝试使用时偶然发现了这个问题自由库API http wiki freebase com wiki API 基本上
  • Pandas 根据 diff 列形成簇

    我正在尝试使用 Pandas 根据表示时间 以秒为单位 的列中的差异来消除数据框中的一些接近重复项 例如 import pandas as pd numpy as np df pd DataFrame 1200 1201 1233 1555
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 创建嵌套字典单行

    您好 我有三个列表 我想使用一行创建一个三级嵌套字典 i e l1 a b l2 1 2 3 l3 d e 我想创建以下嵌套字典 nd a 1 d 0 e 0 2 d 0 e 0 3 d 0 e 0 b a 1 d 0 e 0 2 d 0
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • Ubuntu 上的 Python 2.7

    我是 Python 新手 正在 Linux 机器 Ubuntu 10 10 上工作 它正在运行 python 2 6 但我想运行 2 7 因为它有我想使用的功能 有人敦促我不要安装 2 7 并将其设置为我的默认 python 我的问题是 如
  • 具有自定义值的 Django 管理外键下拉列表

    我有 3 个 Django 模型 class Test models Model pass class Page models Model test models ForeignKey Test class Question model M
  • 检查字典键是否有空值

    我有以下字典 dict1 city name yass region zipcode phone address tehsil planet mars 我正在尝试创建一个基于 dict1 的新字典 但是 它不会包含带有空字符串的键 它不会包
  • 从 Twitter API 2.0 获取 user.fields 时出现问题

    我想从 Twitter API 2 0 端点加载推文 并尝试获取标准字段 作者 文本 和一些扩展字段 尤其是 用户 字段 端点和参数的定义工作没有错误 在生成的 json 中 我只找到标准字段 但没有找到所需的 user fields 用户
  • 迭代 pandas 数据框的最快方法?

    如何运行数据框并仅返回满足特定条件的行 必须在之前的行和列上测试此条件 例如 1 2 3 4 1 1 1999 4 2 4 5 1 2 1999 5 2 3 3 1 3 1999 5 2 3 8 1 4 1999 6 4 2 6 1 5 1

随机推荐

  • Python - 查找时间段的算法

    假设今天我的工作时间是 09 00 到 18 00 我有 3 个约会 10 00 10 30 12 00 13 00 15 30 17 10 我需要找到一天中 1 小时的可用时段列表 这是我应该得到的清单 09 00 10 00 10 30
  • 使用 Expo (React Native) 的 Firebase Firestore 缺少或权限不足

    我一直在使用 FireStore 进行一个在浏览器中运行良好的项目 但是当我将代码移植到 Expo 并在模拟器中的 iOS 11 2 iPhone X 上运行时 它不断提高Error Missing or insufficient perm
  • 递归 setInterval() 连续运行

    我试图使用 JavaScript 使用递归 setInterval 函数每 5 秒运行一个函数 以下代码只是尽快记录 启动 然后使浏览器崩溃 为什么它不是每 5 秒运行一次 function five console log five se
  • pandas 应用正则表达式来替换值

    我已将一些定价数据读取到 pandas 数据框中 这些值显示为 40 000 40000 conditions attached 我想将其精简为数值 我知道我可以循环并应用正则表达式 0 9 每个字段然后将结果列表重新连接在一起 但是有没有
  • 使用 Itext 替换 PDF 文件中的字符串,但字母 X 不替换

    我正在尝试替换的内容PDF在一篇文本中 但字母 X 未被替换 public static void main String args String DEST home diego Documentos teste pdf try PdfRe
  • jpa hibernate复合外键映射

    我在为某些实体设置 jpa 映射时遇到问题 我有一个如下定义的父实体 Entity Table name EIF INSTANCE HDR public class InstanceEntity implements Serializabl
  • 从另一个文件覆盖 JS 函数

    我试图重写 Bigcartel 的 JS 函数 我无法访问 JS 文件 原文是 updateCart function cart aside cart count main header cart htmlHighlight cart it
  • DevArt 的 dotConnect for Oracle 与 DataDirect 的 ADO.NET 数据提供程序

    有没有人对 DevArt 的 dotConnect for Oracle 和来自 DataDirect 的 ADO NET 数据提供程序 我们正在考虑将这些框架中提供的实体框架支持用于关键企业应用程序 我读过的一些文章提出了以下建议 Dev
  • 如何使用 javascript 将值从一个 html 页面传递到另一个 html 页面

    在第一页中 我在文本框中获取值 我需要将其传递到另一个页面 该页面分为 2 个框架 我需要在第一帧的 html 页面中显示该值 请给我一个简单的例子 我尝试过 window document getElementById inputbox1
  • 在 .Net Framework 的 Git 操作中运行 Nunit 测试

    我正在使用 NUnit Framework 来测试我的 NET Framework 项目 我想通过 GitHub Actions 运行我的测试 yml 文件 build runs on windows latest steps uses a
  • 如何使项目符号直接出现在 python 的 reportlab 包中缩进列表的文本旁边?

    我正在使用reportlab 2 6 的ListFlowable 来制作带有彩色圆圈项目符号的项目符号列表 但是 我希望项目符号显示在文本旁边 而不是与前面的非缩进文本对齐 我尝试打开 ListFlowable 源代码 但在那里找不到太多内
  • 无需开发者帐户的 Apple 推送通知

    我知道 需要注册Apple开发者帐户才能使用推送通知吗 对于已经拥有开发人员的其他人来说可能吗 为我生成证书的帐户 还是受到 Apple 限制 据我所知 还没有 我开发移动应用程序已经五年了 即使您使用的是 Firebase Cloud M
  • 将参数传递给 angularjs 过滤器

    是否可以将参数传递给过滤器函数 以便可以按任何名称进行过滤 就像是 scope weDontLike function item name console log arguments return item name name 实际上还有另
  • 使用 Ajax 和 jQuery 检查文件是否存在 - 始终返回 200 响应

    所以我需要在向客户端显示特定数据之前检查文件是否存在 使用 jQuery 我有这个 当我尝试运行该函数时 其中 example com 是我的域名 我总是收到 200 响应代码 我想知道
  • Django、Virtualenv、nginx + uwsgi导入模块wsgi报错

    我尝试使用 nginx virtualenv 和 uwsgi 在临时服务器上设置我的 django 项目 但我不断收到导入模块 wsgi 错误 如果有一个社区我可以在这里找到答案 提前谢谢大家 这是我的配置文件 我的 django 项目上的
  • 如何在SSIS包中参数化数据库连接字符串?

    我有一个在 Business Intelligence Development Studio 中构建的 SSIS 包 其中指定了源数据库和目标数据库 现在我想使用一些变量来参数化数据库连接并在命令行中运行包 我尝试用变量 User Sour
  • 模拟和网络凭据

    我需要通过一个NetworkCredential对象 其中包含当前模拟的用户从 ASP NET 应用程序访问 Web 服务的凭据 我的代码如下所示 WindowsIdentity windowsIdentity HttpContext Cu
  • Git - 暂时保存当前工作

    我正在 master 分支上添加一个功能 更改几个文件后 我意识到我需要在没有更改的情况下检查输出 我能想到的办法是 提交当前更改 签出并切换到新分支 在新分支中 git reset hard HEAD 这样我就可以回到原来的代码了 尝试代
  • 以步进增量滚动水平 UIScrollView?

    我有一个可以水平滚动的 UIScrollView 可滚动的内容按列显示 有没有办法使滚动仅以步进增量而不是像素移动 即一次移动一列 Diagram 是的 有 yourScrollView pagingEnabled YES 检查UI滚动视图
  • Python3 以网络摄像头 fps 处理并显示网络摄像头流

    如何读取相机并以相机帧速率显示图像 我想连续从网络摄像头读取图像 进行一些快速预处理 然后在窗口中显示图像 这应该以我的网络摄像头提供的帧速率 29 fps 运行 OpenCV GUI 和 Tkinter GUI 似乎太慢 无法以这样的帧速