当我运行我的代码时,我总是得到“[]”作为输出,这意味着 Zbar 无法读取 QR...我的图像格式有问题吗?我不明白为什么这不起作用。
我的代码:
import numpy as np
import cv2
import zbar
import sys
class ImageSource(object):
def __init__(self,source):
self.is_camera = type(source)==int
if self.is_camera:
self.source = cv2.VideoCapture(source)
else:
self.source = cv2.imread(source,1)
def get_size(self):
if self.is_camera:
return (int(self.source.get(3)),int(self.source.get(4)))
else:
return (self.source.shape[1],self.source.shape[0])
def get_next(self):
if self.is_camera:
return self.source.read()[1]
else:
return self.source
def release(self):
if self.is_camera:
self.source.release()
class QRScanner(object):
def __init__(self, width, height):
self.scanner = zbar.ImageScanner()
self.scanner.parse_config('enable')
self.width = width
self.height = height
def get_qrcodes(self, image):
zbar_img = self.cv2_to_zbar_image(image)
self.scanner.scan(zbar_img)
result=[]
for symbol in zbar_img:
if symbol.type!=zbar.Symbol.QRCODE: continue
fixed_data = symbol.data.decode("utf8").encode("shift_jis").decode("utf8")
result.append(QRCode(fixed_data,symbol.location))
del(zbar_img)
return result
def cv2_to_zbar_image(self, cv2_image):
return zbar.Image(self.width, self.height, 'Y800',cv2_image.tostring())
cap = ImageSource("1.png")
frame = cap.get_next()
scanner = QRScanner(cap.get_size()[0],cap.get_size()[1])
print scanner.get_qrcodes(frame)
最佳答案
不确定实际问题是什么,但我能够使用 Pil(或 Pillow)而不是 cv2 来解决这个问题。
import cv2
import Image
import zbar
import sys
class ImageSource(object):
def __init__(self,source):
self.is_camera = type(source)==int
if self.is_camera:
self.source = cv2.VideoCapture(source)
else:
self.source = cv2.imread(source,1)
def get_size(self):
if self.is_camera:
return (int(self.source.get(3)),int(self.source.get(4)))
else:
return (self.source.shape[1],self.source.shape[0])
def get_next(self):
if self.is_camera:
return self.source.read()[1]
else:
return self.source
def release(self):
if self.is_camera:
self.source.release()
class QRScanner(object):
def __init__(self, width, height):
self.scanner = zbar.ImageScanner()
self.scanner.parse_config('enable')
self.width = width
self.height = height
def get_qrcodes(self, image):
zbar_img = self.cv2_to_zbar_image(image)
self.scanner.scan(zbar_img)
result=[]
for symbol in zbar_img:
if symbol.type!=zbar.Symbol.QRCODE: continue
fixed_data = symbol.data.decode("utf8").encode("shift_jis").decode("utf8")
result.append((fixed_data,symbol.location))
del(zbar_img)
return result
def cv2_to_zbar_image(self, cv2_image):
return zbar.Image(self.width, self.height, 'Y800',cv2_image.tostring())
pil = Image.open(sys.argv[1]).convert('L')
width, height = pil.size
scanner = QRScanner(width,height)
print scanner.get_qrcodes(pil)
此外,这不适用于我尝试过的所有 QR 码,但这里有一个确实有效:
http://media.techtarget.com/rms/misc/qr_code_barcode.jpg
关于python - 无法使用 zbar 扫描二维码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38110888/