Source code for QVideo.demos.compositedemo

#!/usr/bin/env python3
'''Camcorder demo with trackpy overlay and composite recording.

Run directly::

    python -m QVideo.demos.compositedemo

When the "Composite" checkbox is checked, the DVR records the rendered
scene — video frame plus trackpy particle markers — instead of raw
camera frames.
'''

from qtpy import QtCore, QtWidgets
from QVideo.QCamcorder import QCamcorder
from QVideo.lib import QCameraTree
from QVideo.overlays import QTrackpyWidget


__all__ = ['CompositeDemo']


[docs] class CompositeDemo(QCamcorder): '''Camcorder with a trackpy overlay and composite-recording toggle. Extends :class:`~QVideo.QCamcorder.QCamcorder` by adding a :class:`~QVideo.overlays.trackpy.QTrackpyWidget` control panel and a "Composite" checkbox to the controls column. When the checkbox is unchecked (default), the DVR records raw camera frames as usual. When checked, :attr:`~QVideo.lib.QVideoScreen.QVideoScreen.composite` is enabled on the screen and the DVR is switched to record from the screen, capturing each displayed frame with the trackpy markers composited in. Parameters ---------- cameraWidget : QCameraTree Camera control tree providing the video source. **kwargs : Additional keyword arguments forwarded to :class:`~QVideo.QCamcorder.QCamcorder`. ''' def __init__(self, cameraWidget: QCameraTree, **kwargs) -> None: super().__init__(cameraWidget, **kwargs) self.trackpy = QTrackpyWidget(self) self.trackpy.source = self.source self.screen.addOverlay(self.trackpy.overlay) self._compositeCheck = QtWidgets.QCheckBox('Composite') self._compositeCheck.toggled.connect(self._onCompositeToggled) self.controls.layout().addWidget(self.trackpy) self.controls.layout().addWidget(self._compositeCheck) @QtCore.Slot(bool) def _onCompositeToggled(self, checked: bool) -> None: '''Switch between raw and composite recording. Parameters ---------- checked : bool ``True`` to record the rendered scene (video + overlay); ``False`` to record raw camera frames. ''' self.screen.composite = checked self.dvr.source = self.screen if checked else self.source
def main() -> None: # pragma: no cover '''Launch the composite demo with an interactively chosen camera.''' import sys import pyqtgraph as pg from QVideo.lib import choose_camera pg.mkQApp() camera = choose_camera().start() try: widget = CompositeDemo(camera) except ImportError as e: print(f'Error: {e}', file=sys.stderr) sys.exit(1) widget.show() pg.exec() if __name__ == '__main__': # pragma: no cover main()