项目实战—Credit Card 数字识别
之前在进阶篇我们已经讨论过OpenCV的模板匹配,本次我们可以将其用于Credit Card数字识别,当然这是最简单的也是最直接的方法,后面我们也会介绍到OCR识别,但本次我们暂不涉及。
准备工作
argparse用法
使用argparse模块创建一个ArgumentParser解析对象,可以理解成一个容器,将包含将命令行解析为Python数据类型所需的所有信息。parse_args()是将之前add_argument()定义的参数进行赋值,并返回相关的namespace:
import argparse parser = argparse.ArgumentParser() # # 括号少了会报错AttributeError: 'str' object has no attribute 'prefix_chars' parser.add_argument("-i", "--image", required=True, help="path to input image") # -i可以理解为标签,--image既可以是标签又是属性 parser.add_argument("-t", "--template", required=True, help="path to template OCR-A image") args = vars(parser.parse_args()) # print(args["image"]) # args为字典{'image': 'images/credit_card_01.png', 'template': 'images/ocr_a_reference.png'} args = parser.parse_args() # print(args.image) # Namespace(image='images/credit_card_01.png', template='images/ocr_a_reference.png')
# -t 和 --train两种情况,在bat文件和pycharm配置种注意区分前面的两个--还是一个-
pycharm下可以通过argparse模块完成参数设置,即生成全局变量。
zip 与 zip*用法
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。(个人理解,将两组元素,分别各成元元组组合成一个列表)
zip 方法在 Python 2 和 Python 3 中的不同:在 Python 3.x 中为了减少内存,zip()返回的是一个对象。如需展示列表,需手动 list() 转换。
sorted用法
基础用法:
传进去一个可迭代的数据,返回一个新的列表,按照从小到大排序,注意,是新的列表!
a = [1, 4, 6, 8, 9, 3, 5] b = "aghdb" sorted(a) # print(a)不变,返回sorted(g)变; [1, 3, 4, 5, 6, 8, 9] sorted(b) # 返回['a', 'b', 'd', 'g', 'h'] sorted(a, reverse=True) # 逆序排序; [9, 8, 6, 5, 4, 3, 1]
高级用法:
列表里面的每一个元素都为二维元组,key参数传入了一个lambda函数表达式,其x就代表列表里的每一个元素,然后分别利用索引返回元素内的第一个和第二个元素,这就代表了sorted()函数根据哪一个元素进行排列。reverse参数起逆排的作用,默认为False,从小到大顺序。
c = [("a", 1), ("e", 2), ("c", 4)] print(sorted(c, key=lambda x: x[0])) print(sorted(c, key=lambda x: x[1])) print(sorted(c, key=lambda x: x[0], reverse=True))
items()用法
D.items():
Python 字典 items() 方法,以列表形式返回可遍历的(键, 值) 元组数组,(并非直接的列表,若要返回列表值还需调用list函数)。
D = {'Google': 'www.google.com', 'Runoob': 'www.runoob.com', 'taobao': 'www.taobao.com'} print(D.items()) print(list(D.items())) # 遍历字典列表 for key, value in D.items(): print(key, value) # dict_items([('Google', 'www.google.com'), ('Runoob', 'www.runoob.com'), ('taobao', 'www.taobao.com')]) # [('Google', 'www.google.com'), ('Runoob', 'www.runoob.com'), ('taobao', 'www.taobao.com')] # Google www.google.com Runoob www.runoob.com taobao www.taobao.com
join()用法
join()方法——用于将序列中的元素以指定的字符连接生成一个新的字符串
join()方法语法:str.join(sequence),sequence为要连接的元素序列。
str = "-" seq = ("a", "b", "c") # 字符串序列 # c = [1, 2, 3] 数字不行,变成# c = ["1", "2", "3"] print(str.join(seq)) # 输出结果为a-b-c # print("-".join(seq)) 直接这样写也行 # print(“”.join(seq)) 输出结果为abc
extend()用法
extend() 函数用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)。
extend()方法语法:list.extend(seq)
a = [1, "a", "ad", "fd"] b = ["d", "d", "d"] a.extend(b) # 注意这个函数没有返回值,直接在a上面变化。 print(a) a1 = [] a1.extend(a) print(a1)
format用法
一种格式化字符串的函数 str.format()
format 函数可以接受不限个参数,位置可以不按顺序。
print("hello:{}{}".format("111", "222")) # hello:111222 print("hello:{1}{0}".format("111", "222")) # hello:222111可以改变顺序 print("hello:{name},{age}".format(name="111", age="222")) # hello:111,222可以设置参数 print("{:.2f}".format(3.123222)) # 3.12
接下来为OpenCV的准备工作,我们将其与实战部分放在一起。