Opencv实战案例——模板匹配实现银行卡号识别(附详细介绍及完整代码下载地址)(一)

简介: Opencv实战案例——模板匹配实现银行卡号识别(附详细介绍及完整代码下载地址)

1.项目意义

在日常生活中,常常需要输入自己的银行卡号。银行为保证卡号的唯一性和账号的安全性,会将卡号设计偏长,对于视力不好的人群以及老人不是很友好。传统银行卡服务时的人工识别银行卡号码太过费时费力。所以银行卡号的自动识别变得越来越重要。银行卡卡号的自动识别对实现银行卡的有效管理和进行银行卡的相关服务具有重要的理论意义和实际应用价值。本项目设计了一个银行卡卡号自动识别程序,传入银行卡照片即可获取银行卡号,为生活提供了遍历。。程序效果如下:

2.模板匹配

本项目中主要使用的方法为模板匹配,在opencv中也提供了API,为cv2.matchTemplate函数,现在我们一起来看一下这个函数的用法。

cv2.matchTemplate(img,img_Temp,method)

  • img:传入的需要匹配的图片
  • img_Temp:匹配的模板
  • method:模板匹配的算法,主要有:
  • 平方差匹配(cv.TM_SQDIFF):利用模板与图像之间的平方差进行匹配,最好的匹配是0,匹配越差,匹配的值越大。
  • 相关匹配(cv.TM_CCORR):利用模板与图像间的乘法进行匹配,数值越大表示匹配程度较高,越小表示匹配效果差。
  • 利用相关系数匹配(cv.TM_CCOEFF):利用模板与图像间的相关系数匹配,1表示完美的匹配,-1表示最差的匹配。
  • cv.TM_SQDIFF_NORMED
  • cv.TM_CCORR_NORMED
  • cv.TM_CCOEFF_NORMED

在这里详细介绍一下我这个项目所使用的cv.TM_SQDIFF算法,这也是在模板匹配中最常用的算法,算法的公式为:

∑ x , y [ Img ⁡ ( x , y ) −  imgTemp  ( x , y ) ] 2 \sum_{x, y}[\operatorname{Img}(x, y)-\text { imgTemp }(x, y)]^2x,y[Img(x,y) imgTemp (x,y)]2

这与我们在机器学习中所提到的最小二乘法非常相似,都是先求对应位置的差,再平方变成正数,最后求和。从这个算法我们不能发现模板匹配也有一定的局限性:只能对特定的图片进行模板匹配,如果匹配目标发生旋转或大小变化那么算法失效!

本次项目所用的模板如下:

3.图像二值化

二值化是图像分割的一种最简单的方法。二值化可以把灰度图像转换成二值图像。把大于某个临界灰度值(阈值)的像素灰度设为灰度极大值(255),把小于这个值的像素灰度设为灰度极小值(0),从而实现二值化,简单来说:设定一个阈值valve,对于视频信号矩阵中的每一行,从左至右比较各像素值和阈值的大小,若图像灰度值大于或等于阈值,则判定该像素对应的255;反之,小于阈值的灰度值则为0。就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。

作用:去除干扰信息,方便后期的处理

图像的二值化分为全局阈值以及自适应阈值,下面我们分别来进行讲解。

3.1全局阈值

全局阈值即规定一个数字,将大于这个数字的像素全部变为指定的一个数,小于这个值的变为另一个数。我们首先看API函数,然后以具体以的例子来做讲解。对应全局阈值,opencv提供的API为:

cv2.threshold(src,thresh,maxVal,tpye)

  • src:输入的图片对象
  • thresh:阈值
  • maxVal:归成的最大值,归成的最小值为0,也就是黑色
  • tpye:cv2.THRESH_BINARY和cv2.THRESH_BINARY_INV
  • cv2.THRESH_BINARY:
  • cv2.THRESH_BINARY_INV

3.2全局阈值代码即效果展示

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :OpenCV识别银行卡数字 
@File    :test.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2023/1/14 17:17 
"""
import cv2
import numpy as np
# 读取图片
image = cv2.imread("Handsome.jpg")
# 转化为灰度图
image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
# 调整图片大小
image = cv2.resize(image,(640,480))
# 全局阈值处理
thresh,threshold_img = cv2.threshold(image,120,255,cv2.THRESH_BINARY)
# 展示图片
cv2.imshow("image",np.hstack((image,threshold_img)))
# cv2.imshow("image",image)
cv2.waitKey(0)
# 销毁窗口
cv2.destroyAllWindows()

3.3 自适应阈值

自适应阈值是根据周围的像素来确定当前的像素,同样我们结合AIP来讲解其中的原理。在opencv中为我们提供了自适应阈值的函数,为cv2.adaptiveThreshold()

cv2.adapptiveThreshold(src,maxVal,adaptiveMethod,type,blockSize,C)

  • src:输入的图片对象
  • maxVal:与全局阈值一样,指规定的最大值
  • adaptiveMethod:着重讲解一下我们项目中所用到的cv2.ADAPTIVE_THRESH_MEAN_C
  • cv2.ADAPTIVE_THRESH_MEAN_C取周围的像素作为判断当前像素值的依据,当blockSize为3时,即取3*3的卷积核,thresh = 9个像素平均灰度-C,那么图上的就等于90-10=80。这里的C即为一个常数,可以理解为偏置。此次项目中选择的tpye就是cv2.THRESH_BINARY,它的函数我们之前也提到过:
  • tpye:即为:cv2.THRESH_BINARY和cv2.THRESH_BINARY_INV
  • blockSize:领域的大小,和卷积核非常相似,对此不熟悉的可以看我之前的CNN卷积神经网络的猫狗识别这篇文章:CNN卷积神经网络的猫狗识别

3.4自适应阈值代码即效果展示

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :OpenCV识别银行卡数字 
@File    :全局阈值.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2023/1/14 17:17 
"""
import cv2
import numpy as np
# 读取图片
image = cv2.imread("cat_dog.jpg")
# 转化为灰度图
image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
# 调整图片大小
image = cv2.resize(image,(640,480))
# 全局阈值处理,注意有两个返回值,所以需要两个变量来接受
thresh,threshold_img = cv2.threshold(image,120,255,cv2.THRESH_BINARY)
# 展示图片
cv2.imshow("image",np.hstack((image,threshold_img)))
# cv2.imshow("image",image)
cv2.waitKey(0)
# 销毁窗口
cv2.destroyAllWindows()

4.轮廓筛选

4.1轮廓检测

我直接来看API,在opencv中也给我们提供了轮廓检测的函数,在这里多说一句,由于opencv底层是C++写的,所以很多代码命名规范与Python不同,所以在python中调用API的时候,一定要分清楚大小写。轮廓检测的函数是cv2.findContours()

cv2.findContours(image,mode,method)

  • image:传入的需要进行处理的图片
  • mode:轮廓检索的方式:

  • method:轮廓近似方法:

在此次项目中,我们轮廓检索模式为cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE。值得注意的是,返回值有两个,我们需要的是第一个contours,第二个hierarchy对我们没什么价值,我们用一个参数接收就可以了,重要的是contours,我们后面的很多操作都要用到检测出来的轮廓列表。

4.2绘制轮廓

在上面检测完轮廓之后返回了一个轮廓列表,在opencv中也给我们提供了绘制轮廓的API:cv2.drawContours(image,contours,i,color,thickness)

  • image:需要绘制的图片
  • contours:上述检测出来的轮廓列表
  • i:列表中第i个轮廓,如果选-1的话即所有轮廓
  • color:绘制的颜色
  • thickness:线宽,-1即填充

4.3轮廓筛选代码及效果展示

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :OpenCV识别银行卡数字 
@File    :轮廓检测.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2023/1/14 18:30 
"""
import cv2
import numpy as np
# 读取图片
image = cv2.imread("img.png")
# 转化为灰度图
image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
# 调整图片大小
image = cv2.resize(image,(640,480))
true_img = image.copy()
# 自适应阈值处理
threshold_img = cv2.adaptiveThreshold(image,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,21,-10)
cv2.imshow("threshold_img",threshold_img)
# 轮廓检测
contours,hierarchy = cv2.findContours(threshold_img,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
print(contours)
image_draw = cv2.drawContours(image,contours,-1,(0,255,255),5)
# 展示图片
cv2.imshow("image",np.hstack((true_img,image_draw)))
# cv2.imshow("image",image_draw)
cv2.waitKey(0)
# 销毁窗口
cv2.destroyAllWindows()


相关文章
|
2月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
104 7
基于qt的opencv实时图像处理框架FastCvLearn实战
|
2月前
|
文字识别 计算机视觉 开发者
基于QT的OCR和opencv融合框架FastOCRLearn实战
本文介绍了在Qt环境下结合OpenCV库构建OCR识别系统的实战方法,通过FastOCRLearn项目,读者可以学习Tesseract OCR的编译配置和在Windows平台下的实践步骤,文章提供了技术资源链接,帮助开发者理解并实现OCR技术。
127 9
基于QT的OCR和opencv融合框架FastOCRLearn实战
|
4月前
|
计算机视觉 Python
opencv识别颜色
opencv识别颜色
|
1月前
|
机器学习/深度学习 算法 计算机视觉
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
68 2
|
2月前
|
计算机视觉
基于QT的opencv插件框架qtCvFrameLearn实战
这篇文章详细介绍了如何基于Qt框架开发一个名为qtCvFrameLearn的OpenCV插件,包括项目配置、插件加载、Qt与OpenCV图像转换,以及通过各个插件学习OpenCV函数的使用,如仿射变换、卡通效果、腐蚀、旋转和锐化等。
44 10
|
3月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
|
3月前
|
计算机视觉 Python
opencv在pycharm不能自动补全代码
opencv在pycharm不能自动补全代码
30 0
|
4月前
|
机器学习/深度学习 数据采集 算法
Python基于OpenCV和卷积神经网络CNN进行车牌号码识别项目实战
Python基于OpenCV和卷积神经网络CNN进行车牌号码识别项目实战
285 19
|
4月前
|
机器学习/深度学习 人工智能 算法
|
5月前
|
计算机视觉
OpenCV下载、环境变量配置
OpenCV下载、环境变量配置