扫描全能王?原来图像技术可以这样子玩

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

不知道大家会不会有这种感觉,经常是觉得自己学的技术没有用,担心自己能不能胜任工作。因为我们通常学的都是基础的,老师教完之后做几道题目会做考试过了代表学过了。

因此我想找一些“好玩又有用的技术”,我们共同学习成长.

36aad0e5dbfa8aac08da4cdd9e1a4617.png

01 APP测评

首先推荐简单介绍一下这款实用的app,扫描全能王,当然还有其他类似功能的产品。下图是它的一个主要功能介绍:

71042d45fe7cf5eb7bae9c64e41893cd.png

今天要讲解的技术就是这款app的“手机扫描仪”的功能,具体是可以实现对证件,银行卡,资料等进行扫描,与普通相机最大不同是可以实现几何变形的自动矫正,同时还能够实现对文字内容增强(显示 效果更佳)。

02 分析原理

举个例子,对于公交卡进行扫描,由于拍摄人员的技术以及客观的一些原因导致拍摄出来的图片一般情况下存在这一定的几何畸变和其他一些背景的干扰。

如下图所示,拍摄一张公交卡,背景是一张存在条纹的纸张。而我们不希望有这么大的几何变形以及背景干扰,会影响下一步的处理(如OCR识别)。

d03ad885138f2b94b79ac297717ade5d.png

存在的问题:

(1)几何变形

(2)背景干扰

思路:

对于由于拍摄视角导致的变换,一般可采用 透视变换 进行矫正。

什么是透视变换?

透视变换是将图片投影到一个新的视平面,也称为投影映射。

a8bfd35435bd0c0025cba3b84155f5ab.png

透视投影的标准模型

这里不详细展开透视变换矩阵系数的求法,有兴趣的可以参考下面的链接有详细的推导过程。

我们需要明白一点,求解透视变换的矩阵需要四组对应点即可。

下图展示由发生畸变的四边形矫正成一个长方形的示意图

cd89a3b7ee97d4f1be7c9bb19ee62ed0.png

参考资料:

https://www.cnblogs.com/jsxyhelu/p/4219564.html

https://blog.csdn.net/wong_judy/article/details/6283019

此时,我们已经明白我们需要完成的任务是什么——找四组对应点

怎么找?

从上面的一些分析的图,我们可以大概猜到,是否可以通过变换前后的四个角点构造四组对应点?

好,对于拍摄图求角点的方法如何求?

我们知道,上图的四个标号序号角点都是相邻两条线段之间相交的点。因此可以通过

(1)霍夫检测(直线)+求解直接角点 来查找拍摄图的四个角点,

(2)寻找四边形的轮廓的四个顶点 来确定拍摄图的四个角点。

(3)当然还有其他办法,眼神好的小伙伴可以手动输入四个顶点的坐标

这里,我们已经完成了寻找拍摄图的四个定点。

那么对应的点如何获取?

对于你需要扫描的文件,一般都会事先选型或者说选参数,实际上就是在设置对应点的坐标(变换后的四边形尺寸)。

例如,此时我们想要扫描公交卡,由百度可知,公交卡的尺寸比例是16:9,因此我们只要按照比例进行设置坐标点,公交卡矫正后的形状就能基本满足我们的要求。

这里,我们基本上已经知道如何矫正 几何变换 了。

还剩下的问题是 背景干扰 ?

但是由于我们使用透视变换时,所用的点是四边形的四个角点,这个时候已经将背景剔除在外了,所以背景的干扰自然而然就无需考虑了。

03 代码实现

思路:

1、读入图片并进行预处理

2、寻找拍摄图的四个角点

3、根据预设的尺寸,设置对应的四个角点,并计算透视变换的矩阵参数

4、对拍摄图进行透视变换

为了让大家阅读起来更舒服,就不讲一些非常基础的东西,讲解里面的关键步骤即可

环境:python3.6,opencv 3.4.2

关键步骤一:找四个角点

# 寻找拍摄图的四个角点
# 1、找到处理后图片(边缘处理)的轮廓
cnts = cv2.findContours(Image, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
# 2、寻找轮廓四个顶点
if len(cnts) > 0:
        cnts =sorted(cnts,key=cv2.contourArea,reverse=True)
        for c in cnts:
            peri = cv2.arcLength(c,True)                   # 轮廓按大小降序排序
            approx = cv2.approxPolyDP(c,0.02 * peri,True)  # 获取近似的轮廓
            if len(approx) ==4:                            # 近似轮廓有四个顶点
                docCnt = approx
                break

关键步骤二:根据预设尺寸计算透视变换矩阵

公交卡的比例是16:9,这里假设长高(320,180)

注意:由于并不是正方形,所以这里要先确定长和高的对应

假设,拍摄导致变形不会大到使长和高的尺寸发生变化

顶点的顺序是 左上、左下、右下、右上

分布计算并比较 左上到左下的距离 左上到右上的距离 确定长高

if calculate_distance(p[0],p[1])<calculate_distance(p[0],p[3]):
        pts2 = np.float32([[0,0],[0,180],[320,180],[320,0]])
        M = cv2.getPerspectiveTransform(pts1,pts2)
        dst = cv2.warpPerspective(image,M,(320,180))
    else:
        pts2 = np.float32([[0,0],[0,320],[180,320],[180,0]])
        M = cv2.getPerspectiveTransform(pts1,pts2)
        dst = cv2.warpPerspective(image,M,(180,320))

此时即可完成我们的任务。

看一下最终的效果吧

5d07f0aa70f132a2ad69090b45593734.png

完整代码链接请看https://github.com/DWCTOD/AI_study/tree/master/%E5%90%88%E6%A0%BC%E7%9A%84CV%E5%B7%A5%E7%A8%8B%E5%B8%88/%E5%AE%9E%E6%88%98%E7%AF%87/opencv/%EF%BC%88%E4%B8%80%EF%BC%89%E5%9B%BE%E5%83%8F%E6%89%AB%E6%8F%8F%E5%8A%9F%E8%83%BD%E2%80%94%E2%80%94%E5%87%A0%E4%BD%95%E7%9F%AB%E6%AD%A3

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

328d65858a4f0d6de54aa1112d4ef436.png

275abe1700f43ab96431a4c39a40a72a.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值