欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python+OpenCv制作證件圖片生成器的操作方法

 更新時(shí)間:2019年08月21日 11:34:37   作者:不脫發(fā)的程序猿  
這篇文章主要介紹了Python+OpenCv制作證件圖片生成器的操作方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

本項(xiàng)目使用Python和OpenCv實(shí)現(xiàn)身份證圖片生成工具,填入信息,選擇一張頭像圖片(即可生成黑白和彩色身份證圖片)??梢赃x擇是否自動(dòng)摳圖,自動(dòng)摳圖目前僅支持藍(lán)色背景,對(duì)自動(dòng)摳圖效果不滿意可以手動(dòng)摳圖。

在線摳圖地址:

https://burner.bonanza.com/

https://www.gaoding.com/koutu

參照標(biāo)準(zhǔn):

正面

  “姓名”、“性別”、“民族”、“出生年月日”、“住址”、“公民身份號(hào)碼”為6號(hào)黑體字,用藍(lán)色油墨印刷;登記項(xiàng)目中的姓名項(xiàng)用5號(hào)黑體字印刷;其他項(xiàng)目則用小5號(hào)黑體字印刷;出生年月日 方正黑體簡(jiǎn)體字符大?。盒彰?hào)碼(11點(diǎn))其他(9點(diǎn))字符間距(AV):號(hào)碼(50)字符行距:住址(12點(diǎn));身份證號(hào)碼字體 OCR-B 10 BT 文字 華文細(xì)黑。

背面

  左上角為國(guó)徽,用紅色油墨印刷;其右側(cè)為證件名稱“中華人民共和國(guó)居民身份證”,分上下兩排排列,其中上排的“中華人民共和國(guó)”為4號(hào)宋體字,下排的“居民身份證”為2號(hào)宋體字;“簽發(fā)機(jī)關(guān)”、“有效期限”為6號(hào)加粗黑體字;簽發(fā)機(jī)關(guān)登記項(xiàng)采用,“xx市公安局”;有效期限采用“xxxx.xx-xxxx.xx.xx”格式,使用5號(hào)黑體字印刷,全部用黑色油墨印刷。

這里我用周杰倫的圖像制作簡(jiǎn)單的身份證圖片,效果圖如下:

實(shí)現(xiàn)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
 # 轉(zhuǎn)換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代表黑色的點(diǎn)
    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'證件號(hào)碼:').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'簽發(fā)機(jī)關(guān):').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'選項(xiàng):').grid(row=6, column=0, sticky=W, padx=3, pady=3)
 ebgvar = IntVar()
 ebg = Checkbutton(root, text=u'自動(dòng)摳圖', 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()

 之前上傳代碼使用項(xiàng)目命名:“Python+OpenCv制作身份證圖片生成器代碼”,額、但是官方宣布違規(guī)禁止上傳,所示將項(xiàng)目名稱修改的不是那么明顯,感興趣的小伙伴可以下載運(yùn)行:

http://xiazai.jb51.net/201908/yuanma/xiangmu_code_jb51.rar

當(dāng)然為了方便操作,也可以使用pyinstaller模塊自己打包成應(yīng)用程序,首先需要使用命令安裝pyinstaller模塊:

pip install pyinstaller

Mac打包(打包成Mac app尚有問(wèn)題未解決)

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

總結(jié)

以上所述是小編給大家介紹的Python+OpenCv制作證件圖片生成器的操作方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!

相關(guān)文章

  • Python退火算法在高次方程的應(yīng)用

    Python退火算法在高次方程的應(yīng)用

    退火算法就是鋼鐵在淬煉過(guò)程中失溫而成穩(wěn)定態(tài)時(shí)的過(guò)程,熱力學(xué)上溫度(內(nèi)能)越高原子態(tài)越不穩(wěn)定。這篇文章主要介紹了Python退火算法在高次方程的應(yīng)用,需要的朋友可以參考下
    2018-07-07
  • Python爬蟲(chóng)入門(mén)案例之爬取去哪兒旅游景點(diǎn)攻略以及可視化分析

    Python爬蟲(chóng)入門(mén)案例之爬取去哪兒旅游景點(diǎn)攻略以及可視化分析

    讀萬(wàn)卷書(shū)不如行萬(wàn)里路,學(xué)的扎不扎實(shí)要通過(guò)實(shí)戰(zhàn)才能看出來(lái),本篇文章手把手帶你爬取去哪兒平臺(tái)的旅游景點(diǎn)攻略并進(jìn)行可視化分析,大家可以在過(guò)程中查缺補(bǔ)漏,看看自己掌握程度怎么樣
    2021-10-10
  • 使用Python爬了4400條淘寶商品數(shù)據(jù),竟發(fā)現(xiàn)了這些“潛規(guī)則”

    使用Python爬了4400條淘寶商品數(shù)據(jù),竟發(fā)現(xiàn)了這些“潛規(guī)則”

    這篇文章主要介紹了使用Python爬了4400條淘寶商品數(shù)據(jù),竟發(fā)現(xiàn)了這些“潛規(guī)則”,筆者用 Python 爬取淘寶某商品的全過(guò)程,并對(duì)商品數(shù)據(jù)進(jìn)行了挖掘與分析,最終得出結(jié)論。需要的朋友可以參考下
    2018-03-03
  • 解決Django部署設(shè)置Debug=False時(shí)xadmin后臺(tái)管理系統(tǒng)樣式丟失

    解決Django部署設(shè)置Debug=False時(shí)xadmin后臺(tái)管理系統(tǒng)樣式丟失

    這篇文章主要介紹了解決Django部署設(shè)置Debug=False時(shí)xadmin后臺(tái)管理系統(tǒng)樣式丟失的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • 三分鐘熟練使用Python的os.path.join()

    三分鐘熟練使用Python的os.path.join()

    在Python中os.path.join()函數(shù)用于將多個(gè)路徑組合成一個(gè)路徑,下面這篇文章主要給大家介紹了關(guān)于熟練使用Python的os.path.join()的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • Django中FilePathField字段的用法

    Django中FilePathField字段的用法

    這篇文章主要介紹了Django中FilePathField字段的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-05-05
  • 用python刪除java文件頭上版權(quán)信息的方法

    用python刪除java文件頭上版權(quán)信息的方法

    在使用他人代碼時(shí),為不保留文件頭部版權(quán)信息,需要一個(gè)個(gè)刪掉,下面是用python刪除java文件頭上的版權(quán)信息的方法
    2014-07-07
  • selenium設(shè)置proxy、headers的方法(phantomjs、Chrome、Firefox)

    selenium設(shè)置proxy、headers的方法(phantomjs、Chrome、Firefox)

    這篇文章主要介紹了selenium設(shè)置proxy、headers的方法(phantomjs、Chrome、Firefox),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • python 竊取攝像頭照片的實(shí)現(xiàn)示例

    python 竊取攝像頭照片的實(shí)現(xiàn)示例

    這篇文章主要介紹了python:竊取攝像頭照片的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Python實(shí)例方法、類方法、靜態(tài)方法區(qū)別詳解

    Python實(shí)例方法、類方法、靜態(tài)方法區(qū)別詳解

    這篇文章主要介紹了Python實(shí)例方法、類方法、靜態(tài)方法區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09

最新評(píng)論