opencv3+python3.5成语填字游戏(二)填字图片汉字提取和识别

2023-11-12

   上一篇说的是汉字的分割。今天该实际填字图片的解析了。实际图片如下:


这是一个10*10的方格,所以我们应该先提取100个小方格,然后在提取其中的汉字。

用到的函数主要是python的opencv函数库里的findContours函数,用于找出图片中所有的轮廓层级。

## 轮廓提取
image, contours, hierarchy = cv2.findContours(dilated,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

1. 提取100个方格的代码;

for i in range(len(hierarchy[0])):
    if hierarchy[0][i][3] == 0:
        boxes.append(hierarchy[0][i])
        indexs.append(i)
2. 提取方格中的数字,还有将白色空白方格填'1',黄色方格填“0”,主要是为了形成初始填字矩阵,便于后续的解密算法的进行。代码:

#提取方格中的汉字
for j in range(len(boxes)):
    if boxes[j][2] == -1: #方格中空白
        x,y,w,h = cv2.boundingRect(contours[indexs[j]])
        number_boxes.append([x,y,w,h])
        #cv2.rectangle(img,(x-1,y-1),(x+w-10,y+h-10),(0,0,255),1)
        centerColor = img[round((2*y+h)/2),round((2*x+w)/2)]
        #print(centerColor)
        if(centerColor[0] > 200): #区分出黄色格与白色格,黄色(0,255,255)白色(255,255,255)
            #print(y/box_h,round(y/box_h),x/box_w,round(x/box_w))
            miyu[round(y/box_h)][round(x/box_w)] = "1" #白色空格填‘1’
    elif boxes[j][2] != -1: #方格中有字
        x,y,w,h = cv2.boundingRect(contours[boxes[j][2]])
        #print(x,y,w,h)

        number_boxes.append([x,y,w,h])
        #cv2.rectangle(img,(x-1,y-1),(x+w+1,y+h+1),(0,255,0),1)
        #img = cv2.drawContours(img, contours, boxes[j][2], (0,255,0), 1)
        ## 对提取的数字进行处理
        number_roi = gray[y:y+h, x:x+w]
        ## 统一大小
        resized_roi=cv2.resize(number_roi,(30,30))
        thresh1 = cv2.adaptiveThreshold(resized_roi,255,1,1,11,2) 
        ## 归一化像素值
        normalized_roi = thresh1/255.  
        '''
        cv2.imshow("thresh1", thresh1)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
        '''
        ## 展开成一行让knn识别
        sample1 = normalized_roi.reshape((1,len(normalized_roi)*len(normalized_roi[0])))
        sample1 = np.array(sample1,np.float32)
        
        ## knn识别
        retval, results, neigh_resp, dists = model.findNearest(sample1, 1)        
        number = int(results.ravel()[0])
        #print(number)
        #numbers.append(number)
     
        # 第一个参数为打印的坐标,第二个为打印的文本,第三个为字体颜色,第四个为字体
        draw.text((x+(w/2)+10,y-10), str(hanzis[number-1]), (0, 0, 255), font=font) 
        
        ## 求在矩阵中的位置
        miyu[round(y/box_h)][round(x/box_w)] = str(hanzis[number-1])
3.图片中汉字的识别,使用的是knn算法,代码:

#创建knn对象并训练样本
model = cv2.ml.KNearest_create()
model.train(samples,cv2.ml.ROW_SAMPLE,labels)
  识别函数代码:
## knn识别
retval, results, neigh_resp, dists = model.findNearest(sample1, 1)   #预测测试样本     
number = int(results.ravel()[0]) #得出预测样本的样本标记
   knn主要是监督学习算法,先对已有数据样本训练,然后根据已有样本预测测试样本,准确度依赖于原始样本的准确度,并且不能保证100%的准确率。

 识别结果:

               

   此准确度是在多次调试之后才完全正确的,包括对测试图片本身大小像素调整,还有训练样本图片的调整,期间试了很多次,一直识别不对,所以识别准确度只针对本项目中的图片和样本。

源代码:https://github.com/mayue801/crossword-puzzle--idiom


   

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv3+python3.5成语填字游戏(二)填字图片汉字提取和识别 的相关文章

随机推荐

  • 面试经典(5)--二叉树最低公共祖先LCA

    题目 输入二叉树的俩个节点 求它们的最低公共祖先 算法分析 我们直接来分析O n 的算法 比如求节点F和节点H的最低公共祖先 先求出从根节点A到F的路径 再求出A到H的路径 那么最后一个相同的节点就是最低公共祖先 A gt B gt D g
  • 算法——有向图的最短路径算法

    建议学习最短路径算法时 观看这个视频 https www bilibili com video BV1q4411M7r9 from search seid 9662298119837732890 Dijkstra算法 思路 1 从一个单源节
  • Flex 开发入门

    级别 初级 刘 庆 qlcdl cn ibm com 软件工程师 IBM 软件开发中心 2009 年 1 月 07 日 本文介绍 Flex 开发的基础知识 包括如何搭建开发环境 如何调试 以及如何建立和部署简单的
  • sharding-jdbc配置的数据源连接失败原因之一

    首先我们来看看官方的配置 spring shardingsphere datasource names ds ds0 ds1 spring shardingsphere datasource ds type org apache commo
  • 实现一个顺序存储的队列(数据结构与算法 - 队列)

    相关知识 队列是一个插入操作和删除操作受到限制的线性表数据结构 队列的插入和删除被限制在表的两端 即插入操作只能在表的一端进行 而删除操作只能在表的另一端进行 因此队列又称先进先出表 顺序存储的队列 队列既可以采用顺序存储 也可以采用链接存
  • 指数函数,幂函数,对数函数

    摘自 https zhikunhuo blog csdn net article details 100828713 指数函数 幂函数 对数函数为高等数学中的初等函数 指数函数 指数函数公式为y a x 其函数增长性如下 指数函数的单调性是
  • linux环境下vcs+verdi的使用

    文章目录 前言 一 vcs编译过程 二 vcs常用指令 1 常用 1 编译文件 2 debug选项 3 目录 4 使用verdi时需要在vcs里面添加的编译选项 5 仿真选项 加在sim里面 6 其他 7 完整版本 2 覆盖率相关 3 波形
  • 通过SSH -q -X来远程打开连接显示图形界面

    以下以qtcreator 为例 以Ubuntu 16 04 4 LTS为例 安装配置主要分为服务器端和客户端两个方面 一 服务器端配置 安装ssh服务 sudo apt get install openssh server apt get是
  • BurpSuite扩展--python扩展运行环境配置

    BurpSuite扩展 python扩展运行环境配置 Burp扩展可以用Java Python或Ruby编写 Java扩展可以直接在Burp中运行 而无需任何其他配置 在安装以Python或Ruby编写的扩展之前 您需要下载Jython或J
  • 电子日历HTML布局,css

    css import url https fonts googleapis com css2 family Roboto wght 400 500 700 display swap box sizing border box padding
  • 关于软考,人事考试照片格式要求如何修改,且通过照片审核处理系统。要求295px*413px像素

    首先要ps工具 你自己的照片 照片是白底的 如果是蓝底的 可直接在ps里的图像 gt 调整 gt 替换颜色 我的底色是从蓝色换到白色 之后就是图片的大小我们可以直接在图像 gt 图像大小设置图片的像素要求 这里你直接 最后导出的时候我选的是
  • 【华为OD机试真题2023 JAVA&JS】几何平均值最大子数组

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 几何平均值最大子数组 知识点数组二分查找 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 从一个长度为N的正数数组numbers中找出长度至少为L且几何平均值最大
  • python 爬虫 requests模块实现上传文件files参数

    使用requests模块实现向服务器上传文件非常简单 只需要指定post 函数中的files参数即可 files参数可以指定一个BufferedReader对象 该对象可以使用内置的open 函数返回 代码如下 import request
  • 项目五:基于mvc模式的学生管理系统-----------------待更新

    基于mvc模式的学生管理系统 第一阶段 数据库准备及环境配置
  • 春秋云镜 CVE-2021-41947

    春秋云镜 CVE 2021 41947 Subrion CMS v4 2 1 存在sql注入 靶标介绍 Subrion CMS v4 2 1 存在sql注入 启动场景 漏洞利用 exp http localhost panel visual
  • Springboot 实践(17)spring boot整合Nacos配置中心

    前文我们讲解了Nacos服务端的下载安装 本文我们降价spring boot整合nacos 实现Nacos服务器配置参数的访问 一 启动Nacos服务 创建三个配置文件 如下所示 Springboot Nacos Client dev ya
  • (一)在Linux下命令行使用技巧

    目录 1 实验环境的管理 2 系统登陆方式 3 如何恢复系统 4 什么是内核 什么是linux 5 什么是shell 6 如何运行shell 多种方式 退出当前用户返回到登陆界面 7 shell的命令行提示符 8 shell中常见的快捷键技
  • 计算机创建快捷方式w10,win10中解决无法在桌面添加快捷方式的修复方法

    我们在win10系统电脑的使用中 电脑有时候有很多的操作出现问题我们不知道怎么做的时候 可以看一下小编的分享 我们在win10中小伙伴提问 自己想要在桌面添加润撒建的快捷方式 可是系统显示不能添加了 这是怎么回事呢 今天小编就来个的那家分享
  • 基于stm32的智能防疫门禁管理系统

    1 选题背景与意义 经过了疫情的开端与发展 就目前我国已经处在疫情的常态化管理中 在疫情常态化管理下 与人们日常生活中的出行 总离不开测温 通行证明等等 针对当前的疫情形式 我们设计一款智能防疫门禁管理系统 它能实现人们出行中测温的无人化和
  • opencv3+python3.5成语填字游戏(二)填字图片汉字提取和识别

    上一篇说的是汉字的分割 今天该实际填字图片的解析了 实际图片如下 这是一个10 10的方格 所以我们应该先提取100个小方格 然后在提取其中的汉字 用到的函数主要是python的opencv函数库里的findContours函数 用于找出图