golang识别身份证号

article/2025/1/14 1:09:49

使用go做身份证号码识别

1.本实例主要是学习使用image库
2.实现思路:
(1).获取图片
(2).对图片指定区域进行裁剪
(3).将图片进行二值化,使用黑白两色作为区分
(4).去掉图片无用的边缘
(5).将数字进行裁剪为一张一张的小图片
(6).将图片使用0和1来进行数据化
(7).使用提前准备的指纹库进行数据相似度对比

实例图片请添加图片描述

实现代码

package mainimport ("fmt""github.com/nfnt/resize""image""image/color""image/draw""image/jpeg""os""strconv""strings"
)// 指纹验证
var numSign = map[int]string{0: "0011111001111111111000111100000111000001110000010111111100111110",1: "0000000000110000001000000110000001100000011111111111111111111111",2: "0110001101100011110001111100010111001101110110010111100100110000",4: "0000010000001110000111100011011001100110111111110111111100000110",6: "0011111001111111010110011101000111010001110110010100111101001110",8: "0000011001111111011111011101100111011001110110010111111101110111",
}// 读取图片
func main() {//  打开图片imgFile, err := os.Open("./img/idcard.jpeg")if err != nil {panic(fmt.Sprintf("打开文件失败:%+v", err))}defer imgFile.Close()// 解析图片img, err := jpeg.Decode(imgFile)if err != nil {panic(fmt.Sprintf("解析图片失败:%+v", err))}locImg := imgLocation(img)binImg := imgBinarzation(locImg)imgCutSide := imgCutSide(binImg)imgCutSilce := imgCutSilce(imgCutSide)//imgView(imgCutSilce...)imgNum := imgDiscern(imgCutSilce)fmt.Println(imgNum)
}// 指纹验证
func imgSign(imgBinary string) string {if imgBinary == "" {return imgBinary}imgBinarySign := strings.Split(imgBinary, "")// 相似度maxSimilarity := 0num := ""for n, sign := range numSign {tmpSimilarity := 0signArr := strings.Split(sign, "")for k, s := range imgBinarySign {if s == signArr[k] {tmpSimilarity++}}if maxSimilarity < tmpSimilarity {maxSimilarity = tmpSimilaritynum = strconv.Itoa(n)}}return num
}// 图片识别 将图片转换为01的数据 进行验证
func imgDiscern(imgs []image.Image) string {signNum := make([]string, 0)for _, img := range imgs {tmpSignNum := make([]string, 0)rect := img.Bounds()for x := 0; x < rect.Dx(); x++ {for y := 0; y < rect.Dy(); y++ {// 获取颜色r, _, _, _ := img.At(x, y).RGBA()if r > 0x7788 {tmpSignNum = append(tmpSignNum, "1")} else {tmpSignNum = append(tmpSignNum, "0")}}}signNum = append(signNum, strings.Join(tmpSignNum, ""))}res := make([]string, 0)for _, v := range signNum {res = append(res, imgSign(v))}return strings.Join(res, "")
}// 图片切片 判断是否白色结束 黑色开始
func imgCutSilce(img image.Image) []image.Image {rect := img.Bounds()imgs := make([]image.Image, 0)// 记录当前x的位置nowCutStartX := 0nowCutEndX := 0for x := 0; x <= rect.Dx(); x++ {lxflag := truefor y := 0; y < rect.Dy(); y++ {// 获取颜色r, _, _, _ := img.At(x, y).RGBA()if r == 0x0000 {continue} else {// 读取到最新一个白点作为截取结束x坐标nowCutEndX = xlxflag = falsebreak}}if lxflag {// 当读取到x轴只有黑色时, 并且读取到白色为当前黑色前一个像素 则做处理if nowCutEndX == x-1 {// 创建新的图片rectangle := image.Rectangle{Min: image.Point{X: 0, Y: 0},Max: image.Point{X: x - nowCutStartX, Y: rect.Dy()},}newImg := image.NewGray(rectangle)draw.Draw(newImg, newImg.Bounds(), img, image.Point{X: nowCutStartX, Y: 0}, draw.Over)newResizeImg := resize.Resize(8, 8, newImg, resize.Lanczos3)imgs = append(imgs, newResizeImg)} else {// 记录x轴截取开始位置nowCutStartX = x + 1}}}return imgs
}// 删除边 判断边缘是否为白色
func imgCutSide(img image.Image) image.Image {rect := img.Bounds()// 开始x坐标leftStartX := 0for x := 0; x < rect.Dx(); x++ {lxflag := falsefor y := 0; y < rect.Dy(); y++ {// 获取颜色r, _, _, _ := img.At(x, y).RGBA()if r == 0xFFFF {lxflag = truebreak}}if lxflag {leftStartX = xbreak}}// 开始y坐标leftStartY := 0for y := 0; y < rect.Dy(); y++ {lyflag := falsefor x := 0; x < rect.Dx(); x++ {// 获取颜色r, _, _, _ := img.At(x, y).RGBA()if r == 0xFFFF {lyflag = truebreak}}if lyflag {leftStartY = ybreak}}// 结束x坐标rightEndX := 0for x := rect.Dx(); x > 0; x-- {rxflag := falsefor y := rect.Dy(); y > 0; y-- {// 获取颜色r, _, _, _ := img.At(x, y).RGBA()if r == 0xFFFF {rxflag = truebreak}}if rxflag {rightEndX = xbreak}}// 结束y坐标rightEndY := 0for y := rect.Dy(); y > 0; y-- {ryflag := falsefor x := rect.Dy(); x > 0; x-- {// 获取颜色r, _, _, _ := img.At(x, y).RGBA()if r == 0xFFFF {ryflag = truebreak}}if ryflag {rightEndY = ybreak}}// 创建新的图片rectangle := image.Rectangle{Min: image.Point{X: 0, Y: 0},Max: image.Point{X: rightEndX - leftStartX, Y: rightEndY - leftStartY},}newSideImg := image.NewGray(rectangle)draw.Draw(newSideImg, newSideImg.Bounds(), img, image.Point{X: leftStartX, Y: leftStartY}, draw.Over)return newSideImg
}// 二值化 去掉多余的颜色 使用黑白色进行图片渲染
func imgBinarzation(img image.Image) image.Image {binImg := image.NewGray16(img.Bounds())draw.Draw(binImg, binImg.Bounds(), img, img.Bounds().Min, draw.Over)rect := binImg.Bounds()// 遍历点像素点for x := 0; x < rect.Dx(); x++ {for y := 0; y < rect.Dy(); y++ {// 获取颜色r, _, _, _ := binImg.At(x, y).RGBA()if r < 0x7788 {binImg.Set(x, y, color.White)} else {binImg.Set(x, y, color.Black)}}}return binImg
}// 根据左上角 和 右下角的坐标来确定要截取生成新的图片
func imgLocation(img image.Image) image.Image {rect := img.Bounds()// 左上角的坐标 x: w(总宽度)*测量x轴的位置/测量总x的宽度// 左上角的坐标 y: h(总高度)*测量y轴的位置/测量总y的高度leftLoc := image.Point{X: rect.Dx() * 200 / 606, Y: rect.Dy() * 315 / 383}// 右下角的坐标 x: w(总宽度)*测量x轴的位置/测量总x的宽度// 右下角的坐标 y: h(总高度)*测量y轴的位置/测量总y的高度rightLoc := image.Point{X: rect.Dx() * 474 / 606, Y: rect.Dy() * 340 / 383}// 设置新生成图片的坐标位置rectangle := image.Rectangle{Min: image.Point{X: 0, Y: 0},Max: image.Point{X: rightLoc.X - leftLoc.X, Y: rightLoc.Y - leftLoc.Y},}// 新建图片locImg := image.NewNRGBA(rectangle)draw.Draw(locImg, locImg.Bounds(), img, leftLoc, draw.Over)return locImg
}// 图片预览
func imgView(img ...image.Image) {for i := 0; i < len(img); i++ {dts, err := os.Create(fmt.Sprintf("./view/cutImg%d.jpeg", i))if err != nil {panic(fmt.Sprintf("创建失败:%+v", err))}defer dts.Close()err = jpeg.Encode(dts, img[i], nil)if err != nil {panic(fmt.Sprintf("写入图片失败:%+v", err))}}
}

http://chatgpt.dhexx.cn/article/vNiH7UxU.shtml

相关文章

身份证号码识别

初次接触OCR技术&#xff0c;OCR技术在工业检测上有极大的用处&#xff0c;如工件上面得数字标号识别、印刷纸票识别、车牌识别、身份证号码识别等。但中文字体识别较难&#xff0c;如今百度OCR、谷歌tesseract等提供识别接口&#xff0c;可以取得较好的识别效果。 通过贾志刚老…

身份证号规则校验

我们国家目前公民身份证号为15位或者18位&#xff0c;且最后一位可能出现字母X。其中&#xff0c; 15位身份证为我国第一代身份证&#xff0c;基本已经退出历史舞台。其规则如下&#xff1a; 前1、2位数字表示&#xff1a;所在省份的代码&#xff1b; 第3、4位数字表示&…

opencv识别身份证号

opencv 识别身份证号 python模块 opencvpytesseractPIL 1.模块安装 1.1 opencv安装 通过pip进行安装&#xff0c;在此不再叙述 注意安装版本&#xff0c;以下是python3的安装方式 pip install opencv-python1.2 pytesseract安装 通过pip进行安装&#xff0c;在此不再叙述…

[转]【读书笔记】《俞军产品方法论》——产品经理的枕边书

作者简介 俞军&#xff0c;1997年毕业于同济大学化学系。曾任百度产品副总裁、首席产品架构师&#xff0c;网名“搜索引擎9238”&#xff0c;有“百度贴吧之父”之称。滴滴前高级产品副总裁。 内容简介 摘抄语录 我的产品潜力和优势大约只来自三方面&#xff1a;第一&#xff0…

话说产品方法论——需求与用户研究

开一个坑&#xff0c;结合自身经历和现在在看的一些书&#xff0c;将一些基础的产品方法论总结出来&#xff0c;与大家交流的同时鞭策自己。 作为0岁的产品经理&#xff0c;我们在学习产品方法论时&#xff0c;容易偏重于产品设计的理论&#xff0c;对产品设计的喜爱也许是多数…

CRM产品方法论

导语&#xff1a;CRM&#xff08;客户关系管理&#xff09;是一种企业与现有客户及潜在客户之间关系互动的管理系统&#xff0c;通过对客户数据的历史积累和分析&#xff0c;CRM可增进企业与客户之间的关系&#xff0c;从而增加企业销售收入和提高客户留存率。本文作者从目标、…

《俞军产品方法论》:一个产品学派的诞生

www.pmcaff.com 本文为作者 一只特立独行的Eric 于社区发布 “我有时下班打个顺风车&#xff0c;周围几大公司&#xff08;滴滴、百度、新浪、网易&#xff09;的产品经理都会来接我。因为我用的是真名。”俞军2017年接受PingWest采访时说道。 作为中国最有影响力的产品经理之一…

AI产品方法论之“由用户来完成AI产品设计的最后一公里”

前言&#xff1a;AI产品落地&#xff0c;非常有意思&#xff0c;也非常有难度&#xff0c;究其原因&#xff0c;除了AI技术、产品、行业、人才、用户等各方面都还没成熟&#xff0c;还有一个很重要的问题&#xff0c;就是我们还没有将互联网时代的产品方法论升级成为"AI产…

产品经理 - 产品设计方法论需求分析部分

整体 – 产品设计方法论思维导图 个人整理&#xff0c;存在异议大家可以讨论下 需求分析方法论 需求分析为需求收集的延展&#xff0c;需求收集后即需进行需求分析&#xff0c;拆解需求后方可业务落地&#xff0c;此处我将其分为两步&#xff0c;一是主动发散型需求分析&am…

产品经理方法论

企业以产品为媒介&#xff0c;与用户进行价值交换&#xff1b;产品经理要能在实践中理解用户模型和交易模型&#xff0c;设计产品促成更多交易&#xff0c;以创造有利可图的用户价值。 1、企业、用户、产品的关系 用户价值和商业价值的关系&#xff0c;是企业以产品为媒介&…

《俞军产品方法论》- 站在更高的角度来拓展产品经理的内涵和边界

关于作者 俞军&#xff0c;互联网产品大神级人物。他是早年百度唯一的产品经理&#xff0c;主持了百度搜索这款产品的无数次进化&#xff0c;并主持设计了百度贴吧、百度 知道等世界级创新产品&#xff0c;后来又成为滴滴出行的产品负责人。他的 “ 俞军产品经理十二条 ” &a…

产品方法论—如何竞品分析

一、概要 什么是竞品分析&#xff0c;单从组词法来说&#xff0c;竞品分析就是对竞争产品的分析&#xff0c;接下来将详细讲述到底应该如何进行竞品分析… 1、什么是竞品分析 在两个或者多个竞争产品之间&#xff0c;他们有什么样的商业模式&#xff0c;有什么样的定位&…

《产品方法论》读书笔记

写在前面&#xff1a;本文仅仅是根据个人阅读习惯或个人有启发之处所记录的笔记&#xff0c;不代表该书的重点哦>o< 全书内容的简单总结 企业以产品为媒介&#xff0c;与用户进行价值交换&#xff1b;产品经理要能在实践中理解用户模型和交易模型&#xff0c;设计产品促…

产品经理 - 产品设计方法论业务落地部分_包括流程产品文档方法论需求设计方法论

整体 - 产品设计方法论思维导图 个人整理&#xff0c;存在异议大家可以讨论下 业务落地方法论 在进行了需求收集以及需求分析后&#xff0c;针对收集到的需求以及对应的分析结论后&#xff0c;需针对当前的需求点进行开发落地&#xff0c;核心即为两点&#xff0c;需求设计…

产品方法论(三)

《结网》系列读书笔记 这本书已经被陆续的读完了&#xff0c;总结总是落后半拍&#xff0c;坏处是容易遗漏细节&#xff0c;不过这样也有好处&#xff1a;那就是总结思考&#xff0c;把对我印象最深的写出来。 产品经理的工作流程 检查和体验产品 腾讯的pony ma不只是作为ce…

以产品当笔,与世界对话——《俞军-产品方法论》

什么是产品经理&#xff1f; 1.历史上的产品经理 消费时代的产品经理 1926年&#xff0c;宝洁推出了一款叫卡玫尔&#xff08;Camay&#xff09;的香皂&#xff0c;跟宝洁公司自家的另一款象牙牌&#xff08;Ivory&#xff09;香皂很相似&#xff0c;但销量一直不佳。 象牙皂…

「产品读书」俞军产品方法论

在阅读这本书之前&#xff0c;第一个能想到的不相上下的产品书籍就是网易的《幕后产品》&#xff0c;对于我来说&#xff0c;网易的产品一直是我最为钦佩和喜欢的&#xff0c;但是互联网界的产品名声最大的除了张小龙&#xff0c;我估计就是俞军了&#xff0c;读这本书之前我提…

产品设计---产品从0到1,阐述各阶段的产品方法论

产品从0到1&#xff0c;阐述各阶段的产品方法论 产品分析的“五要素法”是什么&#xff1f;需求采集的“Z字采集法”又是什么&#xff1f;如何用“KANO模型”对需求进行分类及优先排序&#xff1f;如何确定MVP&#xff1f;“Hooked模型”是如何让用户对产品上瘾的&#xff1f;…

【centos7x86】安装源 设置基础软件仓库时出错 解决办法

设置阿里源&#xff0c;手敲下面的地址&#xff0c; 更新 &#xff1a; 现在需要勾选https&#xff0c;http取消了

CentOS8.3安装时安装源设置基础软件仓库时出错

报错如下&#xff1a;安装源设置基础软件仓库时出错 使用的iso镜像是CentOS-8.3.2011-x86_64-boot.iso&#xff0c;在阿里云的镜像中下载的。 下载地址&#xff1a;CentOS-8.3.2011-x86_64-boot.iso 解决方案&#xff1a; 首先设置好网络和主机名&#xff0c;确保能连接网络 …