欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python OpenCV實(shí)現(xiàn)識(shí)別信用卡號(hào)教程詳解

 更新時(shí)間:2021年11月19日 16:52:30   作者:AI浩  
本文將介紹如何通過 OpenCV 和 Python 使用模板匹配來執(zhí)行光學(xué)字符識(shí)別 (OCR),再應(yīng)用我們的模板匹配 OCR 方法來識(shí)別信用卡類型以及 16 位信用卡數(shù)字。代碼具有一定價(jià)值,感興趣的童鞋可以了解一下

今天的博文分為三個(gè)部分。 在第一部分中,我們將討論 OCR-A 字體,這是一種專為輔助光學(xué)字符識(shí)別算法而創(chuàng)建的字體。 然后我們將設(shè)計(jì)一種計(jì)算機(jī)視覺和圖像處理算法,它可以:

  • 本地化信用卡上的四組四位數(shù)字。
  • 提取這四個(gè)分組中的每一個(gè),然后單獨(dú)分割 16 個(gè)數(shù)字中的每一個(gè)。
  • 使用模板匹配和 OCR-A 字體識(shí)別 16 個(gè)信用卡數(shù)字中的每一個(gè)。

最后,我們將看一些將信用卡 OCR 算法應(yīng)用于實(shí)際圖像的示例。

通過與 OpenCV 模板匹配的 OCR

在本節(jié)中,我們將使用 Python + OpenCV 實(shí)現(xiàn)我們的模板匹配算法來自動(dòng)識(shí)別信用卡數(shù)字。

為了實(shí)現(xiàn)這一點(diǎn),我們需要應(yīng)用許多圖像處理操作,包括閾值、計(jì)算梯度幅度表示、形態(tài)學(xué)操作和輪廓提取。這些技術(shù)已在其他博客文章中用于檢測(cè)圖像中的條形碼并識(shí)別護(hù)照?qǐng)D像中的機(jī)器可讀區(qū)域。

由于將應(yīng)用許多圖像處理操作來幫助我們檢測(cè)和提取信用卡數(shù)字,因此我在輸入圖像通過我們的圖像處理管道時(shí)包含了許多中間屏幕截圖。

這些額外的屏幕截圖將讓您更深入地了解我們?nèi)绾文軌驅(qū)⒒緢D像處理技術(shù)鏈接在一起以構(gòu)建計(jì)算機(jī)視覺項(xiàng)目的解決方案。 讓我們開始吧。

打開一個(gè)新文件,命名為 ocr_template_match.py ,我們將開始工作:

# import the necessary packages
from imutils import contours
import numpy as np
import argparse
import imutils
import cv2

要安裝/升級(jí) imutils ,只需使用 pip :

pip install --upgrade imutils

注意:如果您使用 Python 虛擬環(huán)境(就像我所有的 OpenCV 安裝教程一樣),請(qǐng)確保首先使用 workon 命令訪問您的虛擬環(huán)境,然后安裝/升級(jí) imutils 。

現(xiàn)在我們已經(jīng)安裝并導(dǎo)入了包,我們可以解析我們的命令行參數(shù):

# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,
	help="path to input image")
ap.add_argument("-r", "--reference", required=True,
	help="path to reference OCR-A image")
args = vars(ap.parse_args())

建立了一個(gè)參數(shù)解析器,添加兩個(gè)參數(shù),然后解析它們,將它們存儲(chǔ)為變量 args 。 兩個(gè)必需的命令行參數(shù)是:

–image :要進(jìn)行 OCR 處理的圖像的路徑。

–reference :參考 OCR-A 圖像的路徑。 該圖像包含 OCR-A 字體中的數(shù)字 0-9,從而允許我們稍后在管道中執(zhí)行模板匹配。

接下來讓我們定義信用卡類型:

# define a dictionary that maps the first digit of a credit card
# number to the credit card type
FIRST_NUMBER = {
	"3": "American Express",
	"4": "Visa",
	"5": "MasterCard",
	"6": "Discover Card"
}

信用卡類型,例如美國運(yùn)通、Visa 等,可以通過檢查 16 位信用卡號(hào)中的第一位數(shù)字來識(shí)別。我們定義了一個(gè)字典 FIRST_NUMBER ,它將第一個(gè)數(shù)字映射到相應(yīng)的信用卡類型。 讓我們通過加載參考 OCR-A 圖像來啟動(dòng)我們的圖像處理管道:

# load the reference OCR-A image from disk, convert it to grayscale,
# and threshold it, such that the digits appear as *white* on a
# *black* background
# and invert it, such that the digits appear as *white* on a *black*
ref = cv2.imread(args["reference"])
ref = cv2.cvtColor(ref, cv2.COLOR_BGR2GRAY)
ref = cv2.threshold(ref, 10, 255, cv2.THRESH_BINARY_INV)[1]

首先,我們加載參考 OCR-A 圖像,然后將其轉(zhuǎn)換為灰度和閾值 + 反轉(zhuǎn)。 在這些操作中的每一個(gè)中,我們存儲(chǔ)或覆蓋 ref ,我們的參考圖像。

現(xiàn)在讓我們?cè)?OCR-A 字體圖像上定位輪廓:

# find contours in the OCR-A image (i.e,. the outlines of the digits)
# sort them from left to right, and initialize a dictionary to map
# digit name to the ROI
refCnts = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL,
	cv2.CHAIN_APPROX_SIMPLE)
refCnts = imutils.grab_contours(refCnts)
refCnts = contours.sort_contours(refCnts, method="left-to-right")[0]
digits = {}

找到了參考圖像中的輪廓。 然后,由于 OpenCV 2.4、3 和 4 版本如何不同地存儲(chǔ)返回的輪廓信息,我們檢查版本并對(duì) refCnts 進(jìn)行適當(dāng)更改。 接下來,我們從左到右對(duì)輪廓進(jìn)行排序,并初始化一個(gè)字典,digits,它將數(shù)字名稱映射到感興趣的區(qū)域。

此時(shí),我們應(yīng)該遍歷輪廓,提取ROI并將其與其對(duì)應(yīng)的數(shù)字相關(guān)聯(lián):

# loop over the OCR-A reference contours
for (i, c) in enumerate(refCnts):
	# compute the bounding box for the digit, extract it, and resize
	# it to a fixed size
	(x, y, w, h) = cv2.boundingRect(c)
	roi = ref[y:y + h, x:x + w]
	roi = cv2.resize(roi, (57, 88))
	# update the digits dictionary, mapping the digit name to the ROI
	digits[i] = roi

遍歷參考圖像輪廓。

在循環(huán)中, i 保存數(shù)字名稱/編號(hào), c 保存輪廓。 我們圍繞每個(gè)輪廓 c 計(jì)算一個(gè)邊界框,用于存儲(chǔ)矩形的 (x, y) 坐標(biāo)和寬度/高度。使用邊界矩形參數(shù)從 ref(參考圖像)中提取 roi。 該 ROI 包含數(shù)字。

我們將每個(gè) ROI 大小調(diào)整為 57×88 像素的固定大小。 我們需要確保每個(gè)數(shù)字都調(diào)整為固定大小,以便在本教程后面的數(shù)字識(shí)別中應(yīng)用模板匹配。

我們將每個(gè)數(shù)字 0-9(字典鍵)與每個(gè) roi 圖像(字典值)相關(guān)聯(lián)。

在這一點(diǎn)上,我們完成了從參考圖像中提取數(shù)字并將它們與相應(yīng)的數(shù)字名稱相關(guān)聯(lián)的工作。

我們的下一個(gè)目標(biāo)是隔離輸入 --image 中的 16 位信用卡號(hào)。 我們需要先找到并隔離數(shù)字,然后才能啟動(dòng)模板匹配以識(shí)別每個(gè)數(shù)字。 這些圖像處理步驟非常有趣且有見地,特別是如果您之前從未開發(fā)過圖像處理管道,請(qǐng)務(wù)必密切關(guān)注。

讓我們繼續(xù)初始化幾個(gè)結(jié)構(gòu)化內(nèi)核:

# initialize a rectangular (wider than it is tall) and square
# structuring kernel
rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 3))
sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))

您可以將內(nèi)核視為我們?cè)趫D像上滑動(dòng)的小矩陣,以執(zhí)行(卷積)操作,例如模糊、銳化、邊緣檢測(cè)或其他圖像處理操作。

構(gòu)造了兩個(gè)這樣的內(nèi)核——一個(gè)矩形和一個(gè)正方形。 我們將使用矩形作為 Top-hat 形態(tài)算子,使用方形作為閉運(yùn)算。 我們很快就會(huì)看到這些。 現(xiàn)在讓我們準(zhǔn)備要進(jìn)行 OCR 的圖像:

# load the input image, resize it, and convert it to grayscale
image = cv2.imread(args["image"])
image = imutils.resize(image, width=300)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

加載了包含信用卡照片的命令行參數(shù)圖像。 然后,我們將其調(diào)整為 width=300 ,保持縱橫比,然后將其轉(zhuǎn)換為灰度。 讓我們看看我們的輸入圖像:

接下來是我們的調(diào)整大小和灰度操作:

現(xiàn)在我們的圖像已經(jīng)灰度化并且大小一致,讓我們進(jìn)行形態(tài)學(xué)操作:

# apply a tophat (whitehat) morphological operator to find light
# regions against a dark background (i.e., the credit card numbers)
tophat = cv2.morphologyEx(gray, cv2.MORPH_TOPHAT, rectKernel)

使用我們的 rectKernel 和我們的灰度圖像,我們執(zhí)行 Top-hat 形態(tài)學(xué)操作,將結(jié)果存儲(chǔ)為 tophat。

Top-hat操作在深色背景(即信用卡號(hào))下顯示淺色區(qū)域,如下圖所示:

給定我們的高帽圖像,讓我們計(jì)算沿 x 方向的梯度:

# compute the Scharr gradient of the tophat image, then scale
# the rest back into the range [0, 255]
gradX = cv2.Sobel(tophat, ddepth=cv2.CV_32F, dx=1, dy=0,
	ksize=-1)
gradX = np.absolute(gradX)
(minVal, maxVal) = (np.min(gradX), np.max(gradX))
gradX = (255 * ((gradX - minVal) / (maxVal - minVal)))
gradX = gradX.astype("uint8")

我們努力隔離數(shù)字的下一步是計(jì)算 x 方向上高帽圖像的 Scharr 梯度。完成計(jì)算,將結(jié)果存儲(chǔ)為 gradX 。

在計(jì)算 gradX 數(shù)組中每個(gè)元素的絕對(duì)值后,我們采取一些步驟將值縮放到 [0-255] 范圍內(nèi)(因?yàn)閳D像當(dāng)前是浮點(diǎn)數(shù)據(jù)類型)。 為此,我們計(jì)算 gradX 的 minVal 和 maxVal,然后計(jì)算第 73 行所示的縮放方程(即最小/最大歸一化)。 最后一步是將 gradX 轉(zhuǎn)換為范圍為 [0-255] 的 uint8。 結(jié)果如下圖所示:

讓我們繼續(xù)改進(jìn)信用卡數(shù)字查找算法:

# apply a closing operation using the rectangular kernel to help
# cloes gaps in between credit card number digits, then apply
# Otsu's thresholding method to binarize the image
gradX = cv2.morphologyEx(gradX, cv2.MORPH_CLOSE, rectKernel)
thresh = cv2.threshold(gradX, 0, 255,
	cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
# apply a second closing operation to the binary image, again
# to help close gaps between credit card number regions
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, sqKernel)

為了縮小差距,我們執(zhí)行了一個(gè)關(guān)閉操作。請(qǐng)注意,我們?cè)俅问褂昧?rectKernel。 隨后我們對(duì) gradX 圖像執(zhí)行 Otsu 和二進(jìn)制閾值,然后是另一個(gè)關(guān)閉操作。 這些步驟的結(jié)果如下所示:

接下來讓我們找到輪廓并初始化數(shù)字分組位置列表。

# find contours in the thresholded image, then initialize the
# list of digit locations
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
	cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
locs = []

我們找到了輪廓并將它們存儲(chǔ)在一個(gè)列表 cnts 中 。 然后,我們初始化一個(gè)列表來保存數(shù)字組位置。

現(xiàn)在讓我們遍歷輪廓,同時(shí)根據(jù)每個(gè)輪廓的縱橫比進(jìn)行過濾,允許我們從信用卡的其他不相關(guān)區(qū)域中修剪數(shù)字組位置:

# loop over the contours
for (i, c) in enumerate(cnts):
	# compute the bounding box of the contour, then use the
	# bounding box coordinates to derive the aspect ratio
	(x, y, w, h) = cv2.boundingRect(c)
	ar = w / float(h)
	# since credit cards used a fixed size fonts with 4 groups
	# of 4 digits, we can prune potential contours based on the
	# aspect ratio
	if ar > 2.5 and ar < 4.0:
		# contours can further be pruned on minimum/maximum width
		# and height
		if (w > 40 and w < 55) and (h > 10 and h < 20):
			# append the bounding box region of the digits group
			# to our locations list
			locs.append((x, y, w, h))

我們以與參考圖像相同的方式循環(huán)遍歷輪廓。 在計(jì)算每個(gè)輪廓的邊界矩形 c之后,我們通過將寬度除以高度來計(jì)算縱橫比 ar 。 使用縱橫比,我們分析每個(gè)輪廓的形狀。 如果 ar 介于 2.5 和 4.0 之間(寬大于高),以及 40 到 55 像素之間的 w 和 10 到 20 像素之間的 h,我們將一個(gè)方便的元組中的邊界矩形參數(shù)附加到 locs。

下圖顯示了我們找到的分組——出于演示目的,我讓 OpenCV 在每個(gè)組周圍繪制了一個(gè)邊界框:

接下來,我們將從左到右對(duì)分組進(jìn)行排序并初始化信用卡數(shù)字列表:

# sort the digit locations from left-to-right, then initialize the
# list of classified digits
locs = sorted(locs, key=lambda x:x[0])
output = []

我們根據(jù) x 值對(duì) locs 進(jìn)行排序,因此它們將從左到右排序。 我們初始化一個(gè)列表 output ,它將保存圖像的信用卡號(hào)。 現(xiàn)在我們知道每組四位數(shù)字的位置,讓我們循環(huán)遍歷四個(gè)排序的組并確定其中的數(shù)字。

這個(gè)循環(huán)相當(dāng)長(zhǎng),分為三個(gè)代碼塊——這是第一個(gè)塊:

# loop over the 4 groupings of 4 digits
for (i, (gX, gY, gW, gH)) in enumerate(locs):
	# initialize the list of group digits
	groupOutput = []
	# extract the group ROI of 4 digits from the grayscale image,
	# then apply thresholding to segment the digits from the
	# background of the credit card
	group = gray[gY - 5:gY + gH + 5, gX - 5:gX + gW + 5]
	group = cv2.threshold(group, 0, 255,
		cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
	# detect the contours of each individual digit in the group,
	# then sort the digit contours from left to right
	digitCnts = cv2.findContours(group.copy(), cv2.RETR_EXTERNAL,
		cv2.CHAIN_APPROX_SIMPLE)
	digitCnts = imutils.grab_contours(digitCnts)
	digitCnts = contours.sort_contours(digitCnts,
		method="left-to-right")[0]

在此循環(huán)的第一個(gè)塊中,我們提取并在每側(cè)填充組 5 個(gè)像素,應(yīng)用閾值處理,并查找和排序輪廓。 詳情請(qǐng)務(wù)必參考代碼。 下面顯示的是已提取的單個(gè)組:

讓我們用嵌套循環(huán)繼續(xù)循環(huán)以進(jìn)行模板匹配和相似度得分提?。?/p>

# loop over the digit contours
	for c in digitCnts:
		# compute the bounding box of the individual digit, extract
		# the digit, and resize it to have the same fixed size as
		# the reference OCR-A images
		(x, y, w, h) = cv2.boundingRect(c)
		roi = group[y:y + h, x:x + w]
		roi = cv2.resize(roi, (57, 88))
		# initialize a list of template matching scores	
		scores = []
		# loop over the reference digit name and digit ROI
		for (digit, digitROI) in digits.items():
			# apply correlation-based template matching, take the
			# score, and update the scores list
			result = cv2.matchTemplate(roi, digitROI,
				cv2.TM_CCOEFF)
			(_, score, _, _) = cv2.minMaxLoc(result)
			scores.append(score)
		# the classification for the digit ROI will be the reference
		# digit name with the *largest* template matching score
		groupOutput.append(str(np.argmax(scores)))

使用 cv2.boundingRect 我們獲得提取包含每個(gè)數(shù)字的 ROI 所需的參數(shù)。為了使模板匹配以某種程度的精度工作,我們將 roi 的大小調(diào)整為與我們?cè)诘?144 行上的參考 OCR-A 字體數(shù)字圖像(57×88 像素)相同的大小。

我們初始化了一個(gè)分?jǐn)?shù)列表。將其視為我們的置信度分?jǐn)?shù)——它越高,它就越有可能是正確的模板。

現(xiàn)在,讓我們通過每個(gè)參考數(shù)字循環(huán)(第三個(gè)嵌套循環(huán))并執(zhí)行模板匹配。這是為這個(gè)腳本完成繁重工作的地方。

OpenCV 有一個(gè)名為 cv2.matchTemplate 的方便函數(shù),您可以在其中提供兩個(gè)圖像:一個(gè)是模板,另一個(gè)是輸入圖像。將 cv2.matchTemplate 應(yīng)用于這兩個(gè)圖像的目的是確定它們的相似程度。

在這種情況下,我們提供參考 digitROI 圖像和包含候選數(shù)字的信用卡的 roi。使用這兩個(gè)圖像,我們調(diào)用模板匹配函數(shù)并存儲(chǔ)結(jié)果。 接下來,我們從結(jié)果中提取分?jǐn)?shù)并將其附加到我們的分?jǐn)?shù)列表中。這樣就完成了最內(nèi)部的循環(huán)。

使用分?jǐn)?shù)(每個(gè)數(shù)字 0-9 一個(gè)),我們?nèi)∽畲蠓謹(jǐn)?shù)——最大分?jǐn)?shù)應(yīng)該是我們正確識(shí)別的數(shù)字。我們找到得分最高的數(shù)字,通過 np.argmax 獲取特定索引。該索引的整數(shù)名稱表示基于與每個(gè)模板的比較最可能的數(shù)字(再次記住,索引已經(jīng)預(yù)先排序?yàn)?0-9)。

最后,讓我們?cè)诿拷M周圍畫一個(gè)矩形,并以紅色文本查看圖像上的信用卡號(hào):

# draw the digit classifications around the group
	cv2.rectangle(image, (gX - 5, gY - 5),
		(gX + gW + 5, gY + gH + 5), (0, 0, 255), 2)
	cv2.putText(image, "".join(groupOutput), (gX, gY - 15),
		cv2.FONT_HERSHEY_SIMPLEX, 0.65, (0, 0, 255), 2)
	# update the output digits list
	output.extend(groupOutput)

對(duì)于此循環(huán)的第三個(gè)也是最后一個(gè)塊,我們?cè)诮M周圍繪制一個(gè) 5 像素的填充矩形,然后在屏幕上繪制文本。

最后一步是將數(shù)字附加到輸出列表中。 Pythonic 方法是使用擴(kuò)展函數(shù)將可迭代對(duì)象(在本例中為列表)的每個(gè)元素附加到列表的末尾。

要查看腳本的執(zhí)行情況,讓我們將結(jié)果輸出到終端并在屏幕上顯示我們的圖像。

# display the output credit card information to the screen
print("Credit Card Type: {}".format(FIRST_NUMBER[output[0]]))
print("Credit Card #: {}".format("".join(output)))
cv2.imshow("Image", image)
cv2.waitKey(0)

將信用卡類型打印到控制臺(tái),然后在隨后的第 173 行打印信用卡號(hào)。

在最后幾行,我們?cè)谄聊簧巷@示圖像并等待任何鍵被按下,然后退出腳本第 174 和 175 行。

花點(diǎn)時(shí)間祝賀自己——你做到了。 回顧一下(在高層次上),這個(gè)腳本:

  • 將信用卡類型存儲(chǔ)在字典中。
  • 獲取參考圖像并提取數(shù)字。
  • 將數(shù)字模板存儲(chǔ)在字典中。
  • 本地化四個(gè)信用卡號(hào)碼組,每個(gè)組包含四位數(shù)字(總共 16 位數(shù)字)。
  • 提取要“匹配”的數(shù)字。
  • 對(duì)每個(gè)數(shù)字執(zhí)行模板匹配,將每個(gè)單獨(dú)的 ROI 與每個(gè)數(shù)字模板 0-9 進(jìn)行比較,同時(shí)存儲(chǔ)每個(gè)嘗試匹配的分?jǐn)?shù)。
  • 找到每個(gè)候選數(shù)字的最高分,并構(gòu)建一個(gè)名為 output 的列表,其中包含信用卡號(hào)。
  • 將信用卡號(hào)和信用卡類型輸出到我們的終端,并將輸出圖像顯示到我們的屏幕上。

現(xiàn)在是時(shí)候查看運(yùn)行中的腳本并檢查我們的結(jié)果了。

信用卡 OCR 結(jié)果

現(xiàn)在我們已經(jīng)對(duì)信用卡 OCR 系統(tǒng)進(jìn)行了編碼,讓我們?cè)囈辉嚒?/p>

我們顯然不能在這個(gè)例子中使用真實(shí)的信用卡號(hào),所以我使用谷歌收集了一些信用卡示例圖像。

這些信用卡顯然是假的,僅用于演示目的。 但是,您可以應(yīng)用此博客文章中的相同技術(shù)來識(shí)別實(shí)際信用卡上的數(shù)字。

要查看我們的信用卡 OCR 系統(tǒng)的運(yùn)行情況,請(qǐng)打開一個(gè)終端并執(zhí)行以下命令:

$ python ocr_template_match.py --reference ocr_a_reference.png \
	--image images/credit_card_05.png
Credit Card Type: MasterCard
Credit Card #: 5476767898765432

我們的第一個(gè)結(jié)果圖像,100% 正確:

請(qǐng)注意我們?nèi)绾文軌蛘_地將信用卡標(biāo)記為萬事達(dá)卡,只需檢查信用卡號(hào)中的第一位數(shù)字即可。 讓我們嘗試第二張圖片,這次是一張簽證:

$ python ocr_template_match.py --reference ocr_a_reference.png \
	--image images/credit_card_01.png
Credit Card Type: Visa
Credit Card #: 4000123456789010

再一次,我們能夠使用模板匹配正確地對(duì)信用卡進(jìn)行 OCR。

$ python ocr_template_match.py --reference ocr_a_reference.png

$ python ocr_template_match.py --reference ocr_a_reference.png \
	--image images/credit_card_02.png
Credit Card Type: Visa
Credit Card #: 4020340002345678

總結(jié)

在本教程中,我們學(xué)習(xí)了如何通過 OpenCV 和 Python 使用模板匹配來執(zhí)行光學(xué)字符識(shí)別 (OCR)。

具體來說,我們應(yīng)用我們的模板匹配 OCR 方法來識(shí)別信用卡類型以及 16 位信用卡數(shù)字。

為了實(shí)現(xiàn)這一點(diǎn),我們將圖像處理管道分為 4 個(gè)步驟:

  • 通過各種圖像處理技術(shù)檢測(cè)信用卡上的四組四個(gè)數(shù)字,包括形態(tài)學(xué)操作、閾值和輪廓提取。
  • 從四個(gè)分組中提取每個(gè)單獨(dú)的數(shù)字,導(dǎo)致需要分類的 16 個(gè)數(shù)字。
  • 通過將每個(gè)數(shù)字與 OCR-A 字體進(jìn)行比較,將模板匹配應(yīng)用于每個(gè)數(shù)字以獲得我們的數(shù)字分類。
  • 檢查信用卡號(hào)的第一位數(shù)字以確定發(fā)行公司。

在評(píng)估了我們的信用卡 OCR 系統(tǒng)后,我們發(fā)現(xiàn)它是 100% 準(zhǔn)確的,前提是發(fā)行信用卡公司使用 OCR-A 字體作為數(shù)字。

要擴(kuò)展此應(yīng)用程序,您可能希望在野外收集信用卡的真實(shí)圖像,并可能訓(xùn)練機(jī)器學(xué)習(xí)模型(通過標(biāo)準(zhǔn)特征提取或訓(xùn)練或卷積神經(jīng)網(wǎng)絡(luò))以進(jìn)一步提高該系統(tǒng)的準(zhǔn)確性。

到此這篇關(guān)于Python OpenCV實(shí)現(xiàn)識(shí)別信用卡號(hào)教程詳解的文章就介紹到這了,更多相關(guān)識(shí)別卡號(hào)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳談Python3 操作系統(tǒng)與路徑 模塊(os / os.path / pathlib)

    詳談Python3 操作系統(tǒng)與路徑 模塊(os / os.path / pathlib)

    下面小編就為大家分享一篇詳談Python3 操作系統(tǒng)與路徑 模塊(os / os.path / pathlib),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Python使用Matplotlib實(shí)現(xiàn)雨點(diǎn)圖動(dòng)畫效果的方法

    Python使用Matplotlib實(shí)現(xiàn)雨點(diǎn)圖動(dòng)畫效果的方法

    這篇文章主要介紹了Python使用Matplotlib實(shí)現(xiàn)雨點(diǎn)圖動(dòng)畫效果的方法,結(jié)合實(shí)例形式分析了win10安裝ffmpeg及animation函數(shù)的使用相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • 對(duì)Python 獲取類的成員變量及臨時(shí)變量的方法詳解

    對(duì)Python 獲取類的成員變量及臨時(shí)變量的方法詳解

    今天小編就為大家分享一篇對(duì)Python 獲取類的成員變量及臨時(shí)變量的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • 一文帶你解決Python中的所有報(bào)錯(cuò)

    一文帶你解決Python中的所有報(bào)錯(cuò)

    使用Python進(jìn)行代碼編程的時(shí)候,難免會(huì)遇到代碼報(bào)錯(cuò),不僅僅是新手小白會(huì)遇到,就是很多編程大神也是經(jīng)常出現(xiàn)BUG的,下面這篇文章主要給大家介紹了關(guān)于解決Python中所有報(bào)錯(cuò)的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • 帶你一文讀懂Python垃圾回收機(jī)制

    帶你一文讀懂Python垃圾回收機(jī)制

    這篇文章主要介紹了帶你一文讀懂Python垃圾回收機(jī)制,如果對(duì)其垃圾回收機(jī)制不了解,很多時(shí)候?qū)懗龅?nbsp;Python 代碼會(huì)非常低效,需要的朋友可以參考下
    2023-04-04
  • python heic后綴圖片文件轉(zhuǎn)換成jpg格式的操作

    python heic后綴圖片文件轉(zhuǎn)換成jpg格式的操作

    這篇文章主要介紹了python heic后綴圖片文件轉(zhuǎn)換成jpg格式的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python中Parser的超詳細(xì)用法實(shí)例

    Python中Parser的超詳細(xì)用法實(shí)例

    Parser模塊為Python的內(nèi)部解析器和字節(jié)碼編譯器提供了一個(gè)接口,該接口的主要目的是允許Python代碼編輯Python表達(dá)式的分析樹并從中創(chuàng)建可執(zhí)行代碼,這篇文章主要給大家介紹了關(guān)于Python中Parser超詳細(xì)用法的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • Django與pyecharts結(jié)合的實(shí)例代碼

    Django與pyecharts結(jié)合的實(shí)例代碼

    這篇文章主要介紹了Django與pyecharts結(jié)合的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Django返回HTML文件的實(shí)現(xiàn)方法

    Django返回HTML文件的實(shí)現(xiàn)方法

    這篇文章主要介紹了Django返回HTML文件的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Python pysnmp使用方法及代碼實(shí)例

    Python pysnmp使用方法及代碼實(shí)例

    這篇文章主要介紹了Python pysnmp使用方法及代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08

最新評(píng)論