前言
前面我们学习了《【干货】C++ OpenCV案例实战---卡片截取(附代码)》,根据照出来的照片直接截取到卡片后,在卡片识别里面下一步我们肯定就会用到了卡号的获取
实现思路
从上一篇里面我们已经获取到卡号,如下图右边红框内的
当我们已经定位好卡片后,下一步我们就要获取卡号然后再进行识别了,理论上来说,我们通过上一步截取到卡片后,根据卡号在右下角开始偏移多少来获取卡号即可,如下图
通过右下角我们设置多少的偏移值后,然后找到起点设定一个固定的矩形大小,截取这一块即可实现卡号的截取,但是这会有个问题,如果我们第一步截取的有问题,因为背景的原因,造成下面截取的高度增加了,按这个固定的比例来获取就会有偏差,所以我考虑了另一种方案。
思路呢还是通过轮廓查找,我们可以看到,当卡号截取出来后,卡片内部的结构都是固定不变的,所以我们通过内部定位再偏移找卡号要比从右下角精确的多,如下图
通过获取到红色的特征这里,去偏移定位找绿色的框。
代码实现
我们接上次《【干货】C++ OpenCV案例实战---卡片截取(附代码)》的代码,在这个基础上我们进行处理。
用Canny边缘提取,转灰度图--高斯模糊--形态学闭操作--Canny边缘提取
显示效果
红框为处理后的结果
寻找轮廓,画出图中所有的轮廓来,我们看看
然后运行一下看看效果
可以看到右图里面画出了所有的找到的轮廓,我们怎么定位用蓝色线的那个区域了,通过分析了一下,我们可以看到有几个特点:
修改查找区域的设置,条件为矩形长度在图片长度的一半,旋转度小于3
然后我们再重新运行一下看看
可以看出,我们直接就定位到了要找的区域。
根据固定区域进行偏移截取
我们根据最小矩形的中心点,进行了向后偏移50,向下偏移了20,做为矩形的左上角点,然后画了个长度为130,高度为20的矩形(这个偏移量需要多次测试后找到最佳的位置,当然找到后就不需要再更改了)
下面的我们运行的效果
可以看到,红框里我们把卡号直接全部截取出来了,这个截取完后就可以进行OCR等识别了,关于识别这块,后面等学会了后再来更新。
-END-