【问题标题】:How to get value out of loop, without breaking the loop如何在不打破循环的情况下让价值脱离循环
【发布时间】:2021-12-29 22:00:45
【问题描述】:

我正在尝试制作一个视频播放器,它使用手势识别来进行视频播放器操作(播放、暂停、快进等)

对于视频播放器,我使用 PyQt5,对于手势识别,我使用 MediaPipeHere's what my program looks like

现在这是我用于运行相机并在 QMainWindow 中发出它的代码:

class Camera(QThread):
    image_update = pyqtSignal(QImage)
    video_capture = cv2.VideoCapture(0)
    action = ""

    def run(self):
        self.active_thread = True
        video_capture = cv2.VideoCapture(0)

        tracker = htm.HandTrackingModule()
        recognize = grm.GestureRecognitionModule() 

        while self.active_thread:
            ret, frame = video_capture.read()
            h, w, c = frame.shape
            if ret:
                image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                landmarks = tracker.detect_hand(image, True)
                fingers = get_position(landmarks)

                action = recognize.do_gesture(position=fingers, landmarks=landmarks, img=image)

                convert_to_qt_format = QImage(image.data, image.shape[1], image.shape[0], QImage.Format_RGB888)

            pic = convert_to_qt_format.scaled(640, 480, Qt.KeepAspectRatio)

            self.image_update.emit(pic)

GestureRecognitionModule 的 do_gesture 方法,根据手势识别(暂停、播放、快进、快退、音量增大/减小……)返回一个关于应该执行什么操作的字符串

我想在我的 QMainWindows 中获取“动作”(do_gesture() 的值),以便将其与 VideoPlayer 连接。

但我不确定我该怎么做。

tldr:如何在不中断循环的情况下从循环中获取值?

【问题讨论】:

  • 好像你想emit 一个信号?
  • 我只需要传回字符串值
  • 你所说的“离开”是什么意思?为什么打破循环不是你想要的?当您说“在我的 QMainWindows 中执行‘操作’”时,您是什么意思? 什么 QMainWindows?请阅读How to Ask 并更清楚地传达问题。展示代码运行时应该发生的情况的示例。由于这似乎是一个图形程序,您可以上传您自己的草图模型的图像,以显示窗口的外观。另请阅读stackoverflow.com/help/minimal-reproducible-example 并尝试仅包含与导致问题相关但足以重现问题的内容。
  • “传回”到哪里
  • @KarlKnechtel 非常感谢您的提示,我会阅读并尝试改进我的帖子。我不想打破循环,因为这是我从相机获取照片的方式,应该一直这样做,因为我可以在使用程序时提供更多说明。 QMainWindow 是一个 PyQt5 对象,我在其中显示整个程序,如帖子上的图片所示。该窗口由我的 CameraFeed、FolderView 和 VideoPlayer 组成。

标签: python gesture-recognition mediapipe


【解决方案1】:

你可能想发出一个信号。

action 的信号添加到您的Camera 类中,就在您的image_update 信号旁边:

class Camera(QThread):
    image_update = pyqtSignal(QImage)
    gesture_action = pyqtSignal(str)

然后在你的循环中你可以这样做:

                action = recognize.do_gesture(position=fingers, landmarks=landmarks, img=image)
                self.gesture_action.emit(action)

这不会中断循环。

将该信号连接到一个插槽(大概在您的MainWindow 或其子小部件之一中),当有action 时,该插槽可以执行您想做的任何事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 2012-02-05
    • 2015-12-10
    • 2018-10-05
    相关资源
    最近更新 更多