如何对静态图片流(video)进行动态编码,以便将这些从C#发送到Python?
我使用Kinect SDK( C#
)从Kinect 2获得Depth和Color帧,然后使用ZeroMQ
将它们发送给Python客户端。
this.shorts = new ushort[ 217088]; // 512 * 424 this.depthBytes = new Byte[ 434176]; // 512 * 424 * 2 this.colorBytes = new Byte[4147200]; // 1920 * 1080 * 4 public void SendDepthFrame(DepthFrame depthFrame) { depthFrame.CopyFrameDataToArray(this.shorts); Buffer.BlockCopy(shorts, 0, this.depthBytes, 0, this.depthBytes.Length); this.depthPublisher.SendByteArray(this.depthBytes); } public void SendColorFrame(ColorFrame colorFrame, WriteableBitmap map) { colorFrame.CopyRawFrameDataToArray(this.colorBytes); this.colorPublisher.SendByteArray(this.colorBytes); }
由于我发送未压缩的数据, 我正在超载网络 ,我想压缩这些帧。
这是否可以进行连续流处理?
我知道我可以通过压缩PNG/JPEG
格式来做到这一点,但我想保持video流的概念。
目标是在C#
发送压缩数据,然后在Python中解码它们。
是否有任何libs允许这样做?
可能会忘记当前的压缩和PoC
缩减
如果您的设计确实有意义,请首先关注核心CV
function,代价是降低(缩小)FPS,colordepth,分辨率(按此优先级顺序)。
您指示的数据产生大约1 Gbps的exgress数据流,其中即将进行的CV
处理将会阻塞,具有显着的CV
处理性能(延迟/延迟)/临时数据表示的内存管理瓶颈。
这PoC
, PoC
可能会受益于1/4 – 1/10较慢的FPS采集/流处理,并且经过精细调整的解决方案可能会向您显示,您的代码在流处理余量中每帧有多少纳秒 (最终决定如果有时间和处理能力足以将任何类型的CODEC
处理包括在其他工作流水线中)
通过右键单击 – > [在新选项卡中打开
[usec]
检查[usec]
的左下角窗口延迟
在单线程i7
/3.33 GHz
设备上以更小的FPS
进行实际处理时,放大并实现几个实际openCV
延迟的大小/数量级,大约是您的一个FullFD
静止图像的1/4其中L3高速缓存大小可以携带多达15 MB
的图像数据,最快的延迟小于13 ns ( core-local access case ) .. 40 ns ( core-remote NUMA access case )
+CV
块性质-orchestrated图像处理从最小(如果不是零)缓存未命中率中获益很多 – 但这不是依赖的通用部署硬件方案:
每个缓存未命中的成本(penalty
) 以及在主DDR-RAM
请求和执行数据访问的需求大约为+100 ns
>>> https://stackoverflow.com/a/33065382/3666197
没有工作流水线 ,就没有关于持续流处理/它的每帧边际的定量数据来决定所提出的PoC
实现的先验的CODEC
难度。