【问题标题】:How to Show Text on GUI on Video如何在视频的 GUI 上显示文本
【发布时间】:2020-08-12 23:23:29
【问题描述】:

我下面的代码在按下快照按钮的视频上生成检测到的文本。我想学习如何在实时视频上打印生成的文本。我可以在没有 GUI 的情况下做到这一点,但将功能连接到 GUI 是我的问题。我要适应的是:

painter.drawText(0, 20, "text"); 

它有效,但仅适用于静态文本。我的文本随着按钮的按下而改变,我想通过按下按钮来改变文本。

import sys
from os import path

import cv2
import numpy as np

from PyQt5 import QtCore
from PyQt5 import QtWidgets
from PyQt5 import QtGui

import pytesseract
from PIL import Image
from pytesseract import image_to_string
from gtts import gTTS
import os


pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"


tessdata_dir_config = r'--tessdata-dir "C:\Program Files\Tesseract-OCR\tessdata"'



class RecordVideo(QtCore.QObject):
    image_data = QtCore.pyqtSignal(np.ndarray)

    def __init__(self, parent=None):
        super().__init__(parent)
        self.camera = cv2.VideoCapture(0)

        self.timer = QtCore.QBasicTimer()

    def start_recording(self):
        self.timer.start(0, self)

    
    def timerEvent(self, event):
        if (event.timerId() != self.timer.timerId()):
            return

        read, data = self.camera.read()
        if read:
            self.image_data.emit(data)
    def framesave(self):
        
        read, data = self.camera.read()
        if read:
            cv2.imwrite('a.png',data)
            img=Image.fromarray(data)
            img.load()
            
            text=pytesseract.image_to_string(img, lang='spa', config=tessdata_dir_config)
        


class FaceDetectionWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.image = QtGui.QImage()
        self._red = (0, 0, 255)
        self._width = 2
        self._min_size = (30, 30)


    def image_data_slot(self, image_data):


        
        self.image = self.get_qimage(image_data)
        if self.image.size() != self.size():
            self.setFixedSize(self.image.size())

        self.update()
    
        
        
    def get_qimage(self, image: np.ndarray):
        height, width, colors = image.shape
        bytesPerLine = 3 * width
        QImage = QtGui.QImage

        image = QImage(image.data,
                       width,
                       height,
                       bytesPerLine,
                       QImage.Format_RGB888)

        image = image.rgbSwapped()
        return image

    def paintEvent(self, event):
        painter = QtGui.QPainter(self)
        painter.drawImage(0, 0, self.image)
        self.image = QtGui.QImage()


class MainWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        
        self.face_detection_widget = FaceDetectionWidget()

        # TODO: set video port
        self.record_video = RecordVideo()

        image_data_slot = self.face_detection_widget.image_data_slot
        self.record_video.image_data.connect(image_data_slot)

        layout = QtWidgets.QVBoxLayout()

        layout.addWidget(self.face_detection_widget)
        self.run_button = QtWidgets.QPushButton('Start')
        layout.addWidget(self.run_button)

        self.run_button.clicked.connect(self.record_video.start_recording)

        self.screenshot = QtWidgets.QPushButton('Snap Shot')
        layout.addWidget(self.screenshot)

        self.screenshot.clicked.connect(self.record_video.framesave)
        self.setLayout(layout)


    
def main():
    app = QtWidgets.QApplication(sys.argv)

    main_window = QtWidgets.QMainWindow()
    main_widget = MainWidget()
    main_window.setCentralWidget(main_widget)
    main_window.show()

    sys.exit(app.exec_())


if __name__ == '__main__':

    main()

【问题讨论】:

    标签: video text pyqt5


    【解决方案1】:

    使用要绘制的文本创建一个实例变量(或属性),然后在文本更改时调用update()

    class FaceDetectionWidget(QtWidgets.QWidget):
        _text = ''
    
        # ...
    
        @property
        def text(self):
            return self._text
    
        @text.setter
        def text(self, text):
            if text == self._text:
                return
            self._text = text
            self.update()
    
        # ...
    
        def paintEvent(self, event):
            painter = QtGui.QPainter(self)
            painter.drawImage(0, 0, self.image)
            self.image = QtGui.QImage()
            if self._text:
                painter.drawText(0, 20, self._text)
    
    
    class MainWidget(QtWidgets.QWidget):
        def __init__(self, parent=None):
            super().__init__(parent)
            # ...
            self.testButton = QtWidgets.QPushButton('write text')
            layout.addWidget(self.testButton)
            self.testButton.clicked.connect(self.addText)
    
        def addText(self):
            self.face_detection_widget.text = 'some random text'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-18
      相关资源
      最近更新 更多