def SnapshotBtn(self, values: list) -> np.ndarray: """スナップショットの撮影から一連の画像処理を行う関数。 Args: values (list): ウインドウ上のボタンの状態などを記録している変数 Returns: dst_org (np.ndarray): オリジナルのスナップショット dst_bin (np.ndarray): 二値化処理後の画像 """ dst_org = dst_bin = None response, img = Snapshot(self.cam) if response != 3: sg.popup(self.WebCam_err[response], title="撮影エラー") return dst_org = img.copy() #--------------------------- # # 画像サイズなどをダイアログ上に表示 # #--------------------------- # self.Window["-IMAGE_width-"].update(str(img.shape[0])) self.Window["-IMAGE_height-"].update(str(img.shape[1])) self.Window["-IMAGE_channel-"].update(str(img.shape[2])) # --------------------------- # 撮影した画像を変換する。 # --------------------------- # 色空間変換 if values['-Color_Space-'] != 'RGB': img = Color_cvt(img, values['-Color_Space-']) # ノイズ除去 # 濃度変換 if values['-Color_Density-'] != 'なし': img = Contrast_cvt(img, values['-Color_Density-']) # ------------ # 画像処理 # ------------ if values['-Binarization-'] != 'なし': # 二値化処理 if values['-Binarization-'] == 'Global': # 大域的二値化処理 img = GlobalThreshold(img, threshold=int( values["-LowerThreshold-"])) elif values['-Binarization-'] == 'Otsu': # 大津の二値化処理 img = GlobalThreshold(img, Type='Otsu') elif values['-Binarization-'] == 'Adaptive': img = AdaptiveThreshold( img=img, method=str(values['-AdaptiveThreshold_type-']), block_size=int(values['-AdaptiveThreshold_BlockSize-']), C=int(values['-AdaptiveThreshold_Constant-'])) elif values['-Binarization-'] == 'Two': # 2つの閾値を用いた二値化処理 # ピックアップする色を番号に変換 if values['-color_R-']: color = 0 elif values['-color_G-']: color = 1 elif values['-color_B-']: color = 2 elif values['-color_W-']: color = 3 elif values['-color_Bk-']: color = 4 img = TwoThreshold( img=img, LowerThreshold=int(values["-LowerThreshold-"]), UpperThreshold=int(values["-UpperThreshold-"]), PickupColor=color) dst_bin = img.copy() # ----------------------- # # 画面上に撮影した画像を表示する # # ----------------------- # img = scale_box(img, self.Image_width, self.Image_height) imgbytes = cv2.imencode('.png', img)[1].tobytes() self.Window['-IMAGE-'].update(data=imgbytes) # --------------------------------- # # 画面上に撮影した画像のヒストグラムを表示する # # --------------------------------- # canvas_elem = self.Window['-CANVAS-'] canvas = canvas_elem.TKCanvas ticks = [0, 42, 84, 127, 169, 211, 255] fig, ax = plt.subplots(figsize=(3, 2)) ax = Image_hist(img, ax, ticks) if self.fig_agg: # ** IMPORTANT ** Clean up previous drawing before drawing again delete_figure_agg(self.fig_agg) self.fig_agg = draw_figure(canvas, fig) self.fig_agg.draw() return dst_org, dst_bin
def Event(self, event, values): # Dobotの接続を行う if event == "-Connect-": # self.connection = self.Connect_Disconnect_click(self.connection, self.api) self.connection = Connect_Disconnect(self.connection, self.api, self.CON_STR) if self.connection == 0: # Dobotの現在の姿勢を画面上に表示 self.current_pose = self.GetPose_UpdateWindow() elif event == "-SetJointPose-": # 移動後の関節角度を指定 DestPose = [ float(values["-JointPoseInput_1-"]), float(values["-JointPoseInput_2-"]), float(values["-JointPoseInput_3-"]), float(values["-JointPoseInput_4-"]), ] response = self.SetJointPose_click() print(response) # ------------------------------------ # # WebCamを選択&接続するイベント # # ------------------------------------ # elif event == "-SetWebCam-": # Webカメラの番号を取得する cam_num = WebCamOption(values["-WebCam_Name-"]) # webカメラの番号が取得できなかった場合 if cam_num is None: sg.popup("選択したデバイスは存在しません。", title="カメラ接続エラー") return # ----------------------------# # カメラを接続するイベント # # --------------------------- # # カメラを初めて接続する場合 if (cam_num != None) and (self.cam_num == None): response, self.cam = WebCam_OnOff(cam_num, cam=self.cam) if response == -1: # カメラが接続されていない場合 sg.popup("WebCameraに接続できません.", title="カメラ接続エラー") elif response == 0: # カメラを開放した場合 sg.popup("WebCameraを開放しました。", title="Camの接続") else: sg.popup("WebCameraに接続しました。", title="Camの接続") # 接続したいカメラが接続していカメラと同じ場合 elif (cam_num != None) and (self.cam_num == cam_num): response, self.cam = WebCam_OnOff(cam_num, cam=self.cam) if response == -1: # カメラが接続されていない場合 sg.popup("WebCameraに接続できません.", title="カメラ接続エラー") elif response == 0: # カメラを開放した場合 sg.popup("WebCameraを開放しました。", title="Camの接続") else: sg.popup("WebCameraに接続しました。", title="Camの接続") # 接続したいカメラと接続しているカメラが違う場合 elif (cam_num != None) and (self.cam_num != cam_num): # まず接続しているカメラを開放する. ch_1, self.cam = WebCam_OnOff(cam_num, cam=self.cam) # 開放できた場合 if ch_1 == 0: sg.popup("WebCameraを開放しました。", title="Camの接続") # 次に新しいカメラを接続する. ch_2, self.cam = WebCam_OnOff(cam_num, cam=self.cam) # カメラが接続されていない場合 if ch_2 == -1: sg.popup("WebCameraに接続できません.", title="カメラ接続エラー") else: sg.popup("WebCameraに接続しました.", title="Camの接続") # 新しいカメラを接続した場合 elif ch_1 == 1: sg.popup("新しくWebCameraに接続しました.", title="Camの接続") # カメラの接続に失敗した場合 else: self.cam = None self.cam_num = cam_num #---------------------------------# # プレビューを表示するイベント # #-------------------------------- # elif event == "-Preview-": window_name = "frame" while True: if type(self.cam) == cv2.VideoCapture: # カメラが接続されている場合 response, img = Snapshot(self.cam) if response: #----------------------------------------# # 画像サイズなどをダイアログ上に表示 # #----------------------------------------# self.Window["-IMAGE_width-"].update(str(img.shape[0])) self.Window["-IMAGE_height-"].update(str(img.shape[1])) self.Window["-IMAGE_channel-"].update(str( img.shape[2])) print("プレビューを表示します。") response = Preview(img, window_name=window_name) if cv2.waitKey(0) & 0xFF == ord("e"): cv2.destroyWindow(window_name) break else: sg.popup("SnapShotを撮影できませんでした.", title="撮影エラー") break else: sg.popup("カメラが接続されていません.", title="カメラ接続エラー") break # ---------------------------------------- # # スナップショットを撮影するイベント # # ---------------------------------------- # elif event == '-Snapshot-': response, img = Snapshot(self.cam) if response != 1: sg.popup("スナップショットを撮影できませんでした。", title="撮影エラー") #----------------------------------------# # 画像サイズなどをダイアログ上に表示 # #----------------------------------------# self.Window["-IMAGE_width-"].update(str(img.shape[0])) self.Window["-IMAGE_height-"].update(str(img.shape[1])) self.Window["-IMAGE_channel-"].update(str(img.shape[2])) # --------------------------- # 撮影した画像を変換する。 # --------------------------- # 色空間変換 if values['-Color_Space-'] != 'RGB': img = Color_cvt(img, values['-Color_Space-']) # ノイズ除去 # 濃度変換 if values['-Color_Density-'] != 'なし': img = Contrast_cvt(img, values['-Color_Density-']) # ----------------------------------- # 画面上に撮影した画像を表示する # ----------------------------------- img = scale_box(img, self.Image_width, self.Image_height) imgbytes = cv2.imencode('.png', img)[1].tobytes() self.Window['-IMAGE-'].update(data=imgbytes) # ------------------------------------------------ # 画面上に撮影した画像のヒストグラムを表示する # ------------------------------------------------ canvas_elem = self.Window['-CANVAS-'] canvas = canvas_elem.TKCanvas ticks = [0, 42, 84, 127, 169, 211, 255] fig, ax = plt.subplots(figsize=(3, 2)) ax = Image_hist(img, ax, ticks) if self.fig_agg: # ** IMPORTANT ** Clean up previous drawing before drawing again delete_figure_agg(self.fig_agg) self.fig_agg = draw_figure(canvas, fig) self.fig_agg.draw()