pyqt5+opencv对图片和视频的简单处理

功能

读取图片

读取视频

录制视频

正文

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_())

说明

1,用了文件对话框,选择视频或者图片文件。

2,opencv读的是图片,没有声音,用了第三方库ffpyplayer,我运行的时候有bug

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

不知道什么情况,没有解决

操作

主页面

pyqt5+opencv对图片和视频的简单处理_第1张图片

打开图片

pyqt5+opencv对图片和视频的简单处理_第2张图片

选择不同的图片,label会根据图片动态变化大小。

pyqt5+opencv对图片和视频的简单处理_第3张图片

你可能感兴趣的:(qt5,opencv,python)