本页面内容

相机概述

Qt Multimedia API 提供了许多与摄像头相关的类,因此您可以访问来自移动设备摄像头或网络摄像头的图像和视频。针对常见任务,提供了 C++ 和 QML 两种 API。

相机功能

要使用相机类,需要先快速了解相机的运作原理。如果您已经熟悉相关内容,可以跳转至“相机实现细节”部分。如需了解相机工作原理的更详细说明,请参阅以下 YouTube 视频。

镜头组件

相机组件的一端是镜头组件(由一个或多个镜头组成,其排列方式旨在将光线聚焦到传感器上)。镜头本身有时可以移动,以调整焦距和变焦等参数。在某些情况下,镜头也会被固定在特定位置,以在保持对焦精度与控制成本之间取得良好平衡。

关于注意力如何运作的动画演示

某些镜头组件可以自动调节,从而使位于不同距离处的物体始终保持清晰对焦。这通常是通过测量画面中特定区域的清晰度,然后调整镜头组件以找到峰值清晰度来实现的。在某些情况下,相机将始终以画面中心作为对焦基准。 在其他情况下,相机也可能允许用户指定目标对焦区域。该功能的一些示例包括:

  • 人脸变焦:利用计算机视觉技术检测并选定一张或多张人脸作为对焦目标。
  • 触控对焦:允许用户通过预览屏幕手动选择区域。

传感器

光线到达传感器后,会被转换为数字像素。这一过程虽受多种因素影响,但归根结底取决于以下两点:

  • 允许的转换时间长度。也称为曝光时间。
  • 光的亮度。

转换时间越长,最终的图像质量就越好。使用闪光灯有助于让更多光线照射到传感器上,从而使传感器能够更快地转换像素,在相同的时间内获得更好的图像质量。 反之,只要相机保持稳定,延长转换时间就能让你在更暗的环境中拍摄。如果传感器记录过程中相机发生位移,最终成像会出现模糊。

图像处理

图像被传感器捕捉后,相机固件会对图像进行各种图像处理,以补偿传感器的各种特性、当前光线条件以及所需的图像属性。更快的传感器像素转换速度可能会引入数字噪点,因此可以根据相机传感器的设置进行一定程度的图像处理来消除这些噪点。

在此阶段还可以调整图像的色彩,以补偿不同光源的影响——荧光灯和阳光会使同一物体呈现截然不同的外观,因此可以根据照片的白平衡(由于光源色温不同)对图像进行调整。

5个不同图像处理技术的示例。

在此阶段还可以实现某些形式的“特殊效果”。可以生成黑白、棕褐色或“负片”风格的图像。

为后世留存

最后,一旦生成了一张对焦精准、曝光恰当且已处理的图像,便可将其物尽其用。相机拍摄的图像可通过应用程序代码进行进一步处理(例如,检测条形码或拼接全景图像),也可保存为JPEG等常见格式,或用于制作视频。 其中许多任务都有相应的类来提供支持。

相机实现细节

检测和选择相机

在使用摄像头 API 之前,您应检查运行时是否可用摄像头。如果没有可用摄像头,您可以禁用应用程序中的摄像头相关功能。要在 C++ 中执行此检查,请使用 `QMediaDevices::videoInputs()` 函数,如下例所示:

bool checkCameraAvailability()
{
    return !QMediaDevices::videoInputs().isEmpty();
}

在 C++ 中使用 `QCamera ` 类,或在 QML 中使用 `Camera ` 类型来访问摄像头。

当有多个摄像头设备可用时,您可以指定要使用哪个。

在 C++ 中:

const QList<QCameraDevice> cameras = QMediaDevices::videoInputs();
for (const QCameraDevice &cameraDevice : cameras) {
    if (cameraDevice.description() == "mycamera")
        camera = new QCamera(cameraDevice);
}

在 QML 中,您可以通过设置 `Camera::cameraDevice ` 属性来选择摄像头。在 C++ 中,您还可以根据摄像头的物理方向(而非摄像头信息)来选择摄像头设备。这在移动设备上非常有用,因为此类设备通常配备前置和后置摄像头。

在 C++ 中:

camera = new QCamera(QCameraDevice::FrontFace);

如果未指定 `QCameraDevice `,则将使用默认设备。默认设备是根据操作系统提供的信息选择的。在桌面平台上,默认摄像头通常由最终用户在系统设置中设定。 在移动设备上,后置摄像头通常是默认的摄像头设备。您可以在 C++ 中使用 `QMediaDevices::defaultVideoInput()`,或在 QML 中使用 `MediaDevices.defaultVideoInput ` 来获取默认的摄像头设备。

默认摄像头设备可能会随时间变化,例如当最终用户断开当前默认摄像头设备的连接时。应用程序开发者可以在信号QMediaDevices::videoInputsChanged 触发时,通过再次查询默认摄像头设备来跟踪这一变化。

预览

虽然并非绝对必要,但能够看到摄像头拍摄的内容通常很有用。这被称为预览。

根据您使用的是 QML 还是 C++,可以通过多种方式实现这一点。在 QML 中,您可以结合使用 `Camera ` 和 `videoOutput` 来监视一个 `captureSession`。

Item {
    VideoOutput {
        id: output
        anchors.fill: parent
    }
    CaptureSession {
        videoOutput: output

        Camera {
            // You can adjust various settings in here
        }
    }
}

在 C++ 中,具体选择取决于您是使用小部件(widgets),还是使用 `QGraphicsView`。在采用小部件的情况下,应使用 `QVideoWidget ` 类;而在采用 `QGraphicsView` 时,`QGraphicsVideoItem ` 则非常有用。

QMediaCaptureSession captureSession;
camera = new QCamera;
captureSession.setCamera(camera);
viewfinder = new QVideoWidget;
captureSession.setVideoOutput(viewfinder);
viewfinder->show();

camera->start(); // to start the camera

对于高级用法(例如实时处理预览帧,从而实现对象或模式的检测),您还可以使用自定义的QVideoSink ,并将其设置为QMediaCaptureSession 的视频输出。在这种情况下,您需要通过处理从videoFrameChanged()信号接收到的数据,自行渲染预览图像。

QMediaCaptureSession captureSession;
camera = new QCamera;
captureSession.setCamera(camera);
mySink = new QVideoSink;
captureSession.setVideoOutput(mySink);

camera->start();
// MyVideoSink::setVideoFrame(..) will be called with video frames

在移动设备上,预览图像默认与设备方向一致。因此,当用户旋转设备时,预览图像会在纵向和横向模式之间切换。 一旦开始录制,屏幕方向将被锁定。为避免影响用户体验,录制期间还应锁定应用程序用户界面的方向。这可以通过QWindow 的contentOrientation 属性来实现。

静态图像

设置好取景器并找到值得拍摄的画面后,要拍摄一张照片,我们需要初始化一个新的QImageCapture 对象。接下来只需启动相机并拍摄照片即可。

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();

视频

此前我们已经看过用于拍摄静态图像的代码。录制视频则需要使用QMediaRecorder 对象。

要录制视频,我们需要像之前一样创建一个相机对象,但这次除了创建取景器之外,我们还将初始化一个媒体录制器对象。

QMediaCaptureSession captureSession;
camera = new QCamera;
captureSession.setCamera(camera);
recorder = new QMediaRecorder;
captureSession.setRecorder(recorder);

camera->start();

// setup output format for the recorder
QMediaFormat format(QMediaFormat::MPEG4);
format.setVideoCodec(QMediaFormat::VideoCodec::H264);
format.setAudioCodec(QMediaFormat::AudioCodec::MP3);
recorder->setMediaFormat(format);

// on shutter button pressed
recorder->record();

// sometime later, or on another press
recorder->stop();

来自QMediaRecorder 的信号可以连接到槽(slot),以响应编码过程的状态变化或错误事件。调用QMediaRecorder::record() 时,录制开始。这会触发recorderStateChanged() 信号的发射。录制由QMediaRecorder 的 record()、stop() 和 pause() 槽进行控制。

控制成像管道

既然已经介绍了捕获图像和视频的基础知识,现在有多种方法可以控制成像管道来实现一些有趣的技术。如前所述,多个物理和电子元件共同决定了最终的图像,您可以通过不同的类来控制它们。

对焦与变焦

QCamera 允许您通过FocusMode 的枚举值来设置总体对焦策略。FocusMode 则负责处理诸如QCamera::FocusModeAuto 和QCamera::FocusModeInfinity 等设置。

对于支持该功能的摄像头硬件,QCamera::FocusModeAutoNear 允许对靠近传感器的物体进行成像。这在条形码识别或名片扫描等应用中非常有用。

除了对焦外,QCamera 还允许您使用setZoomFactor()或zoomTo()控制任何可用的变焦功能。可用的变焦范围可能受到限制,或完全固定为1:1。可通过minimumZoomFactor()和maximumZoomFactor()查询允许的变焦范围。

曝光、快门速度和闪光灯

有许多设置会影响照射到相机传感器上的光量,从而影响最终图像的质量。

自动拍摄的主要设置包括exposure mode 和flash mode 。其他一些设置(例如:ISO设置和曝光时间)通常由相机自动控制,但如有需要,用户也可手动调整。

最后,您可以使用此类控制闪光灯硬件(如有)。在某些情况下,该硬件还可兼作手电筒使用。

图像处理

QCamera 类允许您调整管道中的图像处理部分。这些设置包括:

大多数相机都支持对所有这些参数进行自动设置,因此除非用户需要特定设置,否则您无需进行调整。

示例

提供了 C++ 和 QML 示例。

C++ 示例

Camera Example

演示了如何拍摄静态图像或录制视频。

QML 示例

QML Camera Application

这个基于Qt Quick 的应用程序演示了如何使用该API来拍摄静态图像或录制视频。

QML Video Recorder

使用Qt Quick 录制音频和视频。

参考文档

C++ 类

QCamera

系统摄像头设备的接口

QCameraDevice

关于摄像头设备的一般信息

QCameraFormat

描述摄像机设备支持的视频格式

QImageCapture

用于录制媒体内容

QML 类型

Camera

用于与对焦和变焦相关的相机设置的接口

ImageCapture

用于捕获相机图像的接口

© 2026 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.