import cv2 import numpy as np from tkinter import * from PIL import Image from PIL import ImageTk import tensorflow as tf import time from robolink import * # RoboDK API from RoboDK import * # Robot toolbox model = tf.keras.models.load_model('./digits_model.h5') default_src = 0 title_name = 'MNIST Hand Write Digits Recognition Video' SZ = 28 frame_width = 300 frame_height = 300 cap = cv2. videocapture (default_src) def start():#初始化视频流并允许摄像机传感器#预热全局cap default_src = int(srcSpin.get()) #cap = VideoStream(usePiCamera=1).start() cap = cv2.VideoCapture(default_src) #time.sleep(2.0) detectAndDisplay() def detectAndDisplay(): _, frame = cap.read() width = frame。形状[1]高度=框架。形状[0]width_ratio = frame_width / width high_ratio = frame_height / height frame = cv2。Resize (frame, (frame_width, frame_height)) # HSV transform - value =灰度图像HSV = cv2。cvtColor(frame, cv2. color_bgr2hsv) hue, saturation, value = cv2.split(hsv) # kernel to use for形态学操作kernel = cv2. getstructuringelement (cv2. hsv)MORPH_RECT,(3,3)) #应用topHat操作topHat = cv2。morphologyEx(价值,cv2。#应用blackHat操作blackHat = cv2。morphologyEx(价值,cv2。MORPH_BLACKHAT,内核)#加法和减法之间的形态操作add = cv2。add(value, topHat) subtract = cv2。减去(添加,blackHat) #应用高斯模糊减去图像模糊= cv2。GaussianBlur(subtract, (5,5), 0) # thresholding thresh = cv2。adaptiveThreshold(模糊,255,cv2。ADAPTIVE_THRESH_GAUSSIAN_C cv2。THRESH_BINARY_INV, 19) #cv2。imshow('thresh', thresh) # cv2. findcountours()函数从OpenCV3更改到OpenCV4:现在它只有两个参数而不是3 cv2MajorVersion = cv2.__version__.split(".")[0] #检查thresh上的轮廓if int(cv2MajorVersion) >= 4:轮廓,hierarchy = cv2。cv2 findContours(打。RETR_LIST, cv2. chain_approx_simple) else: imageContours, contours, hierarchy = cv2。cv2 findContours(打。RETR_LIST, cv2. chain_approx_simple) img_digits = [] positions = [] margin = 30 img_origin = frame.copy() for contour in contour:x, y, w, h = cv2. boundingrect (contour) #忽略小的部分如果w * h < 2400: continue y_position = y-margin if(y_position < 0): y_position = 0 x_position = x-margin if(x_position < 0): x_position = 0 img_roi = thresh[y_position:y+h+margin, x_position:x+w+margin] num = cv2。resize(img_roi, (SZ,SZ)) num = num.astype('float32') / 255。 result = model.predict(np.array([num])) result_number = np.argmax(result) cv2.rectangle(frame, (x-margin, y-margin), (x+w+margin, y+h+margin), (0, 255, 0), 2) text = "Number is : {} ".format(result_number) cv2.putText(frame, text, (margin, frame_height-margin), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) if result_number ==1: RL = Robolink() robot = RL.Item("UR10") home = RL.Item("Target 2") target = RL.Item("Target 1") poseref = target.Pose() robot.MoveJ(home) robot.MoveJ(target) for i in range(7): ang = i*2*pi/6 posei = poseref*rotz(ang)*transl(200,0,0)*rotz(-ang) robot.MoveL(posei) robot.MoveL(target) robot.MoveJ(home)] cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) img = Image.fromarray(cv2image) imgtk = ImageTk.PhotoImage(image=img) lmain.imgtk = imgtk lmain.configure(image=imgtk) lmain.after(10, detectAndDisplay) #main main = Tk() main.title(title_name) main.geometry() #Graphics window label=Label(main, text=title_name) label.config(font=("Courier", 18)) label.grid(row=0,column=0,columnspan=4) srcLabel=Label(main, text='Video Source : ') srcLabel.grid(row=1,column=0) srcVal = IntVar(value=default_src) srcSpin = Spinbox(main, textvariable=srcVal,from_=0, to=5, increment=1, justify=RIGHT) srcSpin.grid(row=1, column=1) Button(main,text="Start", height=2,command=lambda:start()).grid(row=1, column=2, columnspan=2, sticky=(W, E)) imageFrame = Frame(main) imageFrame.grid(row=2,column=0,columnspan=4) #Capture video frames lmain = Label(imageFrame) lmain.grid(row=0, column=0) main.mainloop() #Starts GUI