本项目使用Python和OpenCv实现身份证图片生成工具,填入信息,选择一张头像图片(即可生成黑白和彩色身份证图片)。可以选择是否自动抠图,自动抠图目前仅支持蓝色背景,对自动抠图效果不满意可以手动抠图。
在线抠图地址:
https://burner.bonanza.com/
https://www.gaoding.com/koutu
参照标准:
正面
“姓名”、“性别”、“民族”、“出生年月日”、“住址”、“公民身份号码”为6号黑体字,用蓝色油墨印刷;登记项目中的姓名项用5号黑体字印刷;其他项目则用小5号黑体字印刷;出生年月日 方正黑体简体字符大小:姓名+号码(11点)其他(9点)字符间距(AV):号码(50)字符行距:住址(12点);身份证号码字体 OCR-B 10 BT 文字 华文细黑。
背面
左上角为国徽,用红色油墨印刷;其右侧为证件名称“中华人民共和国居民身份证”,分上下两排排列,其中上排的“中华人民共和国”为4号宋体字,下排的“居民身份证”为2号宋体字;“签发机关”、“有效期限”为6号加粗黑体字;签发机关登记项采用,“xx市公安局”;有效期限采用“xxxx.xx-xxxx.xx.xx”格式,使用5号黑体字印刷,全部用黑色油墨印刷。
这里我用周杰伦的图像制作简单的身份证图片,效果图如下:
实现Demo如下:
# coding:utf-8 import os import PIL.Image as PImage from PIL import ImageFont, ImageDraw import cv2 import numpy as np try: from Tkinter import * from ttk import * from tkFileDialog import * from tkMessageBox import * except ImportError: from tkinter import * from tkinter.ttk import * from tkinter.filedialog import * from tkinter.messagebox import * if getattr(sys, 'frozen', None): base_dir = os.path.join(sys._MEIPASS, 'usedres') else: base_dir = os.path.join(os.path.dirname(__file__), 'usedres') def changeBackground(img, img_back, zoom_size, center): # 缩放 img = cv2.resize(img, zoom_size) rows, cols, channels = img.shape # 转换hsv hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 获取mask lower_blue = np.array([78, 43, 46]) upper_blue = np.array([110, 255, 255]) mask = cv2.inRange(hsv, lower_blue, upper_blue) # cv2.imshow('Mask', mask) # 腐蚀膨胀 erode = cv2.erode(mask, None, iterations=1) dilate = cv2.dilate(erode, None, iterations=1) # 粘贴 for i in range(rows): for j in range(cols): if dilate[i, j] == 0: # 0代表黑色的点 img_back[center[0] + i, center[1] + j] = img[i, j] # 此处替换颜色,为BGR通道 return img_back def paste(avatar, bg, zoom_size, center): avatar = cv2.resize(avatar, zoom_size) rows, cols, channels = avatar.shape for i in range(rows): for j in range(cols): bg[center[0] + i, center[1] + j] = avatar[i, j] return bg def generator(): global ename, esex, enation, eyear, emon, eday, eaddr, eidn, eorg, elife, ebgvar name = ename.get() sex = esex.get() nation = enation.get() year = eyear.get() mon = emon.get() day = eday.get() org = eorg.get() life = elife.get() addr = eaddr.get() idn = eidn.get() fname = askopenfilename(parent=root, initialdir=os.getcwd(), title=u'选择头像') # print fname im = PImage.open(os.path.join(base_dir, 'empty.png')) avatar = PImage.open(fname) # 500x670 name_font = ImageFont.truetype(os.path.join(base_dir, 'hei.ttf'), 72) other_font = ImageFont.truetype(os.path.join(base_dir, 'hei.ttf'), 60) bdate_font = ImageFont.truetype(os.path.join(base_dir, 'fzhei.ttf'), 60) id_font = ImageFont.truetype(os.path.join(base_dir, 'ocrb10bt.ttf'), 72) draw = ImageDraw.Draw(im) draw.text((630, 690), name, fill=(0, 0, 0), font=name_font) draw.text((630, 840), sex, fill=(0, 0, 0), font=other_font) draw.text((1030, 840), nation, fill=(0, 0, 0), font=other_font) draw.text((630, 980), year, fill=(0, 0, 0), font=bdate_font) draw.text((950, 980), mon, fill=(0, 0, 0), font=bdate_font) draw.text((1150, 980), day, fill=(0, 0, 0), font=bdate_font) start = 0 loc = 1120 while start + 11 < len(addr): draw.text((630, loc), addr[start:start + 11], fill=(0, 0, 0), font=other_font) start += 11 loc += 100 draw.text((630, loc), addr[start:], fill=(0, 0, 0), font=other_font) draw.text((950, 1475), idn, fill=(0, 0, 0), font=id_font) draw.text((1050, 2750), org, fill=(0, 0, 0), font=other_font) draw.text((1050, 2895), life, fill=(0, 0, 0), font=other_font) avatar = cv2.cvtColor(np.asarray(avatar), cv2.COLOR_RGB2BGR) im = cv2.cvtColor(np.asarray(im), cv2.COLOR_RGB2BGR) if ebgvar.get(): im = changeBackground(avatar, im, (500, 670), (690, 1500)) else: #im.paste(avatar, (1500, 690), mask=avatar) im = paste(avatar, im, (500, 670), (690, 1500)) im = PImage.fromarray(cv2.cvtColor(im, cv2.COLOR_BGR2RGB)) im.save('color.png') im.convert('L').save('bw.png') showinfo(u'成功', u'文件已生成到目录下,黑白bw.png和彩色color.png') if __name__ == '__main__': global ename, esex, enation, eyear, emon, eday, eaddr, eidn, eorg, elife, ebgvar root = Tk() root.title(u'AIRobot身份证图片生成器') # root.geometry('640x480') root.resizable(width=False, height=False) Label(root, text=u'姓名:').grid(row=0, column=0, sticky=W, padx=3, pady=3) ename = Entry(root, width=8) ename.grid(row=0, column=1, sticky=W, padx=3, pady=3) Label(root, text=u'性别:').grid(row=0, column=2, sticky=W, padx=3, pady=3) esex = Entry(root, width=8) esex.grid(row=0, column=3, sticky=W, padx=3, pady=3) Label(root, text=u'民族:').grid(row=0, column=4, sticky=W, padx=3, pady=3) enation = Entry(root, width=8) enation.grid(row=0, column=5, sticky=W, padx=3, pady=3) Label(root, text=u'出生年:').grid(row=1, column=0, sticky=W, padx=3, pady=3) eyear = Entry(root, width=8) eyear.grid(row=1, column=1, sticky=W, padx=3, pady=3) Label(root, text=u'月:').grid(row=1, column=2, sticky=W, padx=3, pady=3) emon = Entry(root, width=8) emon.grid(row=1, column=3, sticky=W, padx=3, pady=3) Label(root, text=u'日:').grid(row=1, column=4, sticky=W, padx=3, pady=3) eday = Entry(root, width=8) eday.grid(row=1, column=5, sticky=W, padx=3, pady=3) Label(root, text=u'住址:').grid(row=2, column=0, sticky=W, padx=3, pady=3) eaddr = Entry(root, width=32) eaddr.grid(row=2, column=1, sticky=W, padx=3, pady=3, columnspan=5) Label(root, text=u'证件号码:').grid(row=3, column=0, sticky=W, padx=3, pady=3) eidn = Entry(root, width=32) eidn.grid(row=3, column=1, sticky=W, padx=3, pady=3, columnspan=5) Label(root, text=u'签发机关:').grid(row=4, column=0, sticky=W, padx=3, pady=3) eorg = Entry(root, width=32) eorg.grid(row=4, column=1, sticky=W, padx=3, pady=3, columnspan=5) Label(root, text=u'有效期限:').grid(row=5, column=0, sticky=W, padx=3, pady=3) elife = Entry(root, width=32) elife.grid(row=5, column=1, sticky=W, padx=3, pady=3, columnspan=5) Label(root, text=u'选项:').grid(row=6, column=0, sticky=W, padx=3, pady=3) ebgvar = IntVar() ebg = Checkbutton(root, text=u'自动抠图', variable=ebgvar) ebg.grid(row=6, column=1, sticky=W, padx=3, pady=3, columnspan=5) Button(root, text=u'生成', width=32, command=generator).grid(row=7, column=1, sticky=W, padx=3, pady=3, columnspan=4) # root.iconbitmap(os.path.join(base_dir, 'ico.ico')) root.mainloop()
之前上传代码使用项目命名:“Python+OpenCv制作身份证图片生成器代码”,额、但是官方宣布违规禁止上传,所示将项目名称修改的不是那么明显,感兴趣的小伙伴可以下载运行:
http://xiazai.jb51.net/201908/yuanma/xiangmu_code_jb51.rar
当然为了方便操作,也可以使用pyinstaller模块自己打包成应用程序,首先需要使用命令安装pyinstaller模块:
pip install pyinstaller
Mac打包(打包成Mac app尚有问题未解决)
pyinstaller -i usedres/ico.icns --windowed --clean --noconfirm --onefile --add-data ./usedres:./usedres idcardgenerator.py
Windows打包
pyinstaller -i usedres/ico.ico --windowed --clean --noconfirm --onefile --add-data usedres;usedres idcardgenerator.py
总结
以上所述是小编给大家介绍的Python+OpenCv制作证件图片生成器的操作方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 雨林唱片《赏》新曲+精选集SACD版[ISO][2.3G]
- 罗大佑与OK男女合唱团.1995-再会吧!素兰【音乐工厂】【WAV+CUE】
- 草蜢.1993-宝贝对不起(国)【宝丽金】【WAV+CUE】
- 杨培安.2009-抒·情(EP)【擎天娱乐】【WAV+CUE】
- 周慧敏《EndlessDream》[WAV+CUE]
- 彭芳《纯色角3》2007[WAV+CUE]
- 江志丰2008-今生为你[豪记][WAV+CUE]
- 罗大佑1994《恋曲2000》音乐工厂[WAV+CUE][1G]
- 群星《一首歌一个故事》赵英俊某些作品重唱企划[FLAC分轨][1G]
- 群星《网易云英文歌曲播放量TOP100》[MP3][1G]
- 方大同.2024-梦想家TheDreamer【赋音乐】【FLAC分轨】
- 李慧珍.2007-爱死了【华谊兄弟】【WAV+CUE】
- 王大文.2019-国际太空站【环球】【FLAC分轨】
- 群星《2022超好听的十倍音质网络歌曲(163)》U盘音乐[WAV分轨][1.1G]
- 童丽《啼笑姻缘》头版限量编号24K金碟[低速原抓WAV+CUE][1.1G]