- 介绍OpenCV和Python
OpenCV是一个开源的计算机视觉库,能够实现图像处理、机器学习、目标检测、人脸识别等功能。Python是一种解释型、面向对象、动态数据类型的高级程序设计语言,具有易学易用、扩展性强等优点。Python可以利用OpenCV实现多种计算机视觉任务, 许多图像处理和计算机视觉的应用程序都采用了这种组合。
- 信用卡识别的背景介绍
在一些电商平台或者其他网站上,用户需要输入信用卡号码才能完成交易。为了提升用户体验和操作效率,有必要采用自动识别技术。本教程将提供通过Python OpenCV实现信用卡号码识别的方法,能够自动识别信用卡号码进行支付。
- Python OpenCV安装
在Python环境下,我们可以使用pip命令安装OpenCV依赖和库:
pip install opencv-python
如果需要利用摄像头进行测试,还需要安装摄像头相关的库:
pip install opencv-contrib-python
- 提取信用卡区域
提取信用卡区域是信用卡识别的第一步,我们可以借助OpenCV提供的边缘检测算法和形态学操作实现这一步骤。具体步骤如下:
1) 使用Canny边缘检测算法探测图像的边缘。
2) 对图像进行形态学处理,包括膨胀和腐蚀。
3) 提取轮廓,寻找最大轮廓并切割出信用卡区域。
import cv2
image = cv2.imread('credit_card.png')
# 将图像转为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 使用Canny边缘检测算法探测图像的边缘
edged = cv2.Canny(gray, 50, 200)
# 对图像进行形态学处理,包括膨胀和腐蚀
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
closed = cv2.morphologyEx(edged, cv2.MORPH_CLOSE, kernel)
# 提取轮廓,寻找最大轮廓并切割出信用卡区域
cnts, _ = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
c = sorted(cnts, key=cv2.contourArea, reverse=True)[0]
rect = cv2.minAreaRect(c)
box = cv2.boxPoints(rect)
box = box.astype(int)
cv2.drawContours(image, [box], -1, (0, 255, 0), 2)
- 提取信用卡号码
在提取信用卡号码时,我们首先需要将信用卡区域变换到适当的方向以便后续处理,然后使用现代OCR技术提取信用卡号码。具体步骤如下:
1) 将信用卡区域按照适当的角度旋转。
2) 将信用卡区域变换到标准大小,以便后续处理。
3) 利用现代OCR技术提取信用卡号码。
import pytesseract
import numpy as np
image = cv2.imread('credit_card.png')
# 将图像转为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 将信用卡区域变换到适当的方向
rect = cv2.minAreaRect(box)
angle = rect[-1]
if angle < -45:
angle = -(90 + angle)
else:
angle = -angle
(h, w) = image.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, angle, 1.0)
rotated = cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)
# 将信用卡区域变换到标准大小
resized = cv2.resize(rotated, (450, 300))
# 提取信用卡号码
gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)
id_box = gray[80:180, 140:380]
thresh = cv2.threshold(id_box, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
kernel = np.ones((5, 5), np.uint8)
eroded = cv2.erode(thresh, kernel, iterations=1)
dilated = cv2.dilate(eroded, kernel, iterations=1)
id_number = pytesseract.image_to_string(dilated, lang='eng', config='--psm 6')
- 完成信用卡识别
将第4步和第5步的代码相结合,就可以实现信用卡号码的识别,以下是完整代码:
import cv2
import pytesseract
import numpy as np
image = cv2.imread('credit_card.png')
# 将图像转为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 使用Canny边缘检测算法探测图像的边缘
edged = cv2.Canny(gray, 50, 200)
# 对图像进行形态学处理,包括膨胀和腐蚀
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
closed = cv2.morphologyEx(edged, cv2.MORPH_CLOSE, kernel)
# 提取轮廓,寻找最大轮廓并切割出信用卡区域
cnts, _ = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
c = sorted(cnts, key=cv2.contourArea, reverse=True)[0]
rect = cv2.minAreaRect(c)
box = cv2.boxPoints(rect)
box = box.astype(int)
cv2.drawContours(image, [box], -1, (0, 255, 0), 2)
# 将信用卡区域按照适当的角度旋转
angle = rect[-1]
if angle < -45:
angle = -(90 + angle)
else:
angle = -angle
(h, w) = image.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, angle, 1.0)
rotated = cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)
# 将信用卡区域变换到标准大小
resized = cv2.resize(rotated, (450, 300))
# 提取信用卡号码
gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)
id_box = gray[80:180, 140:380]
thresh = cv2.threshold(id_box, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
kernel = np.ones((5, 5), np.uint8)
eroded = cv2.erode(thresh, kernel, iterations=1)
dilated = cv2.dilate(eroded, kernel, iterations=1)
id_number = pytesseract.image_to_string(dilated, lang='eng', config='--psm 6')
print(id_number)
其中,上述代码中使用的信用卡图像(credit_card.png)可通过以下代码生成:
import numpy as np
import cv2
image = np.zeros((300, 500, 3), dtype='uint8')
cv2.rectangle(image, (0, 0), (500, 300), (255, 255, 255), -1)
cv2.rectangle(image, (50, 50), (450, 250), (0, 0, 0), -1)
cv2.putText(image, '1234 5678 9101 1121', (70, 200), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (255, 255, 255), 2)
cv2.imwrite('credit_card.png', image)
通过以上步骤,我们就可以实现Python OpenCV实现识别信用卡号的功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python OpenCV实现识别信用卡号教程详解 - Python技术站