0

我想从相机捕获图像。我有办法做到这一点。但它在 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 的用法有什么区别吗?

谁能告诉我为什么会这样?谢谢。

4

0 回答 0