詳解利用python識(shí)別圖片中的條碼(pyzbar)及條碼圖片矯正和增強(qiáng)
前言
這周和大家分享如何用python識(shí)別圖像里的條碼。用到的庫(kù)可以是zbar。希望西瓜6辛苦碼的代碼不要被盜了。(zxing的話(huà),我一直沒(méi)有裝好,等裝好之后再寫(xiě)一篇)
具體步驟
前期準(zhǔn)備
用opencv去讀取圖片,用pip進(jìn)行安裝。
pip install opencv-python
所用到的圖片就是這個(gè)
使用pyzbar
windows的安裝方法是
pip install pyzbar
而mac的話(huà),最好用brew來(lái)安裝。(有可能直接就好,也有可能很麻煩)裝好之后就是讀取圖片,識(shí)別條碼。代碼如下
import cv2import pyzbar.pyzbar as pyzbarimage=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 cv2import pyzbar.pyzbar as pyzbarimport numpy as npimage=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à)也是同樣可以成功的。但是其它角度就會(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 cv2import pyzbar.pyzbar as pyzbarimport numpy as npdef 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 textsdef 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 textsdef 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è)只能解決部分部分,至于有的條碼,微信可以?huà)撸Ц秾毧梢話(huà)撸俏覀冏R(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)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. Java封裝數(shù)組實(shí)現(xiàn)包含、搜索和刪除元素操作詳解2. 淺談SpringMVC jsp前臺(tái)獲取參數(shù)的方式 EL表達(dá)式3. ASP刪除img標(biāo)簽的style屬性只保留src的正則函數(shù)4. Gitlab CI-CD自動(dòng)化部署SpringBoot項(xiàng)目的方法步驟5. python基于socket模擬實(shí)現(xiàn)ssh遠(yuǎn)程執(zhí)行命令6. Django-migrate報(bào)錯(cuò)問(wèn)題解決方案7. JAVA上加密算法的實(shí)現(xiàn)用例8. 使用Python和百度語(yǔ)音識(shí)別生成視頻字幕的實(shí)現(xiàn)9. idea打開(kāi)多個(gè)窗口的操作方法10. ASP中解決“對(duì)象關(guān)閉時(shí),不允許操作。”的詭異問(wèn)題……
