使用pyzbar,opencv从图像文件夹解码条形码

时间:2019-04-26 22:21:17

标签: python opencv decode

此文件夹中有些图像包含一个或多个条形码。我的工作是对它们进行排序,并根据研究编号(在条形码中或条形码下方)对它们进行重命名。

有关此问题的更多信息: 我要提取特定的条形码。因为条形码有两种类型(带有研究编号或带有航空货运单编号)。

研究编号的长度为13个数字(它们总是始终个数字): 研究(6)+患者(4)+访问(3) 例: 123456 7890 123

例外不会添加到列表中,但是会与找到的相应文件名一起打印。

我想遍历文件夹中的所有项目并解码每个项目。

代码

from os import listdir
from os.path import isfile, join
import pyzbar.pyzbar as pyzbar
import cv2

mypath = '/Users/Eric/Desktop/test'

onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
onlyimg = []
barcode = []
notbarcode = []
for x in onlyfiles:
    im = join(mypath,x)
    onlyimg.append(im)


def decode(im) : 
  # Find barcodes and QR codes
  decodedObjects = pyzbar.decode(im)

  # Print results
  for obj in decodedObjects:
      try: 
          barcode.append(int(obj.data)) 
      except Exception as e:
          print(str(e))
          print(f)

#print('Type : ', obj.type)
#code = print('Number : ', obj.data,'\n')
#barcode.append(code)

  return decodedObjects 
# Main 
if __name__ == '__main__':

  # Read image
  for img in onlyimg:
      im = cv2.imread(img)

  decodedObjects = decode(im)

但是,使用此代码,它仅读取第一个图像并解码第一个图像。

我尝试运行以下代码以尝试遍历各个项目:

for img in glob.glob(folder + "*.jpg"):
      im = cv2.imread(img)

但是它没有帮助。

运行整个代码将导致:

invalid literal for int() with base 10: b'615X10394435'
2218400280901.jpg

打印列表条形码会导致:

print(barcodes)
[2218400280903, 2218400280901]

这两个结果很好,因为将用于重命名的结果是访问次数最小的结果,因此在本例中为2218400280901。

但是,该代码仅解码了第一张图像,并且没有遍历整个图像。是因为我没有在for循环中包含迭代吗?还是我明显看不到的错误在哪里?

谢谢大家的时间和帮助!

0 个答案:

没有答案