Python OpenCV数字OCR

Python OpenCV数字OCR,python,opencv,ocr,knn,Python,Opencv,Ocr,Knn,我正在尝试构建一个简单的数独抓取程序,它扫描数独图像并按顺序提取数字(0表示空白)。我已经成功地提取了大约81个盒子 单元格9x9的屏幕截图 代码 import cv2 import numpy as np import cv2.cv as cv import tesseract def rectify(h): h = h.reshape((4,2)) hnew = np.zeros((4,2),dtype = np.float32)

我正在尝试构建一个简单的数独抓取程序,它扫描数独图像并按顺序提取数字(
0
表示空白)。我已经成功地提取了大约81个盒子

单元格9x9的屏幕截图

代码

import cv2
import numpy as np 
import cv2.cv as cv
import tesseract



def rectify(h):
        h = h.reshape((4,2))
        hnew = np.zeros((4,2),dtype = np.float32)

        add = h.sum(1)
        hnew[0] = h[np.argmin(add)]
        hnew[2] = h[np.argmax(add)]

        diff = np.diff(h,axis = 1)
        hnew[1] = h[np.argmin(diff)]
        hnew[3] = h[np.argmax(diff)]

        return hnew

img=cv2.imread('sudoku.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

gray = cv2.GaussianBlur(gray,(5,5),0)
thresh = cv2.adaptiveThreshold(gray,255,1,1,11,2)


contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

biggest = None
max_area = 0
for i in contours:
        area = cv2.contourArea(i)
        if area > 100:
                peri = cv2.arcLength(i,True)
                approx = cv2.approxPolyDP(i,0.02*peri,True)
                if area > max_area and len(approx)==4:
                        biggest = approx
                        max_area = area
cv2.drawContours(img, biggest, -1, (0,255,0), 8)

biggest=rectify(biggest)

h = np.array([ [0,0],[449,0],[449,449],[0,449] ],np.float32)
retval = cv2.getPerspectiveTransform(biggest,h)
thresh = cv2.adaptiveThreshold(gray,255,1,1,11,2)

warp = cv2.warpPerspective(thresh,retval,(450,450))

x=0
string=''
for x in range (0,9) :
        for y in range (0,9):
            morph=warp[(49*y):((49*y)+50),(49*x):((49*x)+50)]



            cv2.imwrite('sudokuDigits/cell'+str(x)+str(y)+'.jpg',morph)

            print str(x)+str(y)+" >> "+ string


cv2.imshow('frame',thresh)
cv2.imshow('wraped_ROI',warp)

cv2.waitKey(0)
cv2.destroyAllWindows()
我想做的事情:

  • 正如您看到的,在提取的单元格中有部分网格,我想提取 用于OCR的精确数字部分

  • <>我尝试KNN,但由于空格,大多数结果都是错误的。

  • 我试过tesseract,但也失败了

  • 遵循本教程

  • 我想迭代所有81个单元格并提取数字部分


  • 对不起,这太宽了,所以您的数字似乎是打印的,而不是手写的。如果是这样的话,一个简单的
    匹配模板
    和你的参考数字就足够了。谢谢!但匹配模板对扭曲的图像有效吗?查看01号和75号牢房中的7号,自己试试看。最后也考虑一些略微旋转的模板。我对这两个都是新手,所以