Esempio n. 1
0
    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
Esempio n. 2
0
    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()