# stampCode
> 触摸印章技术方案(多点位置匹配)
## [Demo](https://browniu.github.io/stampCode/)
![demo](https://browniu-wx-1257187612.cos.ap-shanghai.myqcloud.com/GitHub/stampCode2.gif)
## 简述
### 需求分析
许多开发者大会/漫展/游戏展,都会有集印章的线下推广活动。就是在入口处给你发张DM单,上面会有一些空格位置,需要你到指定的展摊集印。到摊位前完
成一些简单任务(加个微信或关注个公众号什么的)就会有小姐姐给你拿钢印盖个章或者签个名,集满或达到一定数量就可以兑换礼品。
![展会](./static/zh.jpg)
### 传统印章方案
在我看来这种传统的印章签到方式本身存在很多问题。
* 制作成本高。首先需要印刷纸质的DM传单来接受盖印,又要给每个摊位制作专用章,还要有一个工作人员值班负责这件事(无法离开摊位)
* 效率很低,盖印要很用力的压在一个平整的桌面上,盖印盖多了要沾印泥,这一系列动作耗时耗力,在火爆的情况下,很容易大排长龙,造成用户流失
* 用户体验不佳。作为吃瓜群众的我要随身携带这张纸。还要不停掏出来折回去,保存麻烦还很容易弄丢。而且刚盖完上面没干的墨水还会弄脏我新买的衣服
![传统盖章](./static/gz.jpg)
### H5交互印章
身为一个前端工程师,我就想能否通过移动端的传感器技术去优化这个流程。
这个需求点分析透彻就是一个 **线下签到** 问题。最简单得做法就是扫码吧。工作人员扫你的身份识别二维码就搞定了,简单轻松。既可以杜绝虚假签到,
用户需要做的事也不多。但似乎少了点什么?那就是仪式感。采集是人类的原始爱好,印章方式虽然麻烦但是很有仪式感,让我们想起了石器时代的采集的乐趣。
扫码是简单,简单到没什么参与感就结束了这个流程。
能不能更好玩一点?想象一下,我拿个印章在你的手机上盖了一下,就像在纸上那么做一样,H5上浮现出了一个动态的盖印,甚至跳出一个相关的游戏角色的彩
蛋,我觉得这种体验既包含收集的乐趣,又省去很多麻烦和成本,H5上也能承载更多的互动方式,让用户的参与度更高。所以这件事还是值得讨论的。
### 逻辑分析
这个H5盖印识别的技术让我想到了屏下指纹识别,但是又不需要那么高的精度。所以通过多点触控应该就能实现。
#### 模拟多点触控
H5印章实体大概就是有一些圆点凸起的方块,每个凸起的地方使用导电橡胶材料制作(类似电容笔),这样平整放置在屏幕上时就能在屏幕上形成多个触控点,模拟
手指多点触控的交互方式。
![印章实体](static/stamp.jpg)
#### 获取点位信息
通过BOM对象的`touch`事件就能够同时获取到屏幕上的多个触控点的坐标信息,拿到一个如 `[[x1,y1],[x2,y2],[x3,y3]]` 这样的二维数组,拿这个刚
采集到的数据更数据库保存的一个固定的同格式数据进行比对,得出他们的相似程度。
#### 忽略方向和尺寸
在给用户盖印的过程中(采集新的点位信息),会存在一些不确定性
* 因为需要通过手机屏幕采集触摸点,而不同型号的手机屏幕尺寸/分辨率都存在差异,同一个印章盖上去,每次拿到的坐标数都有可能不同
* 每次盖章时,章的方向和手机的方向可能会有所不同
#### 相似多边形
基于以上几点,我们计算相似性的算法就要忽略点位整体的方向和绝对尺寸。也就是证相似而不是全等。
![相似多边形](static/simi3.jpg)
> 如果两个边数相同的多边形的对应角相等,对应边成比例,这两个或多个多边形叫做相似多边形
我们采集到的点位虽然不一定能够形成凸多边形,但是可以参考证明相似多边形这个思路,对比边的比例。距离可以不固定,就是各点间距离(即多边形的边)的比例是固定的。
#### 边的比例
假设印章上只有三点位,通过`touch`事件采集到的三个触摸点形成一个三角形,通过计算两点间的距离获取到三角形的三边长D1、D2、D3。
```JavaScript
// 两点间距离
const distance = (x0, y0, x1, y1) => Math.hypot(x1 - x0, y1 - y0);
```
如果完全按照相似多边形定理去证明,除了要比较各个对应边的比例,还要计算出两条边之间的夹角,这太麻烦了。能不能换一个思路?先找到最小边,然后求出其他边与最小边
的比例,升序重排后的数据不就可以过滤掉方向和尺寸的特征了。
```JavaScript
// 假设D1最小 求其余边与最小边的比例
const R1 = D2/D1
const R2 = D3/D1
const resultFromTouch = [R1,R2].sort()
```
从手机屏幕拿到一个数组 `resultFromTouch=[R1,R2]`,同样的我们可以从用来验证的印章点位信息中也获取到相同结构的数据`resultFromStamp=[Ra,Rb]`。
理想情况下,在用户手机上采集点位时都刚好拿到的是触摸点中心点像素的坐标信息,那么`resultFromTouch`与`resultFromStamp`对应位置的值应该
能全等。然而实物印章的点位并不是一像素,而是一个面,并且这个面不能过小。所以要设置一个合理的容差。
#### 余弦相似性
那现在就变成了比较两个一维数组(向量)相似性的问题。我想要的最终结果一个是`0-100`的分数,`0`表示完全不同,`100`表示完全相同。这样可以通过分
数来设置容差,超过90分就判定通过验证。
> 余弦相似度是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似。
这里使用余弦相关性的计算公式拿到这个匹配分数
![余弦相似度公式](./static/yxxsd.png)
```JavaScript
async function compute(x, y) {
x = tf.tensor1d(x);
y = tf.tensor1d(y);
const p1 = tf.sqrt(x.mul(x).sum());
const p2 = tf.sqrt(y.mul(y).sum());
let p12 = x.mul(y).sum();
let score = p12.div(p1.mul(p2));
score = ((await score.data())[0] - 0.9) * 10;
return score
}
```
#### 差值相关性(自创)
除了直接使用余弦相似度,其实还可以尝试其他途径计算向量的相关性。比如我原创的一个算法 **差值相关性**。如果总分为100,这个数组的每一位对总分
的影响程度就是`总分/数组长度`,也就是`R1`与`Ra`之间的差异对总分的影响在`0-50`分之间。`abs.(R1-Ra)`与这个分数负相关。
```JavaScript
const gap = abs.(R1-Ra)
```
极限情况下,`gap=0`时,没有差异得50分,`gap=gamMax`时完全不同得0分,最后求和得出总分。
```JavaScript
const partScope = 50 * (1 - gap / gapMax);
```
那么问题来了`gapMax`即这个最大值怎么求?我不知道啊(🤦️)。不过据我手动观察这个值大部分情况90%情况下介于`0-10`之间,所以暂时假设`gapMax=10`。
得到的`scope`就是能用`0-100`的数值表示两个向量相似度的值。
整个思路大致如此,也许有更高明的算法去解决整个问题,或者是优化其中的一部分计算,欢迎讨论。
## 可复用逻辑
### 两点距离
```JavaScript
const distance = (x0, y0, x1, y1) => Math.hypot(x1 - x0, y1 - y0);
```
### 指定坐标范围的点
```JavaScript
const randomPosInRange = (min, max) => Array.from({length: 2}, () => Math.floor(Math.random() * (max - min + 1)) + min);
```
### 数组中的最小值
```JavaScript
const minInArray = (array) => array.sort((a, b) => a - b)[0];
```
### 四舍五入指定位
```JavaScript
const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`);
```
### 向量余弦相似
```JavaScript
async function compute(x, y) {
x = tf.
没有合适的资源?快使用搜索试试~ 我知道了~
数字印章技术方案(多点位置匹配).zip
共15个文件
jpg:5个
png:2个
js:2个
需积分: 3 0 下载量 145 浏览量
2024-01-15
10:13:15
上传
评论
收藏 848KB ZIP 举报
温馨提示
方案是为解决特定问题或达成特定目标而制定的一系列计划或步骤。它的作用是提供一种系统性的方法,以有效地应对挑战、优化流程或实现目标。以下是方案的主要作用: 问题解决: 方案的核心目标是解决问题。通过系统性的规划和执行,方案能够分析问题的根本原因,提供可行的解决方案,并引导实施过程,确保问题得到合理解决。 目标达成: 方案通常与明确的目标相关联,它提供了一种达成这些目标的计划。无论是企业战略、项目管理还是个人发展,方案的制定都有助于明确目标并提供达成目标的路径。 资源优化: 方案在设计时考虑了可用资源,以最大化其效用。通过明智的资源分配,方案可以在有限的资源条件下实现最大的效益,提高效率并减少浪费。 风险管理: 方案通常会对潜在的风险进行评估,并制定相应的风险管理策略。这有助于减轻潜在问题的影响,提高方案的可行性和可持续性。 决策支持: 方案提供了决策者所需的信息和数据,以便做出明智的决策。这种数据驱动的方法有助于减少不确定性,提高决策的准确性。 团队协作: 复杂的问题通常需要多个人的协同努力。方案提供了一个共同的框架,帮助团队成员理解各自的职责和任务,促进协作并确保整个团队朝着共同的目标努力。 监控与评估: 方案通常包括监控和评估的机制,以确保实施的有效性。通过定期的评估,可以及时调整方案,以适应变化的环境或新的挑战。 总体而言,方案的作用在于提供一种有序、有计划的方法,以解决问题、实现目标,并在实施过程中最大化资源利用和风险管理。
资源推荐
资源详情
资源评论
收起资源包目录
数字印章技术方案(多点位置匹配).zip (15个子文件)
SJT-code
yarn.lock 11KB
src
draw.js 4KB
index.html 2KB
index.js 2KB
package.json 318B
.gitignore 78B
static
stampCode2.gif 575KB
yxxsd.png 4KB
zh.jpg 70KB
show.png 288KB
touchStamp.jpg 25KB
simi3.jpg 10KB
gz.jpg 29KB
stamp.jpg 14KB
README.md 8KB
共 15 条
- 1
资源评论
JJJ69
- 粉丝: 6352
- 资源: 5918
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功