吾爱破jie 发表于 2020-1-6 15:22

手势识别音乐播放

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QToolTip, \
   QPushButton,QMessageBox,QDesktopWidget, QLabel
from PyQt5.QtGui import QFont,QIcon,QPixmap,QImage
from PyQt5.QtCore import QTimer
import cv2
import picture as pic
import classify as cf
import numpy as np


import pygame
import time
import threading


class myWindow(QWidget):
    def __init__(self, parent=None):
      super(myWindow, self).__init__(parent)

      self.timer_camera = QTimer()
      self.cap = cv2.VideoCapture()
      self.initUI()
      self.slot_init()


    def initUI(self):

      self.mylabel()
      self.myButton()
      self.myLabelPic()

      self.setFixedSize(770,520)
      self.center()
      self.setWindowIcon(QIcon('icon.jpg'))
      self.setWindowTitle('gesture recognition')


    def mylabel(self):
      label_roi = QLabel('原图',self)
      label_roi.setStyleSheet("QLabel{font-size:18px;}")
      label_roi.resize(60,30)
      label_roi.move(120,15)

      label_res = QLabel('轮廓线', self)
      label_res.setStyleSheet("QLabel{font-size:18px;}")
      label_res.resize(60, 30)
      label_res.move(480, 15)

      label_pre = QLabel('预测', self)
      label_pre.setStyleSheet("QLabel{font-size:20px;}")
      label_pre.resize(50,30)
      label_pre.move(400,400)

      label_result = QLabel('结果', self)
      label_result.setStyleSheet("QLabel{font-size:20px;}")
      label_result.resize(50, 30)
      label_result.move(400,430)

    def myLabelPic(self):
      self.label_show_roi = QLabel(self)
      self.label_show_roi.setFixedSize(301,301)
      self.label_show_roi.move(20,50)
      self.label_show_roi.setStyleSheet("QLabel{background:white;}")
      self.label_show_roi.setAutoFillBackground(True)

      self.label_show_ret = QLabel(self)
      self.label_show_ret.setFixedSize(301, 301)
      self.label_show_ret.move(350, 50)
      self.label_show_ret.setStyleSheet("QLabel{background:white;}")
      self.label_show_ret.setAutoFillBackground(True)

      self.label_show_recognition = QLabel('0',self)
      self.label_show_recognition.setStyleSheet("QLabel{background:white;}")
      self.label_show_recognition.setStyleSheet("QLabel{font-size:50px;}")
      self.label_show_recognition.setFixedSize(100,100)
      self.label_show_recognition.move(500, 380)
      self.label_show_recognition.setAutoFillBackground(True)

    def myButton(self):
      QToolTip.setFont(QFont('SansSerif', 10))

      self.button_open_camera = QPushButton('打开相机', self)
      self.button_open_camera.setToolTip('按i,k,j,l可以进行上下左右调整')
      self.button_open_camera.resize(100,30)
      self.button_open_camera.move(100, 400)

      self.butoon_recognition = QPushButton('开始预测', self)
      self.butoon_recognition.setFixedSize(100, 30)
      self.butoon_recognition.move(100, 450)


    def slot_init(self):
      self.button_open_camera.clicked.connect(self.button_open_camera_click)
      self.butoon_recognition.clicked.connect(self.button_recognition_click)
      self.timer_camera.timeout.connect(self.show_camera)

    def button_open_camera_click(self):
      if self.timer_camera.isActive() == False:
            self.cap.open(0)
            self.timer_camera.start(30)
            self.button_open_camera.setText(u'关闭相机')
      else:
            self.timer_camera.stop()
            self.cap.release()
            self.label_show_roi.clear()
            self.label_show_ret.clear()
            self.label_show_recognition.setText('0')
            self.button_open_camera.setText(u'打开相机')

    def button_recognition_click(self):
      descirptor_in_use = abs(self.fourier_result)
      fd_test = np.zeros((1, 31))
      temp = descirptor_in_use
      for k in range(1, len(descirptor_in_use)):
            fd_test = int(100 * descirptor_in_use / temp)
      efd_test = np.zeros((1, 15))
      for k in range(1, len(self.efd_result)):
            temp = np.sqrt(self.efd_result ** 2 + self.efd_result ** 2) + np.sqrt(
                self.efd_result ** 2 + self.efd_result ** 2)
            efd_test = (int(1000 * temp))
      test_knn, test_svm = cf.test_fd(fd_test)
      print("test_knn =", test_knn)
      print("test_svm =", test_svm)
      test_knn_efd, test_svm_efd = cf.test_efd(efd_test)
      print("test_knn_efd =", test_knn_efd)
      print("test_svm_efd =", test_svm_efd)
      num = *11
      num] += 1
      num] += 1
      num] += 1
      num] += 1
      res = 0
      for i in range(1, 11):
            if num >= 2:
                res = i
                break
      print(res)
      self.label_show_recognition.setText(str(res))
      if res == 1:
            self.music()# 识别出手势为一时,开始播放音乐
            # t2 = threading.Thread(target=self.music())
            # t2.start()

    def music(self):
      pygame.mixer.init()
      # 加载音乐
      pygame.mixer.music.load("music/demo1.mp3")
      while True:
            # 检查音乐流播放,有返回True,没有返回False
            # 如果没有音乐流则选择播放
            if pygame.mixer.music.get_busy() == False:
                pygame.mixer.music.play()
                # time.sleep(10)
                # pygame.mixer.music.pause()

    def show_camera(self):
      width, height = 300, 300# 设置拍摄窗口大小
      x0, y0 = 300, 100# 设置选取位置
      flag, frame = self.cap.read()
      roi, res, ret, self.fourier_result, self.efd_result = pic.binaryMask(frame, x0, y0, width, height)
      roi = cv2.cvtColor(roi, cv2.COLOR_BGR2RGB)
      show_roi = QImage(roi.data, roi.shape, roi.shape, QImage.Format_RGB888)
      show_ret = QImage(ret.data, ret.shape, ret.shape, QImage.Format_Grayscale8)
      self.label_show_roi.setPixmap(QPixmap.fromImage(show_roi))
      self.label_show_ret.setPixmap(QPixmap.fromImage(show_ret))


    def closeEvent(self, QCloseEvent):
      reply = QMessageBox.question(self, 'Message',"Are you sure to quit?",
                                     QMessageBox.Yes |QMessageBox.No, QMessageBox.No)
      if reply == QMessageBox.Yes:
            if self.cap.isOpened():
                self.cap.release()
            if self.timer_camera.isActive():
                self.timer_camera.stop()
            QCloseEvent.accept()
      else:
            QCloseEvent.ignore()

    def center(self):
      qr = self.frameGeometry()
      cp = QDesktopWidget().availableGeometry().center()
      qr.moveCenter(cp)
      self.move(qr.topLeft())

if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = myWindow()
    win.show()
    sys.exit(app.exec())
这里是一段通过手势判断来播放音乐的代码,我只放出了关键代码,图像处理的就没放出来。界面使用PyQt5做的,当我点击开始预测的时候,也就执行到了def button_recognition_click(self):这个函数,然后如果识别到了我的手为1,就开始调用Music()播放音乐,不过现在的问题是播放之后PyQt5的界面和识别手势的程序就崩了,不能运行了,只能一直播放音乐,直到他结束,但是我想做的功能是,还想通过其他手势让他暂停播放,手势识别程序崩了之后,这一功能就无法实现,请问这是什么原因,该怎么解决呢

无敌VS小嘟嘟 发表于 2020-1-6 15:44

辛苦了   感谢分享

abs9668 发表于 2020-1-6 15:51


谢谢分享

NvidiaChina 发表于 2020-1-6 16:06

路过围观一下

戒心 发表于 2020-1-6 16:45

围观大牛围观

学惭淹贯 发表于 2020-1-6 18:59

还有这么高端的操作,厉害!!

rosoon 发表于 2020-1-10 11:28

膜拜大神~!~!
页: [1]
查看完整版本: 手势识别音乐播放