# -*- coding: utf-8 -*-
|
import datetime
|
import time
|
import cv2
|
from cv2 import waitKey
|
import uuid
|
|
# -*- coding: utf-8 -*-
|
import datetime
|
import cv2
|
from cv2 import waitKey
|
import getopt
|
import sys
|
import numpy as np
|
|
|
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 + "/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 = []
|
fail_count = 0
|
|
|
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 get_digit(frame):
|
image = frame[177:233,250:370] #frame[176:234,280:426]
|
# cv2.imshow('src',image)
|
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_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
|
return_numbers = []
|
for c in contours:
|
x, y, w, h = cv2.boundingRect(c)
|
print((x, y, w, h))
|
if image_h*0.98 > h > image_h * 0.3:
|
#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
|
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
|
cv2.imshow('frame', image)
|
return_numbers = np.array(sorted(return_numbers))
|
return return_numbers[:, -1], True
|
|
|
# 程序入口
|
def check_one_frame(frame):
|
return_numbers, staus_check = get_digit(frame)
|
print(return_numbers)
|
digit = 0
|
global fail_count
|
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')
|
fail_count += 1
|
cv2.rectangle(frame, (250, 177), (370, 233), (0, 255, 0), 2)
|
cv2.imwrite('./fails/count_fail_'+str(uuid.uuid1())+'.jpg',frame)
|
|
else:
|
print('fails')
|
fail_count +=1
|
cv2.rectangle(frame, (250, 177), (370, 233), (0, 255, 0), 2)
|
cv2.imwrite('./fails/status_fail_'+str(uuid.uuid1())+'.jpg',frame)
|
print(round(digit,2))
|
cv2.putText(frame, str(round(digit,2)), (280, 170),
|
cv2.FONT_HERSHEY_COMPLEX, 1.0, (100, 200, 200), 5)
|
cv2.imshow('add_text', frame)
|
if cv2.waitKey(5) & 0xFF == ord('q'): # 按q退出
|
cv2.waitKey(0)
|
|
|
cap = cv2.VideoCapture("video2.mp4") # for testing
|
total_frame = 0
|
while(cap.isOpened()):
|
ret, frame = cap.read()
|
if ret == True:
|
total_frame +=1
|
check_one_frame(frame)
|
else:
|
break
|
cap.release()
|
print(fail_count)
|
print(fail_count/total_frame)
|