百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

摄像头传输文件的工具

myzbx 2025-03-10 18:42 36 浏览

最近又让我发现一个用摄像头就可以传输文件的项目 —— Cimbar,先上效果。




项目地址:
https://github.com/sz3/libcimbar

操作方法



打开 https://cimbar.org/ 选择需要传输的文件,这个网页端就是一个html文件,无网络环境下只要想办法下载下来这个网页就能用,但是浏览器似乎只能操作10M的文件,所以太大的也不行。



然后用它官方的解码程序
https://github.com/sz3/cfc/releases 对准生成的二维码,等进度条走完就行了。

传输速度据说有106KB/s,还是很快的。

原理是啥?

图像哈希


Cimbar 的核心基于图像哈希技术。图像哈希是一种将图片内容转换为固定长度哈希值的方法。在 Cimbar 中,图像哈希通过简单的阈值算法实现:如果像素被设置为黑色,则为 1,否则为 0。这种 8x8 的网格最终被编码为 64 位的数字,从左至右、从上至下读取。尽管这种方法并不复杂,但是很简单。

下图展示了一组用于编码的符号,它们分别代表了 4 位数据:



每个符号在哈希空间内与其他符号相隔至少 20 位,这确保了即使图像模糊或受到其他干扰时,也能清晰区分各个符号。



怎么编码?

Cimbar 的编码过程就像是把数据一块一块地放进一个大拼图里。每一个方块代表几个“比特”(也就是二进制位,计算机用来存储数据的最小单位)。每个方块不仅有图案,还有颜色,这样一来,我们就可以用不同的颜色来增加编码的容量。

简化版的编码过程大致是这样:

for 每一组数据 in 文件:

找到下一个位置

把对应的方块放上去

Cimbar 可以把大约 9300 字节的数据编码成一张 1024x1024 像素的图片。

错误校正与交织处理

在传输数据的过程中,可能会出现一些问题,比如图像变模糊或者损坏。为了防止这些问题影响数据的完整性,Cimbar 使用了纠错码(如 Reed-Solomon)。这就像是给每一块拼图加了一层“备份”,即使一部分数据丢失,Cimbar 也能通过这些备份来恢复信息。

举个例子,如果我们有 125 字节的数据,Cimbar 会再加上 30 字节的纠错数据。这样即使部分信息丢失了,我们还是有 30 字节的“保险”来恢复它。

此外,由于图像错误往往集中在相邻区域(如图像的一部分被手指遮挡),Cimbar 还采用了数据交织技术,将错误校正块分布在图像的不同区域,以减少局部错误对整体解码的影响。

Fountain 编码(喷泉码)

喷泉码是整个过程中的关键之一。对于大于 7500 字节的文件,Cimbar 实现了 Fountain 编码,这是一种高效的分段数据传输方式。即使有部分数据帧丢失,Cimbar 仍然可以通过接收到的 N+1 个数据帧重构出原始文件。

它的设计灵感来源于喷泉水流的形象:你可以从喷泉中随意接水,不需要每一滴水都接到,只要接到足够的水,就能填满你的杯子。

在数据传输中,喷泉码的基本工作原理是将原始数据分成若干小块,随后通过编码生成无数个编码块(称为“水滴”)。接收方不必接收到所有这些“水滴”,只要收到足够多的编码块,就能还原出原始数据。

Fountain 编码的优点在于:

解码器可以从多个帧中任意顺序接收数据

只要接收到足够的帧,就能成功解码文件



喷泉码的实现过程虽然看起来复杂,但核心原理其实很简洁。这里简要介绍其工作步骤:

1. 数据分块

首先,发送方将原始数据分成多个等大小的数据块,每个数据块称为一个 "原始块"。

2. 编码生成

通过一种叫 异或运算(XOR)的方式,发送方可以生成无限多个 编码块。每个编码块是从若干原始块组合而成,即通过将随机选择的原始块进行异或操作,得到一个新的编码块。每个编码块可以看作是多个原始块的混合。

3. 传输

发送方不断生成并发送这些编码块。接收方无需接收所有编码块,只需要收到一定数量的编码块(通常比原始块数量多一些),就可以开始解码。

4. 解码

接收方通过收集足够多的编码块,逐步使用 异或逆运算 恢复出原始数据块。每个收到的编码块实际上是某些原始块的组合,所以当接收方收到足够的编码块后,它可以反推出所有的原始块。

5. 停止条件

当接收方解码出所有原始数据块后,传输可以停止。因此,喷泉码不需要发送方确定地发送特定的编码块,接收方也不需要按顺序接收,只要编码块的数量足够,就能恢复数据。

解码过程

Cimbar 的解码器首先需要在图像中定位编码的瓷砖网格,随后通过 2D 图像转换进行精确提取。解码器的任务比编码器更为复杂,它不仅要处理失真、模糊等问题,还要通过图像哈希计算,尽量减少误码。

该流程通过图像哈希的距离指标确定解码的优先级,从最有信心的块开始解码,逐步完成整个图像的解码。 作者:高玩梁
https://www.bilibili.com/read/cv38452107/ 出处:bilibili

相关推荐

如何设计一个优秀的电子商务产品详情页

加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品电子商务网站的产品详情页面无疑是设计师和开发人员关注的最重要的网页之一。产品详情页面是客户作出“加入购物车”决定的页面...

怎么在JS中使用Ajax进行异步请求?

大家好,今天我来分享一项JavaScript的实战技巧,即如何在JS中使用Ajax进行异步请求,让你的网页速度瞬间提升。Ajax是一种在不刷新整个网页的情况下与服务器进行数据交互的技术,可以实现异步加...

中小企业如何组建,管理团队_中小企业应当如何开展组织结构设计变革

前言写了太多关于产品的东西觉得应该换换口味.从码农到架构师,从前端到平面再到UI、UE,最后走向了产品这条不归路,其实以前一直再给你们讲.产品经理跟项目经理区别没有特别大,两个岗位之间有很...

前端监控 SDK 开发分享_前端监控系统 开源

一、前言随着前端的发展和被重视,慢慢的行业内对于前端监控系统的重视程度也在增加。这里不对为什么需要监控再做解释。那我们先直接说说需求。对于中小型公司来说,可以直接使用三方的监控,比如自己搭建一套免费的...

Ajax 会被 fetch 取代吗?Axios 怎么办?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!今天给大家带来的主题是ajax、fetch...

前端面试题《AJAX》_前端面试ajax考点汇总

1.什么是ajax?ajax作用是什么?AJAX=异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实...

Ajax 详细介绍_ajax

1、ajax是什么?asynchronousjavascriptandxml:异步的javascript和xml。ajax是用来改善用户体验的一种技术,其本质是利用浏览器内置的一个特殊的...

6款可替代dreamweaver的工具_替代powerdesigner的工具

dreamweaver对一个web前端工作者来说,再熟悉不过了,像我07年接触web前端开发就是用的dreamweaver,一直用到现在,身边的朋友有跟我推荐过各种更好用的可替代dreamweaver...

我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊

接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...

福斯《死侍》发布新剧照 "小贱贱"韦德被改造前造型曝光

时光网讯福斯出品的科幻片《死侍》今天发布新剧照,其中一张是较为罕见的死侍在被改造之前的剧照,其余两张剧照都是死侍在执行任务中的状态。据外媒推测,片方此时发布剧照,预计是为了给不久之后影片发布首款正式预...

2021年超详细的java学习路线总结—纯干货分享

本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础重点知识点:数据类型、核心语法、面向对象...

不用海淘,真黑五来到你身边:亚马逊15件热卖爆款推荐!

Fujifilm富士instaxMini8小黄人拍立得相机(黄色/蓝色)扫二维码进入购物页面黑五是入手一个轻巧可爱的拍立得相机的好时机,此款是mini8的小黄人特别版,除了颜色涂装成小黄人...

2025 年 Python 爬虫四大前沿技术:从异步到 AI

作为互联网大厂的后端Python爬虫开发,你是否也曾遇到过这些痛点:面对海量目标URL,单线程爬虫爬取一周还没完成任务;动态渲染的SPA页面,requests库返回的全是空白代码;好不容易...

最贱超级英雄《死侍》来了!_死侍超燃

死侍Deadpool(2016)导演:蒂姆·米勒编剧:略特·里斯/保罗·沃尼克主演:瑞恩·雷诺兹/莫蕾娜·巴卡林/吉娜·卡拉诺/艾德·斯克林/T·J·米勒类型:动作/...

停止javascript的ajax请求,取消axios请求,取消reactfetch请求

一、Ajax原生里可以通过XMLHttpRequest对象上的abort方法来中断ajax。注意abort方法不能阻止向服务器发送请求,只能停止当前ajax请求。停止javascript的ajax请求...