2016-06-29 6 views
1

My QR codeKann nicht QR-Code scannen zbar mit

Wenn ich meinen Code ausführen ich bin immer „[]“ als Ausgabe erhalten, was bedeutet, dass Zbar den QR nicht lesen können ... Es ist etwas falsch mit meiner Bildformat? Ich kann nicht herausfinden, warum das nicht funktioniert.

Mein Code:

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) 

Antwort

0

nicht sicher, was das eigentliche Problem ist, aber ich konnte diese Arbeit mit Pil bekommen (oder Kissen) statt 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) 

Auch dies nicht mit allen QR-Codes funktionierte ich versucht, aber hier war eine, die Arbeit haben:

http://media.techtarget.com/rms/misc/qr_code_barcode.jpg 

working qr code for above

+0

Danke, aber ich arbeite mit Video-Stream , also muss ich das mit cv2 – abea

+0

@abea beheben das ist fair, aber vielleicht versuchen Sie mit einem QR, das mit Pil (niedrig) zuerst funktioniert, so dass Sie wissen, dass Sie Ergebnisse erhalten sollten. Ich habe versucht, mit mehreren Bildern über Google QR-Bild-Probe zu googlen und die ersten 2 oder 3 hat überhaupt nicht funktioniert. – sberry