如何解决如何在视频的GUI上显示文本
下面的我的代码在按快照按钮的视频上生成检测到的文本。我想学习如何在实时视频上打印生成的文本。我可以在没有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,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,height,bytesPerLine,QImage.Format_RGB888)
image = image.rgbSwapped()
return image
def paintEvent(self,event):
painter = QtGui.QPainter(self)
painter.drawImage(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()
解决方法
使用要绘制的文本创建一个实例变量(或属性),然后在文本更改时调用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,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'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。