本項目使用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制作證件圖片生成器的操作方法,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

