| | |
| | | |
| | | time_now = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") |
| | | #cap = cv2.VideoCapture(0) |
| | | cap = cv2.VideoCapture("video.mp4") |
| | | cap = cv2.VideoCapture("7122.mp4") |
| | | ret, frame = cap.read() |
| | | cv2.imwrite(time_now+".jpg", frame) |
| | | print('手动设置 唯一的参数: 数字仪表盘的位置: 要稍微留些余量。') |
| | |
| | | cv2.waitKey(0) |
| | | |
| | | |
| | | cap = cv2.VideoCapture("video.mp4") # for testing |
| | | cap = cv2.VideoCapture("7122.mp4") # for testing |
| | | total_frame = 0 |
| | | while(cap.isOpened()): |
| | | ret, frame = cap.read() |
| | |
| | | # -*- coding: utf-8 -*- |
| | | __author__ = '上海色宁' |
| | | |
| | | image_clip = [176,234,278,422] # for video.mp4 |
| | | #image_clip = [176,234,278,422] # for video.mp4 |
| | | image_clip = [226,266,220,300] # for 7122.mp4 |
| | |
| | | # -*- coding: utf-8 -*- |
| | | |
| | | |
| | | #提取电压任务 在返回的图片上截取出液晶屏幕的大小尺寸 |
| | | # 提取电压任务 在返回的图片上截取出液晶屏幕的大小尺寸 |
| | | __author__ = '上海色宁' |
| | | |
| | | import os |
| | | import sys |
| | | import cv2 |
| | | import numpy as np |
| | | import datetime |
| | | |
| | | |
| | | def task_init_load_digits(): |
| | | |
| | | # 加载数字模板 |
| | | path = './templates' # 这个地方就是获取当前运行目录 获取函数在主函数里面 |
| | | #和模板的数字进行匹配 |
| | | digits.append([cv2.imread(path + "/00.jpg",cv2.IMREAD_GRAYSCALE),0]) |
| | | digits.append([cv2.imread(path + "/00-2.jpg",cv2.IMREAD_GRAYSCALE),0]) |
| | | digits.append([cv2.imread(path + "/01.jpg",cv2.IMREAD_GRAYSCALE),1]) |
| | | digits.append([cv2.imread(path + "/02.jpg",cv2.IMREAD_GRAYSCALE),2]) |
| | | digits.append([cv2.imread(path + "/03.jpg",cv2.IMREAD_GRAYSCALE),3]) |
| | | digits.append([cv2.imread(path + "/04.jpg",cv2.IMREAD_GRAYSCALE),4]) |
| | | digits.append([cv2.imread(path + "/05.jpg",cv2.IMREAD_GRAYSCALE),5]) |
| | | digits.append([cv2.imread(path + "/06.jpg",cv2.IMREAD_GRAYSCALE),6]) |
| | | digits.append([cv2.imread(path + "/07.jpg",cv2.IMREAD_GRAYSCALE),7]) |
| | | digits.append([cv2.imread(path + "/08.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 + "/09.jpg",cv2.IMREAD_GRAYSCALE),9]) |
| | | # 和模板的数字进行匹配 |
| | | 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 = [] |
| | | |
| | | |
| | | |
| | | 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) <10: |
| | | task_init_load_digits() |
| | | #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: |
| | | # 进行模板匹配 |
| | | #print(digitROI[0].shape) |
| | | res = cv2.matchTemplate(binary, digitROI[0], cv2.TM_CCOEFF_NORMED) |
| | | max_val = cv2.minMaxLoc(res)[1] |
| | | source.append(max_val) |
| | | #print(source) |
| | | if max(source) > 0.5 : |
| | | return digits[source.index(max(source))][1] |
| | | 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 "-" |
| | | |
| | | #截取的摄像头的屏幕的大小,需要换成现场的大小 |
| | | clip_rect = '175:235,275:420' |
| | | rows = clip_rect.split(',')[0] # 行 |
| | | cols = clip_rect.split(',')[1] # 列 |
| | | rows_start = int(rows.split(':')[0]) |
| | | rows_end = int(rows.split(':')[1]) |
| | | cols_start = int(cols.split(':')[0]) |
| | | cols_end = int(cols.split(':')[1]) |
| | | |
| | | totol_cols = (cols_end-cols_start) |
| | | col_length_1 = int(totol_cols*0.212352113) |
| | | col_length_2 = int(totol_cols*0.212352113) |
| | | col_length_3_4 = int(totol_cols*0.212352113) |
| | | |
| | | col_start_2 = cols_start+int(totol_cols*0.265690141) |
| | | col_start_3 = cols_start+int(totol_cols*0.485746479) |
| | | col_start_4 = cols_start+int(totol_cols*0.75943662) |
| | | return "@" |
| | | |
| | | |
| | | def get_most_digitals_and_image(image_frame): |
| | | digit_1 = get_most_simmilar_digit(image_frame[rows_start:rows_end,cols_start:cols_start+col_length_1]) |
| | | digit_2 = get_most_simmilar_digit(image_frame[rows_start:rows_end,col_start_2:col_start_2+col_length_2]) |
| | | digit_3 = get_most_simmilar_digit(image_frame[rows_start:rows_end,col_start_3:col_start_3+col_length_3_4]) |
| | | digit_4 = get_most_simmilar_digit(image_frame[rows_start:rows_end,col_start_4:col_start_4+col_length_3_4]) |
| | | addtext ='' |
| | | return_digital = 0 |
| | | if digit_1 == '-': |
| | | addtext= str(digit_2)+"."+str(digit_3)+str(digit_4) |
| | | return_digital=int(digit_2)+0.1*int(digit_3)+0.01*int(digit_4) |
| | | else: |
| | | addtext= str(digit_1)+str(digit_2)+"."+str(digit_3)+str(digit_4) |
| | | return_digital=10*int(digit_1)+int(digit_2)+0.1*int(digit_3)+0.01*int(digit_4) |
| | | cv2.putText(image_frame, addtext, (320, 150), cv2.FONT_HERSHEY_COMPLEX, 1.5, (100, 200, 200), 5) |
| | | return return_digital,image_frame |
| | | |
| | | |
| | | #测试入口 |
| | | ''' |
| | | if __name__ == '__main__': |
| | | img = cv2.imread("old__frame_2021-06-25-13-56-13.jpg") |
| | | return_digital,image_frame = get_most_digitals_and_image(img) |
| | | print(return_digital) |
| | | cv2.imwrite('image_frameimage_frameimage_frame.jpg',image_frame) |
| | | ''' |
| | | def extrct_digits_from_frame(frame, col_start, col_end, rows_start, rows_end): |
| | | image = frame[col_start:col_end, rows_start:rows_end] |
| | | 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) |
| | | return_numbers = [] |
| | | contours_count = 0 |
| | | for c in contours: |
| | | x, y, w, h = cv2.boundingRect(c) |
| | | #if image_h*0.98 > h > image_h * 0.3: |
| | | if hierarchy[0][contours_count][3] ==0 : |
| | | #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 |
| | | digit = 0 |
| | | return_numbers = np.array(sorted(return_numbers)) |
| | | return_numbers = return_numbers[:, -1] |
| | | if len(return_numbers) < 3: |
| | | return digit, False |
| | | elif 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 |
| | | return round(digit, 2), True |
| New file |
| | |
| | | # -*- coding: utf-8 -*- |
| | | |
| | | |
| | | #提取电压任务 在返回的图片上截取出液晶屏幕的大小尺寸 |
| | | __author__ = '上海色宁' |
| | | |
| | | import os |
| | | import sys |
| | | import cv2 |
| | | import numpy as np |
| | | import datetime |
| | | |
| | | |
| | | def task_init_load_digits(): |
| | | |
| | | # 加载数字模板 |
| | | path = './templates' # 这个地方就是获取当前运行目录 获取函数在主函数里面 |
| | | #和模板的数字进行匹配 |
| | | digits.append([cv2.imread(path + "/00.jpg",cv2.IMREAD_GRAYSCALE),0]) |
| | | digits.append([cv2.imread(path + "/00-2.jpg",cv2.IMREAD_GRAYSCALE),0]) |
| | | digits.append([cv2.imread(path + "/01.jpg",cv2.IMREAD_GRAYSCALE),1]) |
| | | digits.append([cv2.imread(path + "/02.jpg",cv2.IMREAD_GRAYSCALE),2]) |
| | | digits.append([cv2.imread(path + "/03.jpg",cv2.IMREAD_GRAYSCALE),3]) |
| | | digits.append([cv2.imread(path + "/04.jpg",cv2.IMREAD_GRAYSCALE),4]) |
| | | digits.append([cv2.imread(path + "/05.jpg",cv2.IMREAD_GRAYSCALE),5]) |
| | | digits.append([cv2.imread(path + "/06.jpg",cv2.IMREAD_GRAYSCALE),6]) |
| | | digits.append([cv2.imread(path + "/07.jpg",cv2.IMREAD_GRAYSCALE),7]) |
| | | digits.append([cv2.imread(path + "/08.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 + "/09.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) <10: |
| | | task_init_load_digits() |
| | | for digitROI in digits: |
| | | # 进行模板匹配 |
| | | #print(digitROI[0].shape) |
| | | res = cv2.matchTemplate(binary, digitROI[0], cv2.TM_CCOEFF_NORMED) |
| | | max_val = cv2.minMaxLoc(res)[1] |
| | | source.append(max_val) |
| | | #print(source) |
| | | if max(source) > 0.5 : |
| | | return digits[source.index(max(source))][1] |
| | | else: |
| | | return "-" |
| | | |
| | | #截取的摄像头的屏幕的大小,需要换成现场的大小 |
| | | clip_rect = '175:235,275:420' |
| | | rows = clip_rect.split(',')[0] # 行 |
| | | cols = clip_rect.split(',')[1] # 列 |
| | | rows_start = int(rows.split(':')[0]) |
| | | rows_end = int(rows.split(':')[1]) |
| | | cols_start = int(cols.split(':')[0]) |
| | | cols_end = int(cols.split(':')[1]) |
| | | |
| | | totol_cols = (cols_end-cols_start) |
| | | col_length_1 = int(totol_cols*0.212352113) |
| | | col_length_2 = int(totol_cols*0.212352113) |
| | | col_length_3_4 = int(totol_cols*0.212352113) |
| | | |
| | | col_start_2 = cols_start+int(totol_cols*0.265690141) |
| | | col_start_3 = cols_start+int(totol_cols*0.485746479) |
| | | col_start_4 = cols_start+int(totol_cols*0.75943662) |
| | | |
| | | |
| | | def get_most_digitals_and_image(image_frame): |
| | | digit_1 = get_most_simmilar_digit(image_frame[rows_start:rows_end,cols_start:cols_start+col_length_1]) |
| | | digit_2 = get_most_simmilar_digit(image_frame[rows_start:rows_end,col_start_2:col_start_2+col_length_2]) |
| | | digit_3 = get_most_simmilar_digit(image_frame[rows_start:rows_end,col_start_3:col_start_3+col_length_3_4]) |
| | | digit_4 = get_most_simmilar_digit(image_frame[rows_start:rows_end,col_start_4:col_start_4+col_length_3_4]) |
| | | addtext ='' |
| | | return_digital = 0 |
| | | if digit_1 == '-': |
| | | addtext= str(digit_2)+"."+str(digit_3)+str(digit_4) |
| | | return_digital=int(digit_2)+0.1*int(digit_3)+0.01*int(digit_4) |
| | | else: |
| | | addtext= str(digit_1)+str(digit_2)+"."+str(digit_3)+str(digit_4) |
| | | return_digital=10*int(digit_1)+int(digit_2)+0.1*int(digit_3)+0.01*int(digit_4) |
| | | cv2.putText(image_frame, addtext, (320, 150), cv2.FONT_HERSHEY_COMPLEX, 1.5, (100, 200, 200), 5) |
| | | return return_digital,image_frame |
| | | |
| | | |
| | | #测试入口 |
| | | ''' |
| | | if __name__ == '__main__': |
| | | img = cv2.imread("old__frame_2021-06-25-13-56-13.jpg") |
| | | return_digital,image_frame = get_most_digitals_and_image(img) |
| | | print(return_digital) |
| | | cv2.imwrite('image_frameimage_frameimage_frame.jpg',image_frame) |
| | | ''' |