摸鱼写了一个文本混淆器,现代 OCR 都发展的这么快了吗

2021-05-12 14:05:52 +08:00
 tukon479

昨天突然想起某天看到微信读书(记忆不清了)为了防止用户复制,采用了一种方式,把每个字都绝对定位,从而达到视觉上通顺,实际上是乱序的。大概如下图所示。

然后我尝试用 OCR 软件去识别,标准字体的话准确率很高不稀奇。我又换了一个手写体去试。macOS 自带的手札体。

意外发现不规则字体识别率也很高。

对了,地址在这: https://innei.github.io/shuffle-article/

1827 次点击
所在节点    前端开发
13 条回复
Maboroshii
2021-05-12 14:08:28 +08:00
有意思
imdong
2021-05-12 14:10:43 +08:00
之前做过一个小说网站的识别,也是类似的方式,我的做法是:

从 html 中取出每个字的位置,然后按行列排序,最后重新整理顺序就可以还原了.

而且从你截图来看的话,比那个网站还少了基础 css 样式偏移,那个是每个字都有一个 class 和 style 的,两个变量的漂移相加的.
Maboroshii
2021-05-12 14:11:11 +08:00
不过试了下浏览器缩放,混淆后的内容的位置就跑了
tukon479
2021-05-12 14:16:23 +08:00
@Maboroshii 对,因为绝对定位,所以 resize 要加监听器,重新计算
tukon479
2021-05-12 14:17:19 +08:00
@imdong 有代码可以学习学习吗
est
2021-05-12 14:20:40 +08:00
2012 年,cv 届发生了一件大事,人类的命运就从此发生了巨大改变。以至于到了 9 年后的今天,LZ 才发帖感叹技术进步如此之快
imdong
2021-05-12 14:33:31 +08:00
(content => {
let span_list = content.querySelectorAll('span'),
map = [], full_text = "";
span_list.forEach(span => {
let left = parseInt(span.style.left),
top = parseInt(span.style.top);
map[top] = map[top] || [];
map[top][left] = span.innerText;
});

map.forEach(line => {
line.forEach(text => {
full_text += text
});
})

console.log(full_text)
})(document.getElementById('renderTargetContent'))
goodryb
2021-05-12 16:27:51 +08:00
居然还有这种操作,第一次听说
murmur
2021-05-12 16:46:35 +08:00
如果考虑到做字体替换和位置改动的,应该也有其他反扒策略把
tukon479
2021-05-12 19:47:59 +08:00
@est 对于手写体的识别有点惊到。
tukon479
2021-05-12 19:49:56 +08:00
@imdong 加上基础 css 样式偏移的话可以用 `getBoundingClientRect` 获取位置,在计算得出。
q197
2021-05-20 15:40:00 +08:00
用的什么 ocr 软件?

完全不允许复制感觉有些过头,毕竟读书还要摘抄(滑稽),而且这样无障碍功能估计就彻底不能用了。

@est 能具体说说吗
tukon479
2021-05-22 13:00:09 +08:00
@q197 mac 上的 TextSniper https://textsniper.app/

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/776475

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX