如何使用opencv将从摄像头读取的帧从一个python脚本传递到另一个python脚本?

vaqhlq81  于 2022-11-15  发布在  Python
关注(0)|答案(2)|浏览(136)

我试图将从摄像头读取的帧作为参数传递给另一个python脚本,但无法使其工作。
运行以下脚本每5秒在我的网络上存储一个摄像机帧:

#!/usr/bin/python

import cv2
import threading
import subprocess
import time
import datetime

def camera():
    camera = cv2.VideoCapture("/dev/video0")
    if not camera.isOpened():
        print("Cannot open camera.")
        raise SystemExit
    camera.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
    camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 320)
    camera.set(cv2.CAP_PROP_FPS, 15)
    return camera

try:
    camera = camera()
    while True:
        frame = camera.read()[1]
        #subprocess.call(["python", "/home/user/test2.py", frame])
        server = "/net/192.168.4.51/mnt/LAN4Storage/EC/Camera/"
        cv2.imwrite(server + "temp.jpg", frame)
        timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        cv2.imwrite(server + timestamp + ".jpg", frame)
        time.sleep(5)

except Exception as error:
    print(error)

finally:
    camera.release()

如果我取消对subprocess.call行的注解,并对接下来的4行进行注解,我希望该帧传递给我的test2.py脚本:
`

#/usr/bin/env python

    import cv2
    import sys
    import os
    import time
    import datetime

    try:
        frame = cv2.imread(sys.argv[1])
        server = "/net/192.168.4.51/mnt/LAN4Storage/EC/Camera/"
        cv2.imwrite(server + "temp.jpg", frame)
        timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        cv2.imwrite(server + timestamp + ".jpg", frame)

    except Exception as error:
        print(error)

    finally:
        pass

'但是在启动www.example.com时test1.py,我得到以下错误:

`expected str, bytes or os.PathLike object, not ndarray`
brccelvz

brccelvz1#

帧对象是一个ndarray,您需要将其转换为字符串。如果您这样做:

subprocess.call(["python", "/home/user/test2.py", frame.tostring()]) should work.

但是你不应该使用cv2.imread,因为你不是从文件中阅读图像,而是从命令中的字符串中读取
所以你应该用

frame = np.fromstring(sys.argv[1])

我不确定从ndarray到string的转换是否正常,可能需要调整参数

carvr3hs

carvr3hs2#

这里似乎有几个错误的概念正在把事情引入歧途。

  • 你不能将图像(即它们的完整像素数据)作为命令行参数传递。它们通常太长,可能包含空值。
  • 考虑为视频的每一帧写入图像是非常低效的。这实际上就是为什么我们有视频-因为我们可以在帧之间进行差分和运动矢量,以实现更好的压缩。
  • 您可以将图像文件写入RAM,而不会导致SD卡磨损。

根据我目前的理解,我建议:

  • 将映像写入tmpfs文件系统(也称为RAM驱动器),或者
  • 查看this答案,并将图像写入Redis,在那里您可以使用Python、C/C++、Ruby或bash脚本从网络中的任何机器或进程中获取图像。

请注意,如果使用基于文件的方法,并且从多个进程进行非同步访问,那么如果在读取过程中文件被覆盖,则可能会发生损坏。避免这种情况的一种方法是利用重命名是原子性的这一事实。因此,将映像写入一个名为InProgress.jpg的文件,完成后,将InProgress.jpg重命名为Latest.jpg,并让读取器始终读取Latest.jpg。这样,读取器将始终获得两个文件中的一个,而不会获得不同版本的两个不一致的部分。
另外,请记住Dan关于缓冲的评论。更多的材料here

相关问题