2022.8.01 pyqt5 동영상 캡처프로그램

정성우·2022년 8월 1일
0

학습내용
pyqt5로 윈도우창에서 gui를 보여주려고 한다.

#PyQt5 라이브러리
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QPixmap, QImage
#open cv에서는 영상을 프레임단위로 가져오기 때문에 sleep을 통해서 프레임을 연결시켜주어 영상으로 보이게 만드는 것임
from time import sleep
#비디오 재생을 위해 스레드 생성
import threading
#화면을 윈도우에 띄우기 위해 sys접근
import sys

#open cv 라이브러리
import cv2


def clicked_slot():
    print('clicked')
class Ui_MainWindow(QtWidgets.QWidget):
    #기본적으로 창만드는 작업
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("ForSign")
        MainWindow.resize(500, 300) #창 사이즈
        MainWindow.move(500,500) #창 뜰 때 위치
        #이 아래로는 나도 잘 모름 화면을 구성하고 영상을 재생하는 위젯을 만드는거 같음 유지해두는게 나을듯
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.video_viewer_label = QtWidgets.QLabel(self.centralwidget)
        self.video_viewer_label.setGeometry(QtCore.QRect(10, 10, 400, 300))

        MainWindow.setCentralWidget(self.centralwidget)

        self.btn1=QtWidgets.QPushButton('캡처',MainWindow)
        self.btn1.clicked.connect(clicked_slot)
        self.btn2=QtWidgets.QPushButton('캡처 취소',MainWindow)
        self.btn2.clicked.connect(clicked_slot)
        self.btn3=QtWidgets.QPushButton('저장',MainWindow)
        self.btn3.clicked.connect(clicked_slot)
        self.btn4=QtWidgets.QPushButton('종료',MainWindow)
        self.btn4.clicked.connect(clicked_slot)
        vbox = QtWidgets.QVBoxLayout()
        hbox= QtWidgets.QHBoxLayout()
        hbox.addStretch(2)
        hbox.addWidget(self.btn1)
        hbox.addStretch(2)
        hbox.addWidget(self.btn2)
        hbox.addStretch(2)
        hbox.addWidget(self.btn3)
        hbox.addStretch(2)
        hbox.addWidget(self.btn4)
        self.setLayout(hbox)


    def Video_to_frame(self, MainWindow):

        cap = cv2.VideoCapture('iu.mp4') #저장된 영상 가져오기 프레임별로 계속 가져오는 듯

        ###cap으로 영상의 프레임을 가지고와서 전처리 후 화면에 띄움###
        while True:
            self.ret, self.frame = cap.read() #영상의 정보 저장
            if self.ret:
                self.rgbImage = cv2.cvtColor(self.frame, cv2.COLOR_BGR2RGB) #프레임에 색입히기
                self.convertToQtFormat = QImage(self.rgbImage.data, self.rgbImage.shape[1], self.rgbImage.shape[0],
                                                QImage.Format_RGB888)

                self.pixmap = QPixmap(self.convertToQtFormat)
                self.p = self.pixmap.scaled(400, 300, QtCore.Qt.IgnoreAspectRatio) #프레임 크기 조정

                self.video_viewer_label.setPixmap(self.p)
                self.video_viewer_label.update() #프레임 띄우기

                sleep(0.01)  # 영상 1프레임당 0.01초로 이걸로 영상 재생속도 조절하면됨 0.02로하면 0.5배속인거임

            else:
                break

        cap.release()
        cv2.destroyAllWindows()

    # video_to_frame을 쓰레드로 사용
    #이게 영상 재생 쓰레드 돌리는거 얘를 조작하거나 함수를 생성해서 연속재생 관리해야할듯
    def video_thread(self, MainWindow):
        thread = threading.Thread(target=self.Video_to_frame, args=(self,))
        thread.daemon = True  # 프로그램 종료시 프로세스도 함께 종료 (백그라운드 재생 X)
        thread.start()


#메인문
if __name__ == "__main__":
    import sys

    #화면 만들려면 기본으로 있어야 하는 코드들 건들지않기
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)

    #영상 스레드 시작
    ui.video_thread(MainWindow)

    #창 띄우기
    MainWindow.show()

    sys.exit(app.exec_())

실행결과

학습한 내용 중 어려웠던 점 또는 해결못한 것들
영상 재생은 잘되나 버튼이 4개가 생성되야하는데 겹쳐서 안보인다.
아직 기능구현은 하지 못했다.

해결방법 작성
공부하면서 마무리 할예정

학습 소감
기초부터 다시 봐야할것같다.

0개의 댓글