python图像数独_Python图像识别+KNN求解数独的实现

Python-opencv+KNN求解数独

最近一直在玩数独,突发奇想实现图像识别求解数独,输入到输出平均需要0.5s。

整体思路大概就是识别出图中数字生成list,然后求解。

输入输出demo

数独采用的是微软自带的Microsoft sudoku软件随便截取的图像,如下图所示:

8dd4610dcb5d1a983eb200b0e7c5da15.png

经过程序求解后,得到的结果如下图所示:

b5ac39dc9b943f0cc4c485165d32c7ea.png

程序具体流程

程序整体流程如下图所示:

1c6dafd0ffedf746170b7ed70fb9d0ed.png

读入图像后,根据求解轮廓信息找到数字所在位置,以及不包含数字的空白位置,提取数字信息通过KNN识别,识别出数字;无数字信息的在list中置0;生成未求解数独list,之后求解数独,将信息在原图中显示出来。

# -*-coding:utf-8-*-

import os

import cv2 as cv

import numpy as np

import time

####################################################

#寻找数字生成list

def find_dig_(img, train_set):

if img is None:

print("无效的图片!")

os._exit(0)

return

_, thre = cv.threshold(img, 230, 250, cv.THRESH_BINARY_INV)

_, contours, hierarchy = cv.findContours(thre, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)

sudoku_list = []

boxes = []

for i in range(len(hierarchy[0])):

if hierarchy[0][i][3] == 0: # 表示父轮廓为 0

boxes.append(hierarchy[0][i])

# 提取数字

nm = []

for j in range(len(boxes)): # 此处len(boxes)=81

if boxes[j][2] != -1:

x, y, w, h = cv.boundingRect(contours[boxes[j][2]])

nm.append([x, y, w, h])

# 在原图中框选各个数字

cropped = img[y:y + h, x:x + w]

im = img_pre(cropped)#预处理

<
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值