- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python OpenCV招商银行信用卡卡号识别的方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
从本篇博客起,我们将实际完成几个小案例,第一个就是银行卡号识别,预计本案例将写 5 篇左右的博客才可以完成,一起加油吧.
本文的目标是最终获取一套招商银行卡,0~9 数字的图,对于下图的数字,我们需要提取出来,便于后续模板匹配使用。不过下图中找到的数字不完整,需要找到尽量多的卡片,然后补齐这些数字.
先对上文中卡片中的数字进行相关提取操作,加载图片的灰度图,获取目标区域。在画板中模拟一下坐标区域,为了便于进行后续的操作.
具体代码如下:
import cv2 as cvimport numpy as np# 读取灰度图src = cv.imread("./ka1.jpg", 0)# 寻找卡号目标区域roi = src[142:168, 42:360]# cv.imshow("roi",roi)
获取到的图片如下,发现右侧边缘缺少一部分内容,对目标区域坐标进行微调.
修改之后的代码如下,你如果使用的图片与橡皮擦不一致,注意进行修改.
# 寻找卡号目标区域roi = src[142:168, 46:364]cv.imshow("roi",roi)
消除噪音,可以增加模糊卷积操作,分别测试均值模糊,中值模糊,高斯模糊效果.
# 模糊卷积操作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) 的时候,高斯模糊效果不错,可以去噪.
接下来进行二值化操作.
# 对目标区域进行二值化操作ret, thresh = cv.threshold( gau_roi, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)cv.imshow("thresh", thresh)
二值化处理完毕之后,发现还存在一些白色区域的点,需要去除掉,这里使用了形态学里面的腐蚀操作.
# 腐蚀kernel = np.ones((3, 4), np.uint8)dst = cv.erode(thresh, kernel=kernel)
腐蚀之后在进行膨胀,让原有的数字区域变的明显,最后的图片是进行之后的效果,关于卷积核你可以自行调整.
# 腐蚀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)
下面进行外轮廓检测,检测之后发现恰好有 16 个轮廓,也就对应了 16 个数字区域.
# 检测外轮廓# 只检测外轮廓contours, hierarchy = cv.findContours(dilate_dst, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)print(len(contours))
对轮廓面积进行一下输出,为了防止出现非目标区域,可以进行一下基本的判断,当罗阔面积大于 80 的时候才进行展示.
target_list = []# 轮廓判断for cnt in contours: # 轮廓面积 area = cv.contourArea(cnt) print(area) if area > 79: target_list.append(cnt)print(len(target_list))
有这些参数之后,就可以对灰度图进行裁切了,基于外接矩形获取目标区域,我直接做了循环展示.
for index, cnt in enumerate(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)
接下来放大图片对其进行保存即可,得到如下图片列表,至此,已经获取到 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)
新的图像注意调整目标区域,获取素材,已经获取到 1、2、4、5、6、7、8 几个数字 。
反复迭代这个办法,知道 0~9 个数字获取完整,找到所有数字之后,对该文件夹中的所有文件进行二值化操作.
import cv2 as cvimport osdef walk_file(file): for root, dirs, files in os.walk(file): for f in files: 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招商银行信用卡卡号识别的方法的文章就介绍到这了,更多相关OpenCV信用卡卡号识别内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://dream.blog.csdn.net/article/details/114366561 。
最后此篇关于Python OpenCV招商银行信用卡卡号识别的方法的文章就讲到这里了,如果你想了解更多关于Python OpenCV招商银行信用卡卡号识别的方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!