Python+OpenCv制作证件图片生成器的操作方法

本项目使用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制作身份证图片生成器代码”,额、但是官方宣布违规禁止上传,所示将项目名称修改的不是那么明显,感兴趣的小伙伴可以下载运行:https://download.csdn.net/download/m0_38106923/11033615

当然为了方便操作,也可以使用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制作证件图片生成器的操作方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

(0)

相关推荐

  • python3基于OpenCV实现证件照背景替换

    本文实例为大家分享了python3实现证件照背景替换的具体代码,供大家参考,具体内容如下 import cv2 import numpy as np img=cv2.imread('zjz.jpg') #缩放 rows,cols,channels = img.shape img=cv2.resize(img,None,fx=0.5,fy=0.5) rows,cols,channels = img.shape cv2.imshow('img',img) #转换hsv hsv=cv2.cvtColo

  • 基于OpenCV python3实现证件照换背景的方法

    简述 生活中经常要用到各种要求的证件照电子版,红底,蓝底,白底等,大部分情况我们只有其中一种,所以通过技术手段进行合成,用ps处理证件照,由于技术不到位,有瑕疵,所以想用python&openCV通过代码的方式实现背景颜色替换,加强一下对于openCV的学习,锻炼一下编码水平. 软件环境: python3.5 opencv2 windows 10 图像载入 导入opencv库,使用imread函数读取图片 import cv2 import numpy as np img=cv2.imread(

  • python opencv实现证件照换底功能

    本文实例为大家分享了python opencv实现证件照换底功能的具体代码,供大家参考,具体内容如下 思路:先转到HSV空间,利用颜色提取背景制作掩模版mask,然后通过按位操作提取人像和制作新背景,最后叠加背景和人像得到换底后照片 代码 #-*-coding:utf-8-*- import cv2 import numpy as np def cvtBackground(path,color): """ 功能:给证件照更换背景色(常用背景色红.白.蓝) 输入参数:path:

  • Python+OpenCv制作证件图片生成器的操作方法

    本项目使用Python和OpenCv实现身份证图片生成工具,填入信息,选择一张头像图片(即可生成黑白和彩色身份证图片).可以选择是否自动抠图,自动抠图目前仅支持蓝色背景,对自动抠图效果不满意可以手动抠图. 在线抠图地址: https://burner.bonanza.com/ https://www.gaoding.com/koutu 参照标准: 正面 "姓名"."性别"."民族"."出生年月日"."住址"

  • 解决python opencv无法显示图片的问题

    结合网上解决方法,总结了一下 注意三点: 1.文件名或路径名开头如果会引起转义,则\要替换为\\ 2.文件不能放在桌面,因为读取时按中文路径 3.运行后未响应,原因还没有查明,在下一行 cv.waitKey(0)解决 import cv2 as cv img = cv.imread("D:\\python_file\ae.jpg") cv.imshow("image",img) #cv.waitKey(0) 以上这篇解决python opencv无法显示图片的问题就

  • python opencv将表格图片按照表格框线分割和识别

    如下小程序为使用python+opencv将表格图片,按照表格进行分割,并识别分割后的子图片中的文字,希望对需要的小伙伴有一些些帮助.具体的实现见如下代码. # -*- coding: utf-8 -*- """ Created on Tue May 28 19:23:19 2019 将图片按照表格框线交叉点分割成子图片(传入图片路径) @author: hx """ import cv2 import numpy as np import py

  • python opencv如何实现图片绘制

    这篇文章主要介绍了python opencv如何实现图片绘制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 点和圆 : circle(img,center,radius,color,thickness=None,lineType=None,shift=None).各参数意义及作用如下. img:待画圆所在的图像. center:待画圆的圆心坐标. radius:待画圆的半径. color:待画圆的边框颜色,颜色格式为bgr格式.就是通道值 th

  • Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头

    一. 打印图片属性.设置图片存储路径 代码如下: #打印图片的属性.保存图片位置 import cv2 as cv import numpy as np #numpy是一个开源的Python科学计算库 def get_image_info(image): print(type(image)) #type() 函数如果只有第一个参数则返回对象的类型 在这里函数显示图片类型为 numpy类型的数组 print(image.shape) #图像矩阵的shape属性表示图像的大小,shape会返回tup

  • Python+Opencv实现把图片、视频互转的示例

    1. 安装Opencv包 pip install opvencv-python 2.实现代码: 视频转为图片: import cv2 cap=cv2.VideoCapture('E:/video/video-02.mp4') # 获取一个视频打开cap isOpened=cap.isOpened # 判断是否打开 print(isOpened) fps=cap.get(cv2.CAP_PROP_FPS) print(fps) # 获取宽度 width=int(cap.get(cv2.CAP_PR

  • 详解Python+opencv裁剪/截取图片的几种方式

    前言 在计算机视觉任务中,如图像分类,图像数据集必不可少.自己采集的图片往往存在很多噪声或无用信息会影响模型训练.因此,需要对图片进行裁剪处理,以防止图片边缘无用信息对模型造成影响.本文介绍几种图片裁剪的方式,供大家参考. 一.手动单张裁剪/截取 selectROI:选择感兴趣区域,边界框框选x,y,w,h selectROI(windowName, img, showCrosshair=None, fromCenter=None): . 参数windowName:选择的区域被显示在的窗口的名字

  • Python OpenCV实现传统图片格式与base64转换

    Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,是一种基于64个可打印字符来表示二进制数据的方法.通过http传输图片常常将图片数据转换成base64之后再进行传输. Base64简介 Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法.可查看RFC2045-RFC2049,上面有MIME的详细规范. Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息.例如,在Java

  • 基于Python+OpenCV制作屏幕录制工具

    目录 应用平台 屏幕录制部分 计算视频最优fps及使用numpy计算中间帧数组 使用pynput监听键盘按键 如何保存MP4格式视频 源码 总结 最近有在使用屏幕录制软件录制桌面,在用的过程中突发奇想,使用python能不能做屏幕录制工具,也锻炼下自己的动手能力.接下准备写使用python如何做屏幕录制工具的系列文章: 录制屏幕制作视频 录制音频 合成视频,音频 基于pyqt5制作可视化窗口 大概上述四个部分,希望自己能够尽快完善,接下来开始使用python制作屏幕录制部分. 应用平台 wind

  • Python+PyQt5制作一个图片查看器

    目录 前言 实现方式 测试 前言 在 PyQt 中可以使用很多方式实现照片查看器,最朴素的做法就是重写 QWidget 的 paintEvent().mouseMoveEvent 等事件,但是如果要在图像上多添加一些形状,那么在对图像进行缩放旋转等仿射变换时需要对这些形状也这些变换,虽然不难,但是从头实现这些变换还有形状还是挺讨厌的.好在 Qt 提供了图形视图框架,关于这个框架的基本使用可以参见 深入了解PyQt5中的图形视图框架,下面进入正题. 实现方式 一个最基本的照片查看器应该具有以下功能

随机推荐