Simple processing of pictures and videos with pyqt5+opencv

Function

Read pictures

read video

Record video

text

import os
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import cv2 as cv
import numpy as np
from init import picturepath
from ffpyplayer.player import MediaPlayer
# 路径有中文,cv,imread,读不出
def imread(path):
    img = cv.imdecode(np.fromfile(path, dtype=np.uint8), -1)
    return img


class a(QWidget):
    def __init__(self):
        super().__init__()
        self.initui()

    def initui(self):
        self.resize(1085, 729)
        self.setWindowTitle("视频与图片")

        self.play_video = QPushButton(self)
        self.play_video.setText("播放视频")
        self.play_video.clicked.connect(self.ok)
        self.play_video.setGeometry(30, 40, 93, 28)

        self.open_pic = QPushButton(self)
        self.open_pic.clicked.connect(self.pic)
        self.open_pic.setGeometry(130, 40, 93, 28)

        self.open_capture = QPushButton(self)
        self.open_capture.setGeometry(240, 40, 93, 28)
        self.open_capture.setText("录制视频")
        self.open_capture.clicked.connect(self.get_video)


        self.save = QLineEdit(self)
        self.save.setPlaceholderText('写视频的名字(1.mp4)')
        self.save.setGeometry(350, 40, 160, 28)

        self.label = QLabel(self)
        self.open_pic.setText("打开图片")
# 录制视频
    def get_video(self):
        if self.save.text():
            video = cv.VideoCapture(0)
            fourcc = cv.VideoWriter_fourcc(*'mp4v')
            save = cv.VideoWriter(f'{self.save.text()}.mp4', fourcc, 24, (640, 480))
            while True:
                ok, frame = video.read()
                if not ok:
                    break
                self.label.setGeometry(30,100,640,480)
                data = cv.cvtColor(frame, cv.COLOR_RGB2BGR)
                img = QImage(frame,640,400, QImage.Format_RGB888)
                self.label.setPixmap(QPixmap(img).scaled(640,480))
                save.write(frame)
                if cv.waitKey(1) == 27:
                    break
            video.release()
            save.release()
            cv.destroyAllWindows()
        else:
            QMessageBox.information(self, '消息', '视频的名字为空', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
# 打开视频,有声音
    def ok(self):
        filename, ok = QFileDialog.getOpenFileName(self, '打开视频', os.getcwd(), '(*.mp4 *.avi)')
        if ok:
            video = cv.VideoCapture(filename)
            z = video.get(5)
            player=MediaPlayer(filename)
            while True:
                yes,data = video.read()
                frame, val=player.get_frame()
                if val=='eof':
                    break
                if not yes:
                    break
                data = cv.cvtColor(data, cv.COLOR_BGR2RGB)
                h,w,_=data.shape
                self.label.setGeometry(500,0, h, w)
                img = QImage(data.data,w,h, QImage.Format_RGB888)
                self.label.setPixmap(QPixmap(img).scaled(w,h))
                key = cv.waitKey(1000 // int(z))
            video.release()
            cv.destroyAllWindows()
            img = imread(picturepath+'/31.jpg')
            w, h, _= img.shape
            self.label.setGeometry(30, 100,int(h/2),int(w/2))
            self.label.setPixmap(QPixmap(picturepath+'/31.jpg').scaled(self.label.width(),self.label.width(),self.label.height()))
        else:
            pass
# 打开图片
    def pic(self):
        filename, ok = QFileDialog.getOpenFileName(self, '打开图片', os.getcwd(), '(*.jpg *.png)')
        if ok:
            img = imread(filename)
            w, h, _= img.shape
            self.label.setGeometry(30, 100,int(h/2),int(w/2))
            self.label.setPixmap(QPixmap(filename).scaled(self.label.width(),self.label.height()))
        else:
            pass


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle(QStyleFactory.create('Fusion'))
    a = a()
    a.show()
    sys.exit(app.exec_())

illustrate

1. Use the file dialog box to select a video or picture file.

2. Opencv reads pictures without sound. It uses the third-party library ffpyplayer. There is a bug when I run it.

[ffpyplayer_abuffersink @ 000002446343da40] Removing channel layout 0x3, redundant with 2 channels

I don’t know what the situation is, there is no solution

operate

home page

Open picture

Select different pictures, and the label will dynamically change size according to the picture.

Guess you like

Origin blog.csdn.net/qq_63401240/article/details/128821974