Kamera-Übersicht
Die Qt Multimedia API bietet eine Reihe von kamerabezogenen Klassen, mit denen Sie auf Bilder und Videos von Kameras mobiler Geräte oder Webkameras zugreifen können. Es gibt sowohl C++- als auch QML-APIs für gängige Aufgaben.
Kamera-Funktionen
Um die Kameraklassen verwenden zu können, ist ein kurzer Überblick über die Funktionsweise einer Kamera erforderlich. Wenn Sie damit bereits vertraut sind, können Sie zu den Details der Kamera-Implementierung übergehen. Eine ausführlichere Erklärung der Funktionsweise einer Kamera finden Sie in dem folgenden YouTube-Clip.
Die Objektiv-Baugruppe
An einem Ende der Kamera befindet sich die Objektivbaugruppe (eine oder mehrere Linsen, die so angeordnet sind, dass sie das Licht auf den Sensor fokussieren). Die Objektive selbst können manchmal bewegt werden, um Dinge wie Fokus und Zoom einzustellen. Sie können aber auch in einer Anordnung fixiert sein, die ein ausgewogenes Verhältnis zwischen Schärfe und Kosten gewährleistet.
Einige Objektive können automatisch so eingestellt werden, dass ein Objekt in verschiedenen Entfernungen von der Kamera fokussiert werden kann. Dazu wird in der Regel gemessen, wie scharf ein bestimmter Bereich des Bildes ist, und dann die Objektivbaugruppe so eingestellt, dass die maximale Schärfe erreicht wird. In manchen Fällen verwendet die Kamera dafür immer die Mitte des Bildes. In anderen Fällen ist es möglich, den Zielfokusbereich festzulegen. Einige Beispiele für diese Funktion sind:
- Gesichtszoom: Mit Hilfe von Computer Vision werden ein oder mehrere Gesichter erkannt und als Ziel verwendet.
- Zoomen durch Berühren: Ermöglicht es dem Benutzer, einen Bereich manuell über den Vorschaubildschirm auszuwählen.
Der Sensor
Sobald das Licht auf den Sensor trifft, wird es in digitale Pixel umgewandelt. Dieser Prozess kann von einer Reihe von Faktoren abhängen, hängt aber letztlich von zwei Dingen ab:
- Die Zeit, die für die Umwandlung benötigt wird. Dies wird auch als Belichtungszeit bezeichnet.
- Wie hell das Licht ist.
Je länger eine Umwandlung dauern darf, desto besser ist die Bildqualität. Die Verwendung eines Blitzes kann dazu beitragen, dass mehr Licht auf den Sensor trifft und dieser die Pixel schneller umwandeln kann, was eine bessere Qualität bei gleichem Zeitaufwand bedeutet. Umgekehrt können Sie mit einer längeren Umwandlungszeit auch Fotos in dunkleren Umgebungen aufnehmen, solange die Kamera ruhig steht. Wenn sich die Kamera bewegt, während der Sensor aufnimmt, wird das Bild unscharf.
Bildverarbeitung
Nachdem das Bild vom Sensor erfasst wurde, führt die Kamera-Firmware verschiedene Bildverarbeitungsaufgaben durch, um verschiedene Sensoreigenschaften, die aktuelle Beleuchtung und die gewünschten Bildeigenschaften zu kompensieren. Schnellere Pixelumwandlungszeiten des Sensors können zu digitalem Rauschen führen, so dass je nach den Einstellungen des Kamerasensors eine gewisse Bildverarbeitung durchgeführt werden kann, um dieses zu entfernen.
Auch die Farbe des Bildes kann in dieser Phase angepasst werden, um unterschiedliche Lichtquellen auszugleichen - Leuchtstoffröhren und Sonnenlicht lassen ein und dasselbe Objekt sehr unterschiedlich erscheinen, so dass das Bild auf der Grundlage des Weißabgleichs des Bildes angepasst werden kann (aufgrund der unterschiedlichen Farbtemperaturen der Lichtquellen).
Auch einige Arten von "Spezialeffekten" können in diesem Stadium durchgeführt werden. Es können Schwarzweiß-, Sepia- oder "Negativ"-Bilder erzeugt werden.
Aufnahme für die Nachwelt
Sobald ein perfekt fokussiertes, belichtetes und verarbeitetes Bild erstellt wurde, kann es für einen guten Zweck verwendet werden. Kamerabilder können durch Anwendungscode weiterverarbeitet werden (z. B. zur Erkennung von Strichcodes oder zum Zusammenfügen eines Panoramabildes), in einem gängigen Format wie JPEG gespeichert oder zur Erstellung eines Films verwendet werden. Für viele dieser Aufgaben gibt es Klassen, die sie unterstützen.
Details zur Kamera-Implementierung
Erkennen und Auswählen einer Kamera
Bevor Sie die Kamera-APIs verwenden, sollten Sie prüfen, ob zur Laufzeit eine Kamera verfügbar ist. Wenn keine verfügbar ist, können Sie kamerabezogene Funktionen in Ihrer Anwendung deaktivieren. Um diese Prüfung in C++ durchzuführen, verwenden Sie die Funktion QMediaDevices::videoInputs(), wie im folgenden Beispiel gezeigt:
bool checkCameraAvailability() { if (QMediaDevices::videoInputs().count() > 0) return true; else return false; }
Greifen Sie auf eine Kamera zu, indem Sie die Klasse QCamera in C++ oder den Typ Camera in QML verwenden.
Wenn mehrere Kameras verfügbar sind, können Sie angeben, welche davon verwendet werden soll.
In C++:
const QList<QCameraDevice> cameras = QMediaDevices::videoInputs(); for (const QCameraDevice &cameraDevice : cameras) { if (cameraDevice.description() == "mycamera") camera = new QCamera(cameraDevice); }
In QML können Sie die Kamera auswählen, indem Sie die Eigenschaft Camera::cameraDevice festlegen. Sie können eine Kamera auch anhand ihrer physischen Position auf dem System und nicht anhand von Kamerainformationen auswählen. Dies ist bei mobilen Geräten nützlich, die oft eine nach vorne und eine nach hinten gerichtete Kamera haben.
In C++:
camera = new QCamera(QCameraDevice::FrontFace);
In QML können Sie die Eigenschaft Camera
cameraDevice einstellen. Verfügbare Kameras können mit MediaDevices.videoInputs abgerufen werden.
In QML:
Camera { position: Camera.FrontFace }
Wenn sowohl QCameraDevice als auch Position nicht angegeben sind, wird die Standardkamera verwendet. Auf Desktop-Plattformen wird die Standardkamera vom Benutzer in den Systemeinstellungen festgelegt. Auf einem mobilen Gerät ist normalerweise die Kamera auf der Rückseite die Standardkamera. Sie können die Standardkamera mit QMediaDevices::defaultVideoInput() oder MediaDevices.defaultVideoInput in QML abrufen.
Vorschau
Auch wenn es nicht unbedingt notwendig ist, ist es oft nützlich, zu sehen, worauf die Kamera zeigt. Dies wird als Vorschau bezeichnet.
Je nachdem, ob Sie QML oder C++ verwenden, können Sie dies auf verschiedene Weise tun. In QML können Sie Camera und videoOutput zusammen verwenden, um eine captureSession zu überwachen.
Item { VideoOutput { id: output anchors.fill: parent } CaptureSession { videoOutput: output Camera { // You can adjust various settings in here } } }
In C++ hängt Ihre Wahl davon ab, ob Sie Widgets oder QGraphicsView verwenden. Die Klasse QVideoWidget wird im Fall von Widgets verwendet, und QGraphicsVideoItem ist nützlich für QGraphicsView.
QMediaCaptureSession captureSession; camera = new QCamera; captureSession.setCamera(camera); viewfinder = new QVideoWidget; captureSession.setVideoOutput(viewfinder); viewfinder->show(); camera->start(); // to start the camera
Für fortgeschrittene Anwendungen (wie z. B. die Verarbeitung von Vorschaubildern, was die Erkennung von Objekten oder Mustern ermöglicht) können Sie auch Ihre eigene QVideoSink verwenden und diese als videoOutput für die QMediaCaptureSession festlegen. In diesem Fall müssen Sie das Vorschaubild selbst rendern, indem Sie die vom videoFrameChanged()-Signal empfangenen Daten verarbeiten.
QMediaCaptureSession captureSession; camera = new QCamera; captureSession.setCamera(camera); mySink = new QVideoSink; captureSession.setVideoOutput(mySink); camera->start(); // MyVideoSink::setVideoFrame(..) will be called with video frames
Auf mobilen Geräten ist das Vorschaubild standardmäßig so ausgerichtet wie das Gerät selbst. Wenn der Benutzer also das Gerät dreht, wechselt das Vorschaubild zwischen Hoch- und Querformat. Sobald Sie die Aufnahme starten, wird die Ausrichtung fixiert. Um eine schlechte Benutzererfahrung zu vermeiden, sollten Sie auch die Ausrichtung der Benutzeroberfläche der Anwendung während der Aufnahme sperren. Dies kann mit der Eigenschaft contentOrientation von QWindow erreicht werden.
Standbilder
Nachdem wir einen Sucher eingerichtet und ein fotogenes Objekt gefunden haben, müssen wir ein neues QImageCapture Objekt initialisieren, um ein Bild aufzunehmen. Anschließend muss nur noch die Kamera gestartet und das Bild aufgenommen werden.
QMediaCaptureSession captureSession; camera = new QCamera; captureSession.setCamera(camera); imageCapture = new QImageCapture; captureSession.setImageCapture(imageCapture); camera->start(); // Viewfinder frames start flowing //on shutter button pressed imageCapture->capture();
Filme
Zuvor haben wir Code gesehen, der die Aufnahme eines Standbildes ermöglicht. Die Aufnahme von Videos erfordert die Verwendung eines QMediaRecorder Objekts.
Um ein Video aufzunehmen, müssen wir wie zuvor ein Kameraobjekt erstellen, aber dieses Mal werden wir nicht nur einen Sucher erstellen, sondern auch ein Medienrekorderobjekt initialisieren.
QMediaCaptureSession captureSession; camera = new QCamera; captureSession.setCamera(camera); recorder = new QMediaRecorder(camera); captureSession.setRecorder(recorder); camera->start(); // setup output format for the recorder QMediaFormat format(QMediaFormat::MPEG4); format.setVideoCodec(QMediaRecorder::VideoCodec::H264); format.setAudioCodec(QMediaRecorder::AudioCodec::MP3); recorder->setMediaFormat(settings); //on shutter button pressed recorder->record(); // sometime later, or on another press recorder->stop();
Signale vom QMediaRecorder können mit Slots verbunden werden, um auf Änderungen im Status des Kodierungsprozesses oder auf Fehlerereignisse zu reagieren. Die Aufnahme beginnt, wenn QMediaRecorder::record() aufgerufen wird. Daraufhin wird das Signal recorderStateChanged() ausgegeben. Die Aufzeichnung wird durch die Slots record(), stop() und pause() von QMediaRecorder gesteuert.
Steuerung der Imaging-Pipeline
Nachdem nun die Grundlagen der Aufnahme von Bildern und Filmen geklärt sind, gibt es eine Reihe von Möglichkeiten, die Imaging-Pipeline zu steuern, um einige interessante Techniken zu implementieren. Wie bereits erläutert, wirken mehrere physikalische und elektronische Elemente zusammen, um die endgültigen Bilder zu bestimmen, und Sie können sie mit verschiedenen Klassen steuern.
Fokus und Zoom
QCamera ermöglicht es Ihnen, die allgemeine Fokuspolitik mit Hilfe der Enums für die FocusMode festzulegen. FocusMode befasst sich mit Einstellungen wie QCamera::FocusModeAuto und QCamera::FocusModeInfinity.
Für Kamerahardware, die dies unterstützt, ermöglicht QCamera::FocusModeAutoNear die Abbildung von Dingen, die sich in der Nähe des Sensors befinden. Dies ist bei Anwendungen wie der Barcode-Erkennung oder dem Scannen von Visitenkarten nützlich.
Zusätzlich zur Scharfstellung können Sie mit QCamera alle verfügbaren Zoomfunktionen über setZoomFactor() oder zoomTo() steuern. Der verfügbare Zoombereich kann begrenzt oder ganz auf 1:1 festgelegt sein. Der zulässige Bereich kann mit minimumZoomFactor() und maximumZoomFactor() überprüft werden.
Belichtung, Verschlusszeit und Blitz
Es gibt eine Reihe von Einstellungen, die sich auf die Lichtmenge, die auf den Kamerasensor trifft, und damit auf die Qualität des Bildes auswirken.
Die wichtigsten Einstellungen für die automatische Bildaufnahme sind exposure mode und flash mode. Mehrere andere Einstellungen (z. B. ISO-Einstellung und Belichtungszeit) werden in der Regel automatisch verwaltet, können aber auf Wunsch auch außer Kraft gesetzt werden.
Schließlich können Sie mit dieser Klasse auch die Blitzhardware (falls vorhanden) steuern. In einigen Fällen kann die Hardware auch als Taschenlampe dienen.
Bildverarbeitung
Mit der Klasse QCamera können Sie den Bildverarbeitungsteil der Pipeline anpassen. Diese Einstellungen umfassen:
- white balance (auch bekannt als Farbtemperatur)
Die meisten Kameras unterstützen automatische Einstellungen für alle diese Parameter, so dass Sie diese nicht anpassen müssen, es sei denn, der Benutzer wünscht eine bestimmte Einstellung.
Abbrechen asynchroner Vorgänge
Verschiedene Vorgänge, wie die Bildaufnahme und die automatische Fokussierung, laufen asynchron ab. Diese Vorgänge können oft durch den Start eines neuen Vorgangs abgebrochen werden, sofern dies von der Kamera unterstützt wird.
Beispiele
Es sind sowohl C++- als auch QML-Beispiele verfügbar.
C++ Beispiele
Zeigt, wie man ein Standbild oder ein Video aufnimmt. |
QML-Beispiele
Diese auf Qt Quick basierende Anwendung zeigt, wie die API verwendet wird, um ein Standbild oder ein Video aufzunehmen. | |
Aufnahme von Audio und Video mit Qt Quick. |
Referenz-Dokumentation
C++-Klassen
Schnittstelle für Systemkamera-Geräte | |
Allgemeine Informationen über Kamerageräte | |
Beschreibt ein Videoformat, das von einem Kameragerät unterstützt wird | |
Wird für die Aufzeichnung von Medieninhalten verwendet |
QML-Typen
Eine Schnittstelle für Kameraeinstellungen in Bezug auf Fokus und Zoom | |
Eine Schnittstelle für die Aufnahme von Kamerabildern |
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.