Возможно, ошибка в PySide2, QCamera, QAbstractVideoSurface

#python #pyqt5 #pyside2 #qcamera

#python #pyqt5 #pyside2 #qcamera

Вопрос:

Я хочу захватить изображение с камеры.У меня есть способ сделать это.Но он успешно работает на PyQt5.сбой в PySide2.

Вот код PySide2

 import sys  
from PySide2.QtWidgets import QWidget, QApplication  
from PySide2.QtMultimedia import QCamera, QAbstractVideoSurface, QVideoSurfaceFormat, QVideoFrame

class CameraFrameGrabber(QAbstractVideoSurface):
    def __init__(self, parent=None):
        super(CameraFrameGrabber, self).__init__(parent)
        print('init')

    def supportedPixelFormats(self, type):
        print("supportedPixelFormats() called")
        print("supportedPixelFormats() finished")
        return [QVideoFrame.Format_ARGB32, QVideoFrame.Format_ARGB32_Premultiplied,
                QVideoFrame.Format_RGB32, QVideoFrame.Format_RGB24, QVideoFrame.Format_RGB565,
                QVideoFrame.Format_RGB555, QVideoFrame.Format_ARGB8565_Premultiplied,
                QVideoFrame.Format_BGRA32, QVideoFrame.Format_BGRA32_Premultiplied, QVideoFrame.Format_BGR32,
                QVideoFrame.Format_BGR24, QVideoFrame.Format_BGR565, QVideoFrame.Format_BGR555,
                QVideoFrame.Format_BGRA5658_Premultiplied, QVideoFrame.Format_AYUV444,
                QVideoFrame.Format_AYUV444_Premultiplied, QVideoFrame.Format_YUV444,
                QVideoFrame.Format_YUV420P, QVideoFrame.Format_YV12, QVideoFrame.Format_UYVY,
                QVideoFrame.Format_YUYV, QVideoFrame.Format_NV12, QVideoFrame.Format_NV21,
                QVideoFrame.Format_IMC1, QVideoFrame.Format_IMC2, QVideoFrame.Format_IMC3,
                QVideoFrame.Format_IMC4, QVideoFrame.Format_Y8, QVideoFrame.Format_Y16,
                QVideoFrame.Format_Jpeg, QVideoFrame.Format_CameraRaw, QVideoFrame.Format_AdobeDng]

    # def isFormatSupported(self, format):
    #     print("isFormatSupported() called")

    # def start(self, format):
    #     print("start() called")

    def present(self, frame):
        print('call present')
        print(frame)
        return True

    # def stop(self):
    #     print("stop() called")
  
if __name__ == '__main__':  
    app = QApplication(sys.argv)  
    w = QWidget()  
    w.show()  
    w.setWindowTitle("Hello PyQt5")  
    the_camera = QCamera()
    the_grabber = CameraFrameGrabber()
    the_camera.setViewfinder(the_grabber)
    the_camera.start()
    sys.exit(app.exec_())  
 

Вот код PyQt5

 import sys  
from PyQt5.QtWidgets import QWidget, QApplication  
from PyQt5.QtMultimedia import QCamera, QAbstractVideoSurface, QVideoSurfaceFormat, QVideoFrame

class CameraFrameGrabber(QAbstractVideoSurface):
    def __init__(self, parent=None):
        super(CameraFrameGrabber, self).__init__(parent)
        print('init')

    def supportedPixelFormats(self, type):
        print("supportedPixelFormats() called")
        print("supportedPixelFormats() finished")
        return [QVideoFrame.Format_ARGB32, QVideoFrame.Format_ARGB32_Premultiplied,
                QVideoFrame.Format_RGB32, QVideoFrame.Format_RGB24, QVideoFrame.Format_RGB565,
                QVideoFrame.Format_RGB555, QVideoFrame.Format_ARGB8565_Premultiplied,
                QVideoFrame.Format_BGRA32, QVideoFrame.Format_BGRA32_Premultiplied, QVideoFrame.Format_BGR32,
                QVideoFrame.Format_BGR24, QVideoFrame.Format_BGR565, QVideoFrame.Format_BGR555,
                QVideoFrame.Format_BGRA5658_Premultiplied, QVideoFrame.Format_AYUV444,
                QVideoFrame.Format_AYUV444_Premultiplied, QVideoFrame.Format_YUV444,
                QVideoFrame.Format_YUV420P, QVideoFrame.Format_YV12, QVideoFrame.Format_UYVY,
                QVideoFrame.Format_YUYV, QVideoFrame.Format_NV12, QVideoFrame.Format_NV21,
                QVideoFrame.Format_IMC1, QVideoFrame.Format_IMC2, QVideoFrame.Format_IMC3,
                QVideoFrame.Format_IMC4, QVideoFrame.Format_Y8, QVideoFrame.Format_Y16,
                QVideoFrame.Format_Jpeg, QVideoFrame.Format_CameraRaw, QVideoFrame.Format_AdobeDng]

    # def isFormatSupported(self, format):
    #     print("isFormatSupported() called")

    # def start(self, format):
    #     print("start() called")

    def present(self, frame):
        print('call present')
        print(frame)
        return True

    # def stop(self):
    #     print("stop() called")
  
if __name__ == '__main__':  
    app = QApplication(sys.argv)  
    w = QWidget()  
    w.show()  
    w.setWindowTitle("Hello PyQt5")  
    the_camera = QCamera()
    the_grabber = CameraFrameGrabber()
    the_camera.setViewfinder(the_grabber)
    the_camera.start()
    sys.exit(app.exec_())  
 

Оба кода выполняются успешно.

присутствует функция, вызываемая в PyQt5, не вызываемая в PySide2.

Есть ли какая-либо разница между использованием PySide2 и PyQt5.

Кто может сказать мне, почему это так?Спасибо.

Комментарии:

1. Кажется, ошибка…

2. Я нашел тот же вопрос на веб-сайте Qt. Это ошибка в PySide2. Мне кажется, что QCamera.setViewFinder(QAbstractVideoSurface) неправильно обрабатывается PySide2 так же, как неправильно обрабатывается QMediaPlayer.setVideoOutput(QAbstractVideoSurface). Похоже, что требуется некоторый дополнительный код системы типов, чтобы заставить setViewFinder() и setVideoOutput() работать с аргументом QAbstractVideoSurface. bugreports.qt.io/browse/PYSIDE-794