Python识别处理照片中的条形码

最近一直在玩数独,突发奇想实现图像识别求解数独,输入到输出平均需要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识别处理照片中的条形码 的全部内容, 来源链接: utcz.com/z/317681.html

回到顶部