python - 在有限的数据包大小上通过无线电传输图像
问题描述
我在通过无线电模块传输图像时遇到了很多问题,在接收端重建图像时会出现问题。
该模块允许我们在每个数据包中传输 256 个字节,其中 16 个字节保留用于标头(地址+AES128 加密),这为我们留下了 240 个字节的 ASCII 编码字符串。
到目前为止,我所做的是将彩色图像转换为 base64 编码流(在 Python 中导入 base64),然后将其拆分为多个不同的行,以将其合并到 240 字节限制内,然后发送到发送器。但是,在接收端,我发现在一定数量的数据包之后,很少有数据包丢失,导致整个图像不完整且无用。我还尝试了其他形式的编码,例如十六进制,这导致了类似的方式。
有问题的图像是 320x240 像素、24 位深度的 JPG 格式彩色图像(PNG 图像的尺寸更大)。
如果有人知道将图像转换为字符串的其他方法或任何允许我将图像转换为 ASCII 流甚至二进制流的开源工具,请告诉我。
编辑:在更深入地研究这个问题之后,可能的想法之一是创建一个系统,在该系统中,接收器向发送器发送反馈,表明丢失了特定的数据包。是否有现有的软件或代码可以让我检查它。
谢谢。
解决方案
我认为问题在于 JPEG 和 Base64 都不能容忍任何数据丢失,因为一切都取决于以前发生的事情。
更好的方法可能是使用可以容忍丢失数据的方法。因此,也许您可以一次传输一条或多条图像的扫描线,并识别它是哪条线,然后将其放入由扫描线标识的位置的空白图像中。如果缺少一两行,您将得到一条黑线,您可以通过插值或修复来修复它。
那么问题就变成了大小。您的图像当前为 11kB。如果您发送 320x240 RGB 文件的原始像素,则为 230kB,即大 20 倍。您可以转换为 YCbCr,它像 JPEG 一样对色度进行二次采样,并且只占用一半的带宽,这样就可以达到 115kB。
您还应该调查是否可以传输二进制而不是 ASCII - 这将有很大帮助,因为 Base64 编码会使数据膨胀约 30%。
仍在思考...顺便说一句,您可能会从慢扫描电视、Raspberry Pi 高海拔气球和这里的阅读中获得一些想法。
推荐阅读
- c# - 接收和处理 dynamics 365 webhook
- java - 初始化类时使用 Spring 属性
- excel - 循环浏览 URL 列表(29 个 .xls 文件)以打开数据并将其粘贴到 1 张单张纸中
- java - 如何以二进制格式指定自动 Java 堆转储
- python - 使用 Bx 和 By 在 python 中剪切图像进行前向和后向映射
- c - C中的蛇 - 整数被改变而不被改变 - 有什么问题?
- spring-boot - Spring boot Oauth2:使用 Feign、Ribbon、Zull 和 Eureka 从客户端到资源的令牌中继
- classification - 数据挖掘方法
- reactjs - 有没有办法在抽屉导航中使用不同的参数重定向到相同的路线
- c - gcc9+ 模数优化背后的数学