亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

預處理圖像以在 python 中進行 QR 檢測

預處理圖像以在 python 中進行 QR 檢測

桃花長相依 2022-10-25 14:45:28
我使用 Zbar 和 OpenCV 讀取下圖中的二維碼,但都未能檢測到它。對于 ZBar,我使用 pyzbar 庫作為 python 包裝器。有些圖像 QR 被正確檢測到,有些圖像與成功的圖像非常相似但失敗了。我的手機攝像頭可以讀取上傳圖像中的二維碼,這意味著它是有效的。下面是代碼片段:from pyzbar.pyzbar import decodefrom pyzbar.pyzbar import ZBarSymbolimport cv2# zbar    results = decode(cv2.imread(image_path), symbols=[ZBarSymbol.QRCODE])print(results) # opencvqr_decoder = cv2.QRCodeDetector()data, bbox, rectified_image = qr_decoder.detectAndDecode(cv2.imread(image_path))print(data, bbox)什么樣的預處理有助于提高二維碼檢測的成功率?
查看完整描述

2 回答

?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

zbar,它做了一些預處理,沒有檢測到二維碼,你可以測試運行zbarimg image.jpg

好的二值化在這里很有用。我使用kraken.binarization.nlbin()Kraken 庫的功能讓它工作。該庫適用于 OCR,但也適用于 QR 碼,通過使用非線性處理。Kraken 二值化代碼在這里。

這是示例的代碼:

from kraken import binarization

from PIL import Image

from pyzbar.pyzbar import decode

from pyzbar.pyzbar import ZBarSymbol


image_path = "image.jpg"

# binarization using kraken

im = Image.open(image_path)

bw_im = binarization.nlbin(im)

# zbar

decode(bw_im, symbols=[ZBarSymbol.QRCODE])

[Decoded(data=b'DE-AAA002065', type='QRCODE', rect=Rect(left=1429, top=361, width=300, height=306), polygon=[Point(x=1429, y=361), Point(x=1429, y=667), Point(x=1729, y=667), Point(x=1723, y=365)])]

下圖為二維碼后二維碼的清晰圖像:

http://img1.sycdn.imooc.com//63578649000166ea06540363.jpg

查看完整回答
反對 回復 2022-10-25
?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

我有一個類似的問題,Seanpue 的回答讓我走上了解決這個問題的正確軌道。由于我已經在使用 OpenCV 庫而不是 PIL 進行圖像處理,因此我使用OpenCV 教程中關于 Image Thresholding的說明來執行 Otsu 的二值化。這是我的代碼:


import cv2

from pyzbar.pyzbar import decode

from pyzbar.pyzbar import ZBarSymbol


image_path = "qr.jpg"

# preprocessing using opencv

im = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)

blur = cv2.GaussianBlur(im, (5, 5), 0)

ret, bw_im = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

# zbar

decode(bw_im, symbols=[ZBarSymbol.QRCODE])

[Decoded(data=b'DE-AAA002065', type='QRCODE', rect=Rect(left=1429, top=362, width=300, height=305), polygon=[Point(x=1429, y=362), Point(x=1430, y=667), Point(x=1729, y=667), Point(x=1724, y=366)])]

應用高斯模糊應該可以去除圖片中的噪點,以使二值化更有效,但對于我的應用程序來說,它實際上并沒有太大的區別。至關重要的是將圖像轉換為灰度以使閾值函數起作用(在此處通過打開帶有cv2.IMREAD_GRAYSCALE標志的文件來完成)。


查看完整回答
反對 回復 2022-10-25
  • 2 回答
  • 0 關注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號