詳解利用python識(shí)別圖片中的條碼(pyzbar)及條碼圖片矯正和增強(qiáng)
前言
這周和大家分享如何用python識(shí)別圖像里的條碼。用到的庫(kù)可以是zbar。希望西瓜6辛苦碼的代碼不要被盜了。(zxing的話,我一直沒(méi)有裝好,等裝好之后再寫(xiě)一篇)
具體步驟
前期準(zhǔn)備
用opencv去讀取圖片,用pip進(jìn)行安裝。
pip install opencv-python
所用到的圖片就是這個(gè)

使用pyzbar
windows的安裝方法是
pip install pyzbar
而mac的話,最好用brew來(lái)安裝。
(有可能直接就好,也有可能很麻煩)
裝好之后就是讀取圖片,識(shí)別條碼。
代碼如下
import cv2
import pyzbar.pyzbar as pyzbar
image=cv2.imread("/Users/phoenix/Downloads/barcode.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
texts = pyzbar.decode(gray)
for text in texts:
tt = text.data.decode("utf-8")
print(tt)
結(jié)果如圖:

特殊情況處理(條碼圖片矯正和增強(qiáng))
只以pyzbar舉例
條碼是顛倒的是否會(huì)影響識(shí)別?
不影響,單純顛倒180度和90度是不會(huì)影響識(shí)別的。
我們把上一個(gè)圖的顛倒180度,用顛倒后的圖試一下

import cv2
import pyzbar.pyzbar as pyzbar
import numpy as np
image=cv2.imread("/Users/phoenix/Downloads/barcode_180.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
texts = pyzbar.decode(gray)
print(texts)
if texts==[]:
print("未識(shí)別成功")
else:
for text in texts:
tt = text.data.decode("utf-8")
print("識(shí)別成功")
print(tt)
結(jié)果如圖

90度的話也是同樣可以成功的。但是其它角度就會(huì)GG。
條碼是傾斜的是否會(huì)影響識(shí)別?
會(huì)的,但這種還比較好處理。
如圖

這張圖用上面的代碼就會(huì)

解決的思路是把這個(gè)圖片旋轉(zhuǎn)回來(lái),至于如何判斷轉(zhuǎn)多少度,可以通過(guò)opencv來(lái)處理。通過(guò)膨脹和腐蝕將其變?yōu)槿鐖D。

接著再用cv2.minAreaRect函數(shù),這個(gè)函數(shù)會(huì)返回如下,

里面的第三個(gè)-45就是我們需要的角度。
綜合起來(lái)的實(shí)現(xiàn)代碼,我就放在下面了。(我自己寫(xiě)的,如果有幫到你,快點(diǎn)關(guān)注和贊)
import cv2
import pyzbar.pyzbar as pyzbar
import numpy as np
def barcode(gray):
texts = pyzbar.decode(gray)
if texts == []:
angle = barcode_angle(gray)
if angle < -45:
angle = -90 - angle
texts = bar(gray, angle)
if texts == []:
gray = np.uint8(np.clip((1.1 * gray + 10), 0, 255))
angle = barcode_angle(gray)
#西瓜6寫(xiě)的,轉(zhuǎn)載需聲明
if angle < -45:
angle = -90 - angle
texts = bar(gray, angle)
return texts
def bar(image, angle):
gray = image
#西瓜6寫(xiě)的,轉(zhuǎn)載需聲明
bar = rotate_bound(gray, 0 - angle)
roi = cv2.cvtColor(bar, cv2.COLOR_BGR2RGB)
texts = pyzbar.decode(roi)
return texts
def barcode_angle(image):
gray = image
#西瓜6寫(xiě)的,轉(zhuǎn)載需聲明
ret, binary = cv2.threshold(gray, 220, 255, cv2.THRESH_BINARY_INV)
kernel = np.ones((8, 8), np.uint8)
dilation = cv2.dilate(binary, kernel, iterations=1)
erosion = cv2.erode(dilation, kernel, iterations=1)
erosion = cv2.erode(erosion, kernel, iterations=1)
erosion = cv2.erode(erosion, kernel, iterations=1)
contours, hierarchy = cv2.findContours(
erosion, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
if len(contours) == 0:
rect = [0, 0, 0]
else:
rect = cv2.minAreaRect(contours[0])
return rect[2]
def rotate_bound(image, angle):
(h, w) = image.shape[:2]
(cX, cY) = (w // 2, h // 2)
M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0)
cos = np.abs(M[0, 0])
sin = np.abs(M[0, 1])
#西瓜6寫(xiě)的,轉(zhuǎn)載需聲明
nW = int((h * sin) + (w * cos))
nH = int((h * cos) + (w * sin))
M[0, 2] += (nW / 2) - cX
M[1, 2] += (nH / 2) - cY
return cv2.warpAffine(image, M, (nW, nH))
image=cv2.imread("/Users/phoenix/Downloads/barcode_455.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
texts = barcode(gray)
print(texts)
if texts==[]:
print("未識(shí)別成功")
else:
for text in texts:
tt = text.data.decode("utf-8")
print("識(shí)別成功")
print(tt)
條碼是模糊的是否會(huì)影響識(shí)別?
會(huì)的,處理方法就是傳統(tǒng)的調(diào)對(duì)比度,銳化。。。。
不過(guò)這個(gè)只能解決部分部分,至于有的條碼,微信可以掃,支付寶可以掃,但是我們識(shí)別不了,這個(gè)也不能怪庫(kù)不好,這部分該放棄就放棄吧。
結(jié)束語(yǔ)
如果你想用python來(lái)解決圖像里的條碼識(shí)別問(wèn)題,這篇文章肯定是可以幫到你的。到此這篇關(guān)于詳解利用python識(shí)別圖片中的條碼(pyzbar)及條碼圖片矯正和增強(qiáng)的文章就介紹到這了,更多相關(guān)python識(shí)別圖片條碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)數(shù)值交換的四種方式
本文介紹了Python中四種實(shí)現(xiàn)數(shù)值交換的方法,包括使用臨時(shí)變量、元組解包、列表和異或運(yùn)算,具有一定的參考價(jià)值,感興趣的可以了解一下2025-01-01
Python利用PyExecJS庫(kù)執(zhí)行JS函數(shù)的案例分析
這篇文章主要介紹了Python利用PyExecJS庫(kù)執(zhí)行JS函數(shù),本文通過(guò)案例分析給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12
Ubuntu16安裝Python3.9的實(shí)現(xiàn)步驟
這篇文章主要介紹了Ubuntu16安裝Python3.9的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
tensorflow實(shí)現(xiàn)殘差網(wǎng)絡(luò)方式(mnist數(shù)據(jù)集)
這篇文章主要介紹了tensorflow實(shí)現(xiàn)殘差網(wǎng)絡(luò)方式(mnist數(shù)據(jù)集),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
Python?colorama?彩色打印實(shí)現(xiàn)代碼
這篇文章主要介紹了Python?colorama?彩色打印實(shí)現(xiàn)代碼,將介紹的類為Back,?它實(shí)現(xiàn)了與?Fore?類相同的九個(gè)關(guān)鍵字:BLACK、RED、GREEN、YELLOW、BLUE、MAGENTA、CYAN、WHITE、RESET,感興趣的朋友一起看看吧2022-04-04

