Bao*_*ran 3 python opencv raspberry-pi
按照Adrian 指南的第 6 步和其他一些指南,我成功地将 320x240 帧以 10 fps 的速度和 0.1 秒的延迟从我的树莓派传输到我的笔记本电脑。问题是,当我在实验室(配备了古董路由器)测试这个系统时,它只能以 1-2 fps 的速度传输,延迟为 1-1.5 秒,这对于我打算用这些系统做的事情来说是完全不可接受的。帧。
现在,我的方法很简单直接:树莓派上的服务器捕获一个帧并将其存储为 320x240x3 矩阵,如上面提到的指南,然后腌制该矩阵并继续通过 TCP 套接字将其泵送。笔记本电脑上的客户端不断接收这些帧,对其进行一些处理,最后用imshow显示结果。我的代码对于一篇文章来说相当长(大约 200 行),所以如果可以的话我宁愿避免显示它。
有没有办法减少每帧数据的大小(腌制的320x240x3矩阵,其长度为230 kB)或者是否有更好的方法来传输该数据?
编辑:
好的,各位,pickled 数组的确切显示长度是 230563 字节,有效负载数据应至少为 230400 字节,因此开销不应超过总包大小的 0.07%。我认为这将问题范围缩小到无线连接质量和将数据编码为字节的方法(腌制似乎很慢)。无线问题可以通过创建自组织网络(听起来很有趣,但我还没有尝试过)或简单地购买更好的路由器来解决,而编码问题可以通过亚伦的解决方案来解决。希望这对未来的读者有所帮助:)
tl;dr:struct
实际上很慢..而不是结合pickle
使用来消除开销。np.ndarray.tobytes()
np.frombuffer()
我不太熟悉opencv
,这可能是最好的答案,但加速传输的一种直接方法可能是使用struct
来打包和解包要通过网络发送的数据,而不是pickle
.
numpy
这是通过套接字发送已知维度数组的示例struct
import numpy as np
import socket
import struct
#----- server ------
conn = socket.socket()
#connect socket somewhere
arr = np.random.randint(0,256,(320,240,3), dtype="B") # unsigned bytes "B": camera likely returns 0-255 pixel values
conn.write(struct.pack('230400B', *arr.flat)) #230400 unsigned bytes
#----- client ------
conn = socket.socket()
#connect socket somewhere
data = conn.read(230400) #read 230400 bytes
arr = np.array(struct.unpack('230400B', data), dtype='B').reshape((320,240,3),)
Run Code Online (Sandbox Code Playgroud)
编辑
稍微挖掘一下就会发现 numpy 有一个tobytes
函数,可以将数据的内存视图公开为bytes
对象。这基本上完成了 struct 的工作,而不需要在函数调用中解包参数进行编码。这也促使我考虑是否也可以进行拆包,只要您能凭感觉行事(中断或错误不会被优雅地捕获),我们就可以打包和拆包几乎零开销的数据成为您网络的唯一限制因素。
测试脚本:
arr = np.random.randint(0,256,(320,240,3), dtype="B") # unsigned bytes "B": camera likely returns 0-255 pixel values
t = time()
for _ in range(100):
arr2 = pickle.loads(pickle.dumps(arr))
print(f'pickle pack, pickle unpack: {time()-t} sec')
t = time()
for _ in range(100):
arr2 = np.array(struct.unpack('230400B', struct.pack('230400B', *arr.flat)), dtype='B').reshape((320,240,3),)
print(f'struct pack, struct unpack: {time()-t} sec')
t = time()
for _ in range(100):
arr2 = np.array(struct.unpack('230400B', arr.tobytes()), dtype='B').reshape((320,240,3),)
print(f'numpy pack, struct unpack: {time()-t} sec')
t = time()
for _ in range(100):
arr2 = np.frombuffer(arr.tobytes(), dtype="B").reshape((320,240,3),)
print(f'numpy pack, numpy unpack: {time()-t} sec')
Run Code Online (Sandbox Code Playgroud)
印刷:
泡菜包装,泡菜解包:0.005013704299926758 秒 结构打包、结构解包:3.558577299118042 秒 numpy 包,结构解包:1.2988512516021729 秒 numpy 包、numpy 解包:0.0010025501251220703 秒
归档时间: |
|
查看次数: |
3496 次 |
最近记录: |