简体   繁体   English

如何在 Python 中使用 OpenCV 和 Tesseract 处理信用卡字体

[英]How to handle Credit Cards fonts with OpenCV and Tesseract in Python

I'm trying to read cards and output card numbers and expiry date with OpenCV.我正在尝试使用 OpenCV 读取卡片并输出卡号和有效期。

import cv2
import pytesseract

filename = 'image1.png'
img = cv2.imread(filename)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
canny = cv2.Canny(gray, 50, 150, apertureSize=3)
result = pytesseract.image_to_string(canny)
print(f"OCR Results: {result}")

cv2.imshow('img', img)
cv2.imshow('canny', canny)

if cv2.waitKey(0) & 0xff == 27:
    cv2.destroyAllWindows()

在此处输入图片说明

  1. Image before processing处理前的图像

在此处输入图片说明

  1. Image after Canny Canny 之后的图像

The result text does not look good.结果文本看起来不太好。 See the screenshot below:请看下面的截图:

在此处输入图片说明

Question: How can I properly handle the cards fonts well for better results.问题:如何正确处理卡片字体以获得更好的效果。 Any idea is highly appreciated.任何想法都受到高度赞赏。

Thanks.谢谢。

It looks like the OCR is not working well when passing the edges of the text.在传递文本边缘时,OCR 似乎无法正常工作。
You better apply threshold instead of using Canny.您最好应用阈值而不是使用 Canny。

I suggest the following stages:我建议以下几个阶段:

  • Convert from BGR to HSV color space, and get the S (saturation) color channel of HSV.从BGR转换到HSV色彩空间,得到HSV的S(饱和度)色彩通道。
    All gray pixels in S are zero, and colored pixels are above zero. S 中的所有灰色像素均为零,彩色像素均高于零。
  • Convert to binary using automatic threshold (use cv2.THRESH_OTSU ).使用自动阈值转换为二进制(使用cv2.THRESH_OTSU )。
  • Crop the contour with the maximum size.用最大尺寸裁剪轮廓。
    Because the image you posted contains some background.因为您发布的图片包含一些背景。
  • Apply OCR on the cropped area.在裁剪区域应用 OCR。

Here is the code:这是代码:

import numpy as np
import cv2
import imutils  # https://pypi.org/project/imutils/
import pytesseract

pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'  # I am using Windows

img = cv2.imread('image1.png')  # Read input image

# Convert from BGR to HSV color space
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# Get the saturation color channel - all gray pixels are zero, and colored pixels are above zero.
s = hsv[:, :, 1]

# Convert to binary using automatic threshold (use cv2.THRESH_OTSU)
ret, thresh = cv2.threshold(s, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# Find contours (in inverted thresh)
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cnts = imutils.grab_contours(cnts)

# Find the contour with the maximum area.
c = max(cnts, key=cv2.contourArea)

# Get bounding rectangle
x, y, w, h = cv2.boundingRect(c)

# Crop the bounding rectangle out of thresh
thresh_card = thresh[y:y+h, x:x+w].copy()

# OCR
result = pytesseract.image_to_string(thresh_card)
print(f"OCR Results:\n {result}")


# Show images for debugging
cv2.imshow('s', s)
cv2.imshow('thresh', thresh)
cv2.imshow('thresh_card', thresh_card)
cv2.waitKey(0)
cv2.destroyAllWindows()

OCR Result: OCR 结果:

 Visa Classic

| By)

4000 1234 Sb18 9010

CARDHOLDER MARE
VISA

Still not perfect...还是不完美...


s: s:
在此处输入图片说明

thresh:阈值:
在此处输入图片说明

thresh_card:阈值卡:
在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM