Python OpenCV卡号识别如何识别

本篇内容主要讲解“Python OpenCV卡号识别如何识别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python OpenCV卡号识别如何识别”吧!

学在前面

从本篇博客起,我们将实际完成几个小案例,第一个就是银行卡号识别,预计本案例将写 5 篇左右的博客才可以完成,一起加油吧。

本文的目标是最终获取一套招商银行卡,0~9 数字的图,对于下图的数字,我们需要提取出来,便于后续模板匹配使用。不过下图中找到的数字不完整,需要找到尽量多的卡片,然后补齐这些数字。

Python OpenCV卡号识别如何识别

提取卡片相关数字

先对上文中卡片中的数字进行相关提取操作,加载图片的灰度图,获取目标区域。在画板中模拟一下坐标区域,为了便于进行后续的操作。

Python OpenCV卡号识别如何识别

具体代码如下:

importcv2ascv
importnumpyasnp
#读取灰度图
src=cv.imread("./ka1.jpg",0)

#寻找卡号目标区域
roi=src[142:168,42:360]
#cv.imshow("roi",roi)

获取到的图片如下,发现右侧边缘缺少一部分内容,对目标区域坐标进行微调。

Python OpenCV卡号识别如何识别

修改之后的代码如下,你如果使用的图片与橡皮擦不一致,注意进行修改。

#寻找卡号目标区域
roi=src[142:168,46:364]
cv.imshow("roi",roi)

Python OpenCV卡号识别如何识别

消除噪音,可以增加模糊卷积操作,分别测试均值模糊,中值模糊,高斯模糊效果。

#模糊卷积操作
blur_roi=cv.blur(roi,(5,5))
cv.imshow("blur_roi",blur_roi)

med_roi=cv.medianBlur(roi,5)
cv.imshow("med_roi",med_roi)

gau_roi=cv.GaussianBlur(roi,(7,7),0)
cv.imshow("gau_roi",gau_roi)

测试不同的卷积核效果,选择一个合适的即可,我这里发现卷积核为 (7,7) 的时候,高斯模糊效果不错,可以去噪。

Python OpenCV卡号识别如何识别

接下来进行二值化操作。

#对目标区域进行二值化操作
ret,thresh=cv.threshold(
gau_roi,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
cv.imshow("thresh",thresh)

Python OpenCV卡号识别如何识别

二值化处理完毕之后,发现还存在一些白色区域的点,需要去除掉,这里使用了形态学里面的腐蚀操作。

#腐蚀
kernel=np.ones((3,4),np.uint8)
dst=cv.erode(thresh,kernel=kernel)

Python OpenCV卡号识别如何识别

腐蚀之后在进行膨胀,让原有的数字区域变的明显,最后的图片是进行之后的效果,关于卷积核你可以自行调整。

#腐蚀
kernel=np.ones((3,4),np.uint8)
erode_dst=cv.erode(thresh,kernel=kernel)
cv.imshow("erode_dst",erode_dst)
#膨胀
kernel=np.ones((4,4),np.uint8)
dilate_dst=cv.dilate(erode_dst,kernel=kernel)

Python OpenCV卡号识别如何识别

下面进行外轮廓检测,检测之后发现恰好有 16 个轮廓,也就对应了 16 个数字区域。

#检测外轮廓
#只检测外轮廓
contours,hierarchy=cv.findContours(dilate_dst,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)

print(len(contours))

Python OpenCV卡号识别如何识别

对轮廓面积进行一下输出,为了防止出现非目标区域,可以进行一下基本的判断,当罗阔面积大于 80 的时候才进行展示。

target_list=[]
#轮廓判断
forcntincontours:

#轮廓面积
area=cv.contourArea(cnt)
print(area)
ifarea>79:
target_list.append(cnt)

print(len(target_list))

Python OpenCV卡号识别如何识别

有这些参数之后,就可以对灰度图进行裁切了,基于外接矩形获取目标区域,我直接做了循环展示。

forindex,cntinenumerate(target_list):
#外接矩形
x,y,w,h=cv.boundingRect(cnt)
#在二值化的图像上进行目标区域获取
c_roi=roi[y:y+h,x:x+w]
#调整图像大小
#big_roi=cv.resize(c_roi,dsize=(0,0),fx=2,fy=2)
#big_roi=cv.resize(c_roi,dsize=(0,0))
cv.imshow("big_roi"+str(index),c_roi)
#cv.imwrite(f"./numbers/ka_{index}.png",big_roi)

Python OpenCV卡号识别如何识别

接下来放大图片对其进行保存即可,得到如下图片列表,至此,已经获取到 1、4、6、8 几个数字,下面在切换到另一张卡片,去获取其他数字即可,注意图片大小保持一致。

big_roi=cv.resize(c_roi,dsize=(42,66))
#cv.imshow("c_roi"+str(index),c_roi)
cv.imwrite(f"./numbers/ka1_{index}.png",big_roi)

Python OpenCV卡号识别如何识别

新的图像注意调整目标区域,获取素材,已经获取到 1、2、4、5、6、7、8 几个数字

Python OpenCV卡号识别如何识别

反复迭代这个办法,知道 0~9 个数字获取完整,找到所有数字之后,对该文件夹中的所有文件进行二值化操作。

importcv2ascv
importos

defwalk_file(file):
forroot,dirs,filesinos.walk(file):
forfinfiles:
file=os.path.join(root,f)
#读取灰度图
basename=os.path.basename(file)
filename=basename.split(".")[0]
src=cv.imread(file,0)
ret,thresh=cv.threshold(src,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
#cv.imshow("thresh",thresh)
cv.imwrite(f"./numbers/001_{filename}_bit.png",thresh)
cv.waitKey()
cv.destroyAllWindows()

if__name__=="__main__":
walk_file("./numbers")

二值化之后,挑选出比较清晰的数字即可,如果发现存在不清楚的,可以在寻找资源进行提取,银行里面 8 真的是太多了。

Python OpenCV卡号识别如何识别

橡皮擦最后调整之后,得到的结果如下所示,信用卡卡号识别的第一步算是准备好了。

Python OpenCV卡号识别如何识别

到此,相信大家对“Python OpenCV卡号识别如何识别”有了更深的了解,不妨来实际操作一番吧!这里是恰卡编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

发布于 2021-03-13 15:41:45
收藏
分享
海报
0 条评论
171
上一篇:NET Core中的Worker Service是什么/怎么用 下一篇:R语言最简单的向量赋值怎么使用
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码