使用openCV将图像快速写入硬盘[已关闭]

xzv2uavs  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(116)

已关闭。此问题需要更多focused。当前不接受答案。
**想要改进此问题吗?**更新问题,使其仅关注editing this post的一个问题。

5天前关闭。
Improve this question
我想使用picamera和raspberryPi来记录图像序列,使用libcamera 2和openCV,帧率大约为2-3 Hz。相机提供4056 x 3040 x 3 uint 8数组。将数据以图像或视频的形式写入硬盘,大大限制了我的记录帧率。
当我尝试使用cv2.VideoWriter()将图像附加到视频文件中时,将单个图像转换为视频格式会使每个帧增加大约一秒的时间。(无压缩)使用imwrite()到硬盘我的帧率不稳定,大多数帧需要0. 5秒,而每10帧需要2-4秒。表面上,似乎不存在导致这些延迟的后台进程。
什么是最好的一般方法来写个别帧尽快到硬盘?有一个无压缩和快速格式的视频?

2j4z5cfb

2j4z5cfb1#

我猜你在循环中运行这个程序,磁盘写操作导致了延迟问题。这不是你的程序,而是操作系统必须抓取、分配和检查新的磁盘空间,这导致了偶尔的延迟峰值。它不是那么多的数据,所以有点令人惊讶。
你可以把写的内容放在自己的线程队列中,只要写的内容能跟上你想要输出的FPS,你就可以在一个一致的时间表上抓取帧,让写的人来处理延迟。
在下面的代码中,您需要修改数据的写入方式以满足您的需要,即用您希望写入的数据替换with open...

from threading import Thread, Event
from queue import Queue

class ThreadWriter(Thread):
    def __init__(self):
        self.queue = Queue()
        self.event = Event()

    def write_file(self, path: str, data: bytes):
        self.queue.put((path, data))
        return self.queue.qsize()

    def close(self, wait=True):
        if wait:
            while not self.queue.empty():
                continue
        self.event.set()

    def run(self):
        while not self.event.is_set():
            if self.queue.empty():
                continue
            path, data = self.queue.get()
            with open(path, 'wb') as fp:
                fp.write(data)

在主程序中,创建一个ThreadWriter对象,启动它,然后将数据推送到循环中的线程。

# [imports]

FPS = 2.5
writer = ThreadWriter()
writer.start()

while True:
    # you code here to pull frames
    # n is the count of pulled data
    file_name = f'image-{n:0>4}.jpg'
    img_bytes = convert_to_jpeg(img)  # fake function for example.
    writer.write_file(file_name, img_bytes)

    sleep(1/FPS)

writer.close()

相关问题