I want to capture image from camera.I got a way to do it.But it works on PyQt5 successfully.failed on PySide2.
Here's the PySide2 code
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_())
Here's the PyQt5 code
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_())
Both code run successfully.
present function called in PyQt5, not called in PySide2.
Is there any difference between the usage of PySide2 and PyQt5.
Who can tell me why it seem like this?Thanks.