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