我试图将从摄像头读取的帧作为参数传递给另一个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`
2条答案
按热度按时间brccelvz1#
帧对象是一个ndarray,您需要将其转换为字符串。如果您这样做:
但是你不应该使用cv2.imread,因为你不是从文件中阅读图像,而是从命令中的字符串中读取
所以你应该用
我不确定从ndarray到string的转换是否正常,可能需要调整参数
carvr3hs2#
这里似乎有几个错误的概念正在把事情引入歧途。
根据我目前的理解,我建议:
tmpfs
文件系统(也称为RAM驱动器),或者请注意,如果使用基于文件的方法,并且从多个进程进行非同步访问,那么如果在读取过程中文件被覆盖,则可能会发生损坏。避免这种情况的一种方法是利用重命名是原子性的这一事实。因此,将映像写入一个名为
InProgress.jpg
的文件,完成后,将InProgress.jpg
重命名为Latest.jpg
,并让读取器始终读取Latest.jpg
。这样,读取器将始终获得两个文件中的一个,而不会获得不同版本的两个不一致的部分。另外,请记住Dan关于缓冲的评论。更多的材料here。