You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取QCamera选中相机的分辨率及VideoCapture中的原始帧?

没问题,我来帮你理清这两个需求的具体实现方法,分两部分来说明:

获取选中相机的分辨率

首先要明确你是用Qt原生相机类(比如QCamera)还是结合OpenCV的VideoCapture来操作相机——这两种方式的分辨率获取方法不一样,而且并没有cameraQt->getResolution这种直接调用的方法哦。

情况1:使用Qt原生QCamera类

如果是用Qt自带的相机框架,你需要通过QCameraDevice或者QCameraViewfinderSettings来获取分辨率:

// 1. 获取系统中所有可用的相机设备
QList<QCameraDevice> cameraDevices = QCameraDevice::availableDevices();
// 假设用户选中了第一个相机(你可以根据实际选择逻辑替换)
QCameraDevice selectedCamera = cameraDevices.first();

// 2. 获取该相机支持的所有分辨率列表
QList<QSize> supportedResolutions;
const auto& videoFormats = selectedCamera.videoFormats();
for (const QVideoFormat& format : videoFormats) {
    supportedResolutions.append(format.resolution());
}
// 打印所有支持的分辨率
for (const QSize& res : supportedResolutions) {
    qDebug() << "支持分辨率:" << res.width() << "x" << res.height();
}

// 3. 如果已经初始化了QCamera实例,获取当前生效的分辨率
QCamera* camera = new QCamera(selectedCamera);
QCameraViewfinderSettings currentSettings = camera->viewfinderSettings();
QSize currentResolution = currentSettings.resolution();
qDebug() << "当前相机分辨率:" << currentResolution.width() << "x" << currentResolution.height();

情况2:使用OpenCV的VideoCapture

如果是用OpenCV来调用相机,直接通过cap.get()方法获取分辨率属性即可:

#include <opencv2/opencv.hpp>

// 打开选中的相机(0是默认相机,你可以替换为对应设备ID)
cv::VideoCapture cap(0);
if (!cap.isOpened()) {
    qDebug() << "相机打开失败!";
    return;
}

// 获取分辨率
int frameWidth = static_cast<int>(cap.get(cv::CAP_PROP_FRAME_WIDTH));
int frameHeight = static_cast<int>(cap.get(cv::CAP_PROP_FRAME_HEIGHT));
qDebug() << "相机分辨率:" << frameWidth << "x" << frameHeight;
获取VideoCapture的原始帧

如果是用OpenCV的VideoCapture,获取原始帧非常直接,有两种常用方式:

方式1:直接读取帧(最常用)

cv::Mat rawFrame;
// read()方法会自动完成grab+retrieve的操作,返回是否成功读取
if (cap.read(rawFrame)) {
    // rawFrame就是原始的Mat格式帧,未经过任何压缩或转换
    // 如果你需要在Qt中显示,可以转换为QImage
    QImage qFrame(rawFrame.data, rawFrame.cols, rawFrame.rows, QImage::Format_BGR888);
    // 后续可以将qFrame显示在QLabel或QGraphicsView中
}

方式2:分离grab和retrieve(适合多相机同步场景)

// grab()只抓取帧到缓冲区,不解码
if (cap.grab()) {
    // retrieve()从缓冲区解码得到原始帧
    cap.retrieve(rawFrame);
    // 处理rawFrame...
}

如果是Qt原生相机获取原始帧,可以用QVideoProbe来监听原始帧数据:

QVideoProbe* frameProbe = new QVideoProbe(this);
// 将probe关联到你的QCamera实例
if (frameProbe->setSource(camera)) {
    connect(frameProbe, &QVideoProbe::videoFrameProbed, this, [&](const QVideoFrame& frame) {
        if (frame.isValid()) {
            // 映射帧数据到内存,获取原始像素
            QVideoFrame clonedFrame = frame;
            clonedFrame.map(QAbstractVideoBuffer::ReadOnly);
            // 转换为QImage格式
            QImage rawImage(clonedFrame.bits(), clonedFrame.width(), clonedFrame.height(), 
                            QVideoFrame::imageFormatFromPixelFormat(clonedFrame.pixelFormat()));
            clonedFrame.unmap();
            // rawImage就是原始帧的QImage格式
        }
    });
}

内容的提问来源于stack exchange,提问作者Arritmic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:29:09