stuff(winkyy~

I have but one purpose in this life, seeking the nature of the world.

0%

[划][opencv简单应用]

简介

接到了奇奇怪怪的需求,要做一个类似于微信小程序码的圆形码。这里算是早期调研,没有完整地写完,记录一下坑点。

背景

首先查了一下普通二维码的实现原理。实际上扫描二维码很明显斜一点也是能扫出来的,摄像头捕捉到的图形本身就可以不是一个标准的正方形。先通过边缘检测,确定三个位置标识点,再根据三点共面,做矩阵变换,这样就得到了一个标准正方形,信息点就可以按一定规律解码。

当然中间还有很多边界情况和细节需要处理,包括边缘检测的算法、矩阵变换原理及实现、冗余容错等等,这里就不细讲了。这轮子已经有很多了,再撸一个就没什么意思。

技术

这边技术选型是优先考虑前端实现的,考虑到可能需要跨平台,但是实际上全局引入opencv的js包的话,负担比较大,自己重新写吧可能没那条件,这坑我就拜托给小伙伴了。我比较菜(得意个什么劲儿?),就老老实实后端先实现了再说。

后端的话可以用C或者python实现,C稍微试了一下,发现我自己不太行(连个中央库都没有吗!),就选用了python。本质上所有语言的包都是通过官方编译工具生成的,但是你懂的,官方编译指南已经永远地停留在了某个版本。所以我只能老老实实借用一下某个好心大哥哥的pip包版的opencv了。

磨完了刀,就要捋一捋该做的事情了。老板给的码原型图大概是这样子的:三个同心圆,最小的是实心圆,用于定位,次小的透明,不能遮挡背景,最大的存储信息。我隐约觉得有点不靠谱,透明圆的背景干扰悲观一点……就是无限大啊……但是没办法,老板说这是特色,遮挡率低一些,不会像普通二维码一样硬要糊住一大片,行吧,做做看呗。

整体思路上和普通二维码一样,找定位点,矩阵变换,解析。

实现

第一步,找定位点。这步就比正方形的难了,正方形通过边缘检测可以直接识别四个顶点,再根据定位点特征匹配。圆就算识别出来了,也只能确定一个圆心。老板设想可以通过定位圆上开一个豁口来确定方向,但是并没有那样的豁口识别方法啦!我设想的是直接通过模板匹配,给定一个标准摆正的目标图,比对源图和目标图本身的特征点,直接得出变换后的图形,这样可以直接跳到第三步。

第二步的矩阵变换倒是比较简单的一步。提取出4个特征点的图内坐标,和特征点的实际坐标联立解一个矩阵方程就好了,将变换矩阵再代入源图,对每一个点做映射,就得到纠偏后的图像了。

第三步就没开始了。主要第一步的实现效果比较差,豁口方法没有直接能用的API,无疑需要自己写很多东西;模板匹配的话,分辨率和图形复杂度都是很重的影响因素,过于简单的图形甚至摄像头本身的误差就能造成误判。感觉真要做出来可能会要个小半年,花时间在知识积累上。

demo及部分参考资料

demo: https://github.com/test3207/spot2

参考资料:

1.https://docs.opencv.org/

2.https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_setup/py_intro/py_intro.html

3.https://www.numpy.org.cn/user/

4.https://blog.csdn.net/qq_33635860/article/details/78046838

5.https://blog.csdn.net/fengyeer20120/article/details/87798638