wangzhibo
2022-03-24 d4c2d3ef0336742f8c40ff7f33507a84a315543d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# -*- coding: utf-8 -*-
import datetime
import cv2
from cv2 import waitKey
import getopt
import sys
import numpy as np
from _image_clip_setting import image_clip
 
 
def task_init_load_digits():
 
    # 加载数字模板
    path = './templates'    # 这个地方就是获取当前运行目录 获取函数在主函数里面
    # 和模板的数字进行匹配
    digits.append([cv2.imread(path + "/@-0.jpg", cv2.IMREAD_GRAYSCALE), '@'])
    digits.append([cv2.imread(path + "/@-1.jpg", cv2.IMREAD_GRAYSCALE), '@'])
    digits.append([cv2.imread(path + "/@-2.jpg", cv2.IMREAD_GRAYSCALE), '@'])
    digits.append([cv2.imread(path + "/0-0.jpg", cv2.IMREAD_GRAYSCALE), 0])
    digits.append([cv2.imread(path + "/0-1.jpg", cv2.IMREAD_GRAYSCALE), 0])
    digits.append([cv2.imread(path + "/0-2.jpg", cv2.IMREAD_GRAYSCALE), 0])
    digits.append([cv2.imread(path + "/0-3.jpg", cv2.IMREAD_GRAYSCALE), 0])
    digits.append([cv2.imread(path + "/1-0.jpg", cv2.IMREAD_GRAYSCALE), 1])
    digits.append([cv2.imread(path + "/1-1.jpg", cv2.IMREAD_GRAYSCALE), 1])
    digits.append([cv2.imread(path + "/2-0.jpg", cv2.IMREAD_GRAYSCALE), 2])
    digits.append([cv2.imread(path + "/2-1.jpg", cv2.IMREAD_GRAYSCALE), 2])
    digits.append([cv2.imread(path + "/3-0.jpg", cv2.IMREAD_GRAYSCALE), 3])
    digits.append([cv2.imread(path + "/4-0.jpg", cv2.IMREAD_GRAYSCALE), 4])
    digits.append([cv2.imread(path + "/5-0.jpg", cv2.IMREAD_GRAYSCALE), 5])
    digits.append([cv2.imread(path + "/5-1.jpg", cv2.IMREAD_GRAYSCALE), 5])
    digits.append([cv2.imread(path + "/5-2.jpg", cv2.IMREAD_GRAYSCALE), 5])
    digits.append([cv2.imread(path + "/6-0.jpg", cv2.IMREAD_GRAYSCALE), 6])
    digits.append([cv2.imread(path + "/7-0.jpg", cv2.IMREAD_GRAYSCALE), 7])
    digits.append([cv2.imread(path + "/8-0.jpg", cv2.IMREAD_GRAYSCALE), 8])
    digits.append([cv2.imread(path + "/8-1.jpg", cv2.IMREAD_GRAYSCALE), 8])
    digits.append([cv2.imread(path + "/8-2.jpg", cv2.IMREAD_GRAYSCALE), 8])
    digits.append([cv2.imread(path + "/8-3.jpg", cv2.IMREAD_GRAYSCALE), 8])
    digits.append([cv2.imread(path + "/8-4.jpg", cv2.IMREAD_GRAYSCALE), 8])
    digits.append([cv2.imread(path + "/9-0.jpg", cv2.IMREAD_GRAYSCALE), 9])
    digits.append([cv2.imread(path + "/9-1.jpg", cv2.IMREAD_GRAYSCALE), 9])
    digits.append([cv2.imread(path + "/9-2.jpg", cv2.IMREAD_GRAYSCALE), 9])
    digits.append([cv2.imread(path + "/9-3.jpg", cv2.IMREAD_GRAYSCALE), 9])
    digits.append([cv2.imread(path + "/9-4.jpg", cv2.IMREAD_GRAYSCALE), 9])
 
 
digits = []
 
 
def get_most_simmilar_digit(target_img):
    source = []
    #img_gray = cv2.cvtColor(target_img, cv2.COLOR_BGR2GRAY)
    #ret, binary = cv2.threshold(img_gray,0,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)
    # 循环对比模板的图片
    if len(digits) < 5:
        task_init_load_digits()
    for digitROI in digits:
        res = cv2.matchTemplate(target_img, digitROI[0], cv2.TM_CCOEFF_NORMED)
        max_val = cv2.minMaxLoc(res)[1]
        source.append(max_val)
    # print(max(source))
    if max(source) > 0.5:
        return digits[source.index(max(source))][1]
    else:
        return "@"
 
 
def check_frame(frame):
    image = frame[image_clip[0]:image_clip[1], image_clip[2]:image_clip[3]]
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    thresh = cv2.threshold(gray, 0, 255,
                           cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (6, 6))
    counter = cv2.morphologyEx(thresh.copy(), cv2.MORPH_OPEN, kernel)
    image_h = image.shape[0]
    contours, hierarchy = cv2.findContours(counter,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    contours_count = 0
    return_numbers = []
    image_h = image.shape[0]
    for c in contours:
        x, y, w, h = cv2.boundingRect(c)
        if hierarchy[0][contours_count][3] ==0 and h > image_h * 0.3:
        #if image_h*0.98 > h > image_h * 0.6:
            print((x, y, w, h))
            cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
            one_number = get_most_simmilar_digit(cv2.threshold(cv2.resize(
                gray[y:y+h, x:x+w], (20, 30)), 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1])
            if one_number != '@':
                return_numbers.append([x, one_number])
            else:
                return return_numbers, False
        contours_count += 1     
    return_numbers = np.array(sorted(return_numbers))
    return return_numbers[:, -1], True
 
 
# 程序入口
if __name__ == '__main__':
    image = cv2.imread(sys.argv[1])
    return_numbers, staus_check = check_frame(image)
    digit = 0
    if staus_check:
        if len(return_numbers) == 3:
            digit = return_numbers[0] + \
                return_numbers[1]*0.1+return_numbers[2]*0.01
        elif len(return_numbers) == 4:
            digit = return_numbers[0]*10+return_numbers[1] + \
                return_numbers[2]*0.1+return_numbers[3]*0.1
        else:
            # do got another image
            print('fails')
    else:
        print('fails')
    print(digit)
    cv2.putText(image, str(digit), (280, 170), cv2.FONT_HERSHEY_COMPLEX, 1.0, (100, 200, 200), 5)
    cv2.imshow('add_text',image)
    waitKey(0)