提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 效果展示图
  • 一、引入库
  • 二、训练KNN模型
  • 三、读取数独图片并提取轮廓
  • 四、提取9*9的81小方格
  • 五、解析数独数字
  • 六、解数独
  • 总结

前言

本文主要实现基于python+opencv实现数独


效果展示图

原图:

效果图:

一、引入库

import numpy as np
import cv2, time

二、训练KNN模型

# 训练KNN模型
samples = np.load('./data/samples.npy')
labels = np.load('./data/label.npy')k = 80
train_label = labels[:k]
train_input = samples[:k]
test_input = samples[k:]
test_label = labels[k:]model = cv2.ml.KNearest_create()
model.train(train_input,cv2.ml.ROW_SAMPLE,train_label)     #训练80个

三、读取数独图片并提取轮廓

#读取数独
img = cv2.imread('./data/2.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 阈值分割
ret,thresh = cv2.threshold(gray,200,255,1)kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(5, 5))
dilated = cv2.dilate(thresh,kernel)# 轮廓提取
image, contours, hierarchy = cv2.findContours(dilated,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

四、提取9*9的81小方格

# 提取八十一个小方格
boxes = []
for i in range(len(hierarchy[0])):if hierarchy[0][i][3] == 0:boxes.append(hierarchy[0][i])height,width = img.shape[:2]
box_h = height/9
box_w = width/9
number_boxes = []

五、解析数独数字

# 数独初始化为零阵
soduko = np.zeros((9, 9),np.int32)for j in range(len(boxes)):if boxes[j][2] != -1:#number_boxes.append(boxes[j])x,y,w,h = cv2.boundingRect(contours[boxes[j][2]])number_boxes.append([x,y,w,h])#img = cv2.rectangle(img,(x-1,y-1),(x+w+1,y+h+1),(0,0,255),2)#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,(20,40))thresh1 = cv2.adaptiveThreshold(resized_roi,255,1,1,11,2) ## 归一化像素值normalized_roi = thresh1/255.  ## 展开成一行让knn识别sample1 = normalized_roi.reshape((1,800))sample1 = np.array(sample1,np.float32)## knn识别retval, results, neigh_resp, dists = model.findNearest(sample1, 1)        number = int(results.ravel()[0])## 求在矩阵中的位置soduko[int(y/box_h)][int(x/box_w)] = number

soduko为数独矩阵

六、解数独

def findNextCellToFill(grid, i, j):for x in range(i,9):for y in range(j,9):if grid[x][y] == 0:return x,yfor x in range(0,9):for y in range(0,9):if grid[x][y] == 0:return x,yreturn -1,-1def isValid(grid, i, j, e):rowOk = all([e != grid[i][x] for x in range(9)])if rowOk:columnOk = all([e != grid[x][j] for x in range(9)])if columnOk:# finding the top left x,y co-ordinates of the section containing the i,j cellsecTopX, secTopY = 3 *(i//3), 3 *(j//3) #floored quotient should be used here. for x in range(secTopX, secTopX+3):for y in range(secTopY, secTopY+3):if grid[x][y] == e:return Falsereturn Truereturn Falsedef solveSudoku(grid, i=0, j=0):i,j = findNextCellToFill(grid, i, j)if i == -1:return Truefor e in range(1,10):if isValid(grid,i,j,e):grid[i][j] = eif solveSudoku(grid, i, j):return Truegrid[i][j] = 0return False

总结

数独数组变化:


源码

基于opencv+python实现数独相关推荐

  1. 基于 OpenCV + Python 的人脸识别上课签到系统

    目录 前言 安装第三方库 第一步:采集人脸图像 (1)修改姓名学号 (2)运行capture_face.py (3)采集人脸图像 (4)查看采集到的人脸图像 第二步:训练模型 第三步:识别签到 (1) ...

  2. 基于Opencv+python的车流量检测项目

    目录 项目介绍 整体流程 调试环境 项目流程 1.预处理 2.汽车识别--去背景算法(KNN/MOG2) 3.统计车流量数目 结尾 源代码 测试视频资料 流程图 项目介绍 本次项目主要采用了传统视觉的 ...

  3. 基于opencv+python的角度测量

    import cv2 # 导入opencv import math # 导入math库,计算角度时需要path = './Angle Finder/background.png' # 测试样图相对路径 ...

  4. 基于opencv+python的车道检测技术

    针对自动驾驶系统的实际需求,我们需要一种能够兼顾速度.不同环境下高检测成功率和鲁棒性的车道识别算法.首先,因为停车场更多的是地下光线昏暗的情况需要提高车道线与周围环境的对比度,然后灰度化图像进行模糊降 ...

  5. 光流 | OpenCV中的Lucas-Kanade光流与稠密光流:基于Opencv+Python(附代码)

    ===================================================== github:https://github.com/MichaelBeechan CSDN: ...

  6. 计算机视觉与深度学习 | ORB特征匹配:基于OpenCV+Python(暴力匹配、FLANN)

    ===================================================== github:https://github.com/MichaelBeechan CSDN: ...

  7. 计算机视觉与深度学习 | ORB特征提取:基于OpenCV+Python(附代码)

    ===================================================== github:https://github.com/MichaelBeechan CSDN: ...

  8. 文本分割之水平投影法基于OpenCV(python)版实现

    对于如下一张图片,如何将文本区域分割成一行一行的了? 在文本分割领域中有一种很优秀的算法:投影法,包括水平投影法和垂直投影法.本文主要讲述水平投影法,水平投影法可以理解为一束光线从图像的左侧向右边进行 ...

  9. 文本分割之垂直投影法基于OpenCV(python)的实现

    在我的上一篇博客中讲述了水平投影法取出文本行图像的实现,在这里将用垂直投影法对文本行的每个字符进行分割.下图是用水平投影法切割的文本行: 文本分割的原理如下,先用水平投影取出单一文本行,接着使用垂直投 ...

最新文章

  1. 正则表达式基础(一)
  2. linux启动脚本 范本,Linux—微服务启停shell脚本编写模板
  3. 东芝2505扫描软件_东芝P300机械硬盘上膛体验:内存大了,小姐姐再也不愁无处安放了...
  4. UVA11255 Necklace Burnside、组合
  5. 有些数的素因子只有3,5,7.请设计一个算法,找出其中第k个数
  6. 通达oa 不允许从该ip登陆_通达OA-命令执行漏洞复现
  7. 使用token实现在有效期内APP自动登录功能
  8. 递归怎么理解 php,求php一段递归代码的理解
  9. vux和iview的弹出框总结
  10. 软考高级 真题 2016年上半年 信息系统项目管理师 论文
  11. ubuntu20.04 3060 显卡 安装NVIDIA显卡驱动
  12. Jspx.net Framework 6.38发布
  13. C# 按拼音/笔划 排序的简单示例(转)
  14. vivo手机怎么安装Android10,vivo X20手机怎么装卡 vivo X20安装手机卡步骤介绍
  15. CODE VS 4939 欧拉函数 质因数启发式分解
  16. SEOer必读:50个网站推广方法
  17. 计算广告——搜索广告技术初窥
  18. 【已解】英雄联盟lol撸啊撸“寻找对局”按钮无法点击,开不了赛解决方法
  19. matlab 出现 numeric,About Numeric Matlab
  20. c++中二维数组与二维向量的长度

热门文章

  1. 关于设置ul左浮动没有水平显示
  2. 办公创意简历模板-Word简历可编辑下载
  3. canvas 贝塞尔曲线动画绘制
  4. P22 USM锐化(图像增强)
  5. 为什么在变频器场合需要安科瑞的电力有源滤波器?
  6. python计算众数scipy
  7. matlab将矩阵化为行最简形
  8. PCL库安装下载(百度云盘链接)
  9. AT89C51定时器/计数器的使用
  10. 必须用计算机吗,路由器可以不用电脑吗_路由器一定要连接电脑吗-系统城