#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