最近一直在玩数独,突发奇想实现图像识别求解数独,输入到输出平均需要0.5s。
整体思路大概就是识别出图中数字生成list,然后求解。
输入输出demo
数独采用的是微软自带的Microsoft sudoku软件随便截取的图像,如下图所示:
经过程序求解后,得到的结果如下图所示:
def getFollow(varset, terminalset, first_dic, production_list): follow_dic = {} done = {} for var in varset: follow_dic[var] = set() done[var] = 0 follow_dic[\"A1\"].add(\"#\") # for var in terminalset: # follow_dic[var]=set() # done[var] = 0 for var in follow_dic: getFollowForVar(var, varset, terminalset, first_dic, production_list, follow_dic, done) return follow_dic def getFollowForVar(var, varset, terminalset, first_dic, production_list, follow_dic, done): if done[var] == 1: return for production in production_list: if var in production.right: ##index这里在某些极端情况下有bug,比如多次出现var,index只会返回最左侧的 if production.right.index(var) != len(production.right) - 1: follow_dic[var] = first_dic[production.right[production.right.index(var) + 1]] | follow_dic[var] # 没有考虑右边有非终结符但是为null的情况 if production.right[len(production.right) - 1] == var: if var != production.left[0]: # print(var, \"吸纳\", production.left[0]) getFollowForVar(production.left[0], varset, terminalset, first_dic, production_list, follow_dic, done) follow_dic[var] = follow_dic[var] | follow_dic[production.left[0]] done[var] = 1
程序具体流程
程序整体流程如下图所示:
读入图像后,根据求解轮廓信息找到数字所在位置,以及不包含数字的空白位置,提取数字信息通过KNN识别,识别出数字;无数字信息的在list中置0;生成未求解数独list,之后求解数独,将信息在原图中显示出来。
def initProduction(): production_list = [] production = Production([\"A1\"], [\"A\"], 0) production_list.append(production) production = Production([\"A\"], [\"E\", \"I\", \"(\", \")\", \"{\", \"D\", \"}\"], 1) production_list.append(production) production = Production([\"E\"], [\"int\"], 2) production_list.append(production) production = Production([\"E\"], [\"float\"], 3) production_list.append(production) production = Production([\"D\"], [\"D\", \";\", \"B\"], 4) production_list.append(production) production = Production([\"B\"], [\"F\"], 5) production_list.append(production) production = Production([\"B\"], [\"G\"], 6) production_list.append(production) production = Production([\"B\"], [\"M\"], 7) production_list.append(production) production = Production([\"F\"], [\"E\", \"I\"], 8) production_list.append(production) production = Production([\"G\"], [\"I\", \"=\", \"P\"], 9) production_list.append(production) production = Production([\"P\"], [\"K\"], 10) production_list.append(production) production = Production([\"P\"], [\"K\", \"+\", \"P\"], 11) production_list.append(production) production = Production([\"P\"], [\"K\", \"-\", \"P\"], 12) production_list.append(production) production = Production([\"I\"], [\"id\"], 13) production_list.append(production) production = Production([\"K\"], [\"I\"], 14) production_list.append(production) production = Production([\"K\"], [\"number\"], 15) production_list.append(production) production = Production([\"K\"], [\"floating\"], 16) production_list.append(production) production = Production([\"M\"], [\"while\", \"(\", \"T\", \")\", \"{\", \"D\", \";\", \"}\"], 18) production_list.append(production) production = Production([\"N\"], [\"if\", \"(\", \"T\", \")\", \"{\", \"D\",\";\", \"}\", \"else\", \"{\", \"D\", \";\",\"}\"], 19) production_list.append(production) production = Production([\"T\"], [\"K\", \"L\", \"K\"], 20) production_list.append(production) production = Production([\"L\"], [\">\"], 21) production_list.append(production) production = Production([\"L\"], [\"<\"], 22) production_list.append(production) production = Production([\"L\"], [\">=\"], 23) production_list.append(production) production = Production([\"L\"], [\"<=\"], 24) production_list.append(production) production = Production([\"L\"], [\"==\"], 25) production_list.append(production) production = Production([\"D\"], [\"B\"], 26) production_list.append(production) production = Production([\"B\"], [\"N\"], 27) production_list.append(production) return production_list source = [[5, \"int\", \" 关键字\"], [1, \"lexicalanalysis\", \" 标识符\"], [13, \"(\", \" 左括号\"], [14, \")\", \" 右括号\"], [20, \"{\", \" 左大括号\"], [4, \"float\", \" 关键字\"], [1, \"a\", \" 标识符\"], [15, \";\", \" 分号\"], [5, \"int\", \" 关键字\"], [1, \"b\", \" 标识符\"], [15, \";\", \" 分号\"], [1, \"a\", \" 标识符\"], [12, \"=\", \" 赋值号\"], [3, \"1.1\", \" 浮点数\"], [15, \";\", \" 分号\"], [1, \"b\", \" 标识符\"], [12, \"=\", \" 赋值号\"], [2, \"2\", \" 整数\"], [15, \";\", \" 分号\"], [8, \"while\", \" 关键字\"], [13, \"(\", \" 左括号\"], [1, \"b\", \" 标识符\"], [17, \"<\", \" 小于号\"], [2, \"100\", \" 整数\"], [14, \")\", \" 右括号\"], [20, \"{\", \" 左大括号\"], [1, \"b\", \" 标识符\"], [12, \"=\", \" 赋值号\"], [1, \"b\", \" 标识符\"], [9, \"+\", \" 加 号\"], [2, \"1\", \" 整数\"], [15, \";\", \" 分号\"], [1, \"a\", \" 标识符\"], [12, \"=\", \" 赋值号\"], [1, \"a\", \" 标识符\"], [9, \"+\", \" 加号\"], [2, \"3\", \" 整数\"], [15, \";\", \" 分号\"], [21, \"}\", \" 右大括号\"], [15, \";\", \" 分号\"], [6, \"if\", \" 关键字\"], [13, \"(\", \" 左括号\"], [1, \"a\", \" 标识符\"], [16, \">\", \" 大于号\"], [2, \"5\", \" 整数\"], [14, \")\", \" 右括号\"], [20, \"{\", \" 左大括号\"], [1, \"b\", \" 标识符\"], [12, \"=\", \" 赋值号\"], [1, \"b\", \" 标识符\"], [10, \"-\", \" 减号\"], [2, \"1\", \" 整数\"], [15, \";\", \" 分号\"], [21, \"}\", \" 右大括号\"], [7, \"else\", \" 关键字\"], [20, \"{\", \" 左大括号\"], [1, \"b\", \" 标识符\"], [12, \"=\", \" 赋值号\"], [1, \"b\", \" 标识符\"], [9, \"+\", \" 加号\"], [2, \"1\", \" 整数\"], [15, \";\", \" 分号\"], [21, \"}\", \" 右大括号\"], [21, \"}\", \" 右大括号\"]]
以上就是Python识别处理照片中的条形码的详细内容,更多关于python 识别条形码的资料请关注自学编程网其它相关文章!