OpenCV之信用卡卡号识别
1.OpenCV概述
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和图像处理库,主要用于 图像处理、视频分析、机器视觉、深度学习 等领域。它最初由 Intel 研发,现在由 OpenCV 组织 维护,目前支持 C++、Python、Java 等多种语言。擅长领域有:
- 图像处理
- 去噪:去掉照片上的噪点,让图像更清晰
- 平滑 & 锐化:模糊处理(比如美颜相机的磨皮)、增强边缘(让模糊的字变得更清楚)
- 颜色调整:可以把彩色图转换成黑白图(灰度化),或者增强对比度
- 图像分割:把图片中的不同区域分开,比如把人的头像从背景中抠出来(绿幕抠像)
- 物体检测与识别
- 人脸检测:找到照片或视频里的人脸,并画出边框(Haar 级联分类器、DNN)
- 车牌识别:用于交通监控,自动读取车牌号码
- 目标检测:找出图片中的特定物体,比如识别商店里的商品、扫描条形码等
- 运动跟踪
- 光流法(Optical Flow):计算物体在连续帧中的运动轨迹
- 目标跟踪算法(KCF, CSRT, Meanshift 等):给定一个目标,让电脑自动跟踪它
- 背景建模(Background Subtraction):检测哪些像素在变动,适用于监控场景
- 视频处理
- 视频稳定:去除视频抖动,让画面更流畅
- 背景去除:提取前景人物,换掉背景,比如绿幕抠像
- 帧间差分:检测视频中的移动物体,比如监控摄像头检测入侵者
- 深度学习
- 人脸识别(Face Recognition): 结合 DNN 深度神经网络,实现人脸对比、身份认证
- 目标检测(Object Detection):结合YOLO、SSD、Faster R-CNN 等深度学习模型
- 图像分割(Image Segmentation):分割出物体的精确轮廓,而不仅仅是简单画个边框
2.概述
1.目标
识别信用卡数字,在控制台输出,同时在信用卡上标注出来。
2.流程
先解析模板数字,获取数字以及对应的数字轮廓特征,再解析信用卡指定位置数字轮廓特征,与模板数字做匹配,获取对应识别结果并标注出来。
3.参数设置
对应信用卡图片路径和模板图片路径配置参数--image imgs/credit_card_02.png --template ocr_a_reference.png
1 | # 设置参数 |
2.数字模板处理
解析图像模板,提取 数字字符的轮廓,并将其存储为模板数据,方便后续匹配识别
1 | # 绘图展示(任意按键消失) |
1 | def template_parsing(_template_img): |
3.信用卡解析
解析信用卡图像,提取卡号区域,并返回卡号的位置信息
1 | def credit_card_parsing(_card_img): |
4.卡号分割与识别
流程:
- 遍历卡号区域,对每个区域进行预处理
- 提取数字轮廓,逐个数字进行匹配
- 使用模板匹配识别每个数字,并标注到原图上
1 | def detect_parsing_digits(_locations, _gray_img, _card_img, _digits_dict): |
5.整合调用
1 | if __name__ == '__main__': |
6.总结
- 模板处理要点
- 转换为灰度图 ➝ cv2.cvtColor
- 二值化 ➝ cv2.threshold
- 轮廓检测 ➝ cv2.findContours
- 提取单个数字并归一化 ➝ cv2.boundingRect + cv2.resize
- 信用卡号区域检测要点
- 转换为灰度图 ➝ cv2.cvtColor
- 顶帽变换(增强数字区域)➝ cv2.morphologyEx
- Sobel 梯度计算(检测横向边缘)➝ cv2.Sobel
- 闭操作(膨胀+腐蚀)(让数字连接在一起)➝ cv2.morphologyEx
- 二值化 ➝ cv2.threshold
- 轮廓检测(定位可能的卡号区域)➝ cv2.findContours
- 过滤候选区域(宽高比筛选)➝ sorted
- 数字识别要点
- 遍历卡号区域,提取感兴趣区域
- 二值化(提高对比度)
- 轮廓检测(提取单个数字)
- 逐个数字与模板匹配 ➝ cv2.matchTemplate
- 输出最佳匹配的数字
7.备注
环境:
- mac: 15.2
- python: 3.12.4
- pytorch: 2.5.1
- numpy: 1.26.4
- opencv-python: 4.11.0.86
资源和代码:
https://github.com/keychankc/dl_code_for_blog/tree/main/006_opencv_credit_card_ocr