OSPP - 二维码项目总结

OSPP 项目已经接近尾声,帖子介绍和总结这段时间的工作,感兴趣欢迎来仓库点赞~

概要

Demo

安装

其中 QRDecoders 正在注册,需用 github 链接的方式安装

using Pkg
# 安装 QRCoders
Pkg.add("QRCoders")
# 安装 QRDecoders
Pkg.add("https://github.com/RexWzh/QRDecoders.jl#rex-dev")

使用方法

编码器 QRCoders.jl

using QRCoders
exportqrcode("Hello world!")

qrcode

解码器 QRDecoders.jl

using QRCoders, QRDecoders
mat = qrcode("Hello world!")
info = qrdecode(mat)
print(
"message: $(info.message)
mode:$(info.mode)
error-correction lever:$(info.eclevel)
version:$(info.version)
mask:$(info.mask)")

image

此外,当前解码器支持标准的二维码的识别,比如

exportqrcode("Hello world!", "test.jpg")
qrdecode("test.jpg")

项目前

接触社区

去年十二月我参加了 Julia 中文社区的线上会议,看到许多有趣的项目,产生了参与开发的想法。寒假用 LeetCode.jl 刷题,学习 Julia 风格和使用技巧,也看到许多 Julia 特有的让人眼前一亮的解法(比如prob.917)。期间第一次提交 PR,内容冗长不规范,但仍得到社区开发者的肯定,也感受到社区的热情和对新人的友好。

项目选择

个人最感兴趣的是 OSCAR 相关的 Julia 包,比如 JuLie, CoxeterGroup, Hecke 等。但准备申请时,发现 JSOC 没有相关项目。最后找到了 二维码项目,涉及编码理论和图像处理,个人对二者都很感兴趣便写了申请贴

准备期

通过二维码教程学习二维码的编码原理和构建过程,并整理成笔记

项目初期,我对 项目导师<->学生 协作关系的定位不当,总不自觉地当成 大佬<->菜鸟老师<->学生 的关系。但论坛《开源培训计划》也提到,建议将导师当成伙伴,朋友。不是单纯地寻求指导,而是相互交流想法意见。 前期我问了很多无关紧要的问题,占用了不少时间,但学长都耐心做了解答,也建议用 issue/PR 的模式交流问题。交流中也学到一个金句:节约别人的时间就是节约自己的时间。

项目启动

五六月忙着毕业事宜,七月因为特殊事情耽搁了很长时间,月底才开始正式 coding。这段时间学长询问了进展,也没给太多压力,毕竟项目最终是靠自己。八月快马加鞭地推进项目,在提交 PR 时,学长陆续给了很多性能和规划方面的建议,避免踩坑和走错方向。

主要成果

项目分两部分,编码器 QRCoders.jl 和解码器QRDecoders.jl

QRCoders

编码器基于教程 qrcode-tutorial 以及二维码标准 ISO/IEC 18004:2000,在 QRCode.jl 的基础上进行改写和补充,后者已写好了生成二维码的函数,但也存在不少问题,比如:

  • 用于非 ASCII 码的字节模式存在错误,对 UTF8 的支持也存在问题,比如用字符串 αβ 的生成二维码
    qrcode
  • 不支持汉字模式(Kanji mode)
  • 细节错误,比如掩码应放在格式串之后
  • 计算性能的优化空间很大,包括算法层面和内存分配等

QRCoders 主要工作:

  • 改写 QRCode 的大部分函数,并在@johnnychen94 的建议下,进一步提升性能
  • 增加 Kanji 模式,修正 UTF8 模式
  • 增加可选参数:mode, eclevel, version, mask

QRDecoders

二维码解码器参考了网上教程 《qrcode-tutorial》,经典教材《Algebraic codes for data transmission》以及 ReedSolomon 纠错 相关的 wiki 百科,文献等。

QRDecoders 主要内容:

  • 实现二维码纠错的 Berlekamp-Massey 算法。暂不支持指定“缺失值”,相关讨论参看 stackoverflow
  • 实现基于 扩展欧几里得算法 的二维码纠错算法,支持指定“缺失值”,参考 wiki 百科和文献
  • 二维码解析和解码函数:qrdecompose, qrdecode
  • 标准二维码图像文件的识别提取 getqrmatrix

展望TODO

项目比预期花了更多时间,特别对 QRCode 的改写,原计划只是增加 Kanji 模式,但使用过程发现了原仓库的许多问题。

以下是关于编解码器的后续计划,加 (*) 为先考虑功能。

编码器:

  • (*) style.jl:支持更多样式的二维码生成,比如 issue 提到的图标,样式设计的发挥空间很大
  • (*)与其他工具交互,比如 zbar 解码器,OpenCV 的编解码器等,交叉检验编码正确性,以及比较性能
  • 丰富仓库的使用文档
  • 增加 ECI 模式(指定字符集)的支持,用以增大二维码对复杂数据的存储量

解码器:

  • (*)解析图片:项目初期草拟过解决方案,待进一步交流
  • (*)丰富文档,添加与其他工具的性能对比
  • 支持“缺失值”。目前仅在纠错算法层面支持,图像层面可以考虑,比如识别被遮挡位置后,设置为“缺失”比随机“猜”更能提高纠错能力

杂谈收获

项目收获颇多,最直接的包括:

  • 学到更多感兴趣的编码知识
  • 锻炼 coding 能力,积累代码经验和协作经验
  • 学会开发 Julia 包,从测试部署到注册发布
  • 学习 GitHub 的交流方式:英文交流,issue/PR/Action 等的用法,git 分支协作
  • 开源交流的礼仪:讨论重心放问题上,保持谦逊,不吝赞美,不忘感谢

最后,庆幸参与了@johnnychen94 去年的 Julia 短课程,这是少数让我期待不已的课程。在此之前,我安装过 Julia,但仅仅止步在此。非常感谢社区和学长提供的参与机会,也希望 Julia 未来的发展越来越好~


相关链接

QRCoders.jl:GitHub - JuliaImages/QRCoders.jl: Creating QR Codes within Julia

QRDecoders.jl:GitHub - JuliaImages/QRDecoders.jl: OSPP'22 project repository for QR format decoder support

Julia 中文社区冬季会议:Julia中文社区 2021 冬季会议_哔哩哔哩_bilibili

LeetCode.jl:GitHub - JuliaCN/LeetCode.jl: A community driven project to provide solutions for LeetCode problems in the Julia programming language.

OSCAR:OSCAR Computer Algebra System · GitHub

JSOC:Projects

二维码项目:JuliaImages Projects – Summer of Code

开源培训计划:开源培训计划 (GSoC/JSoC/OSPP)

Julia 短课程:GitHub - johnnychen94/Julia_and_its_applications: 2021 年《Julia 语言及其应用》系列讲座的材料

10 个赞

优秀~

可以转到公众号上发一篇不?

1 个赞

好呀,非常荣幸 :face_with_peeking_eye: