gpt4 book ai didi

qt - 更改 QCamera 的输入分辨率

转载 作者:行者123 更新时间:2023-12-04 10:25:01 24 4
gpt4 key购买 nike

我已经使用带有 QAbstractVideoSurface 的 QCamera 实现了相机捕获。我将 QAbstractVideoSurface 扩展到派生类,以将捕获编码到缓冲区中以供将来处理。一切正常,但我在更改输入捕获的捕获分辨率时遇到问题。

使用 setNativeResolution() 似乎不起作用。

下面是代码的简要说明。

#ifndef _CAPTURE_BUFFER_H_
#define _CAPTURE_BUFFER_H_

#include <QMutex>
#include <QWidget>
#include <QImage>
#include <QVideoFrame>
#include <QAbstractVideoSurface>
#include <QVideoSurfaceFormat>
#include <control/qcircularbuffer.h>

class CaptureBuffer: public QAbstractVideoSurface
{
Q_OBJECT

public:
CaptureBuffer(int size = 30);
QList<QVideoFrame::PixelFormat> supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType) const;
bool start(const QVideoSurfaceFormat& format);
void stop();
bool present(const QVideoFrame& frame);
bool isEmpty() const;
void pushBack(const QVideoFrame& new_frame);
void popFront();
bool top(QVideoFrame& frame);
bool back(QVideoFrame& frame);

const QImage::Format& image_format() const {return m_image_format;}
const QSize& image_size() const {return m_image_size;}

protected:
void setNativeResolution(const QSize & resolution);

private:
QSize m_image_size;
QImage::Format m_image_format;
QCircularBuffer<QVideoFrame> m_buffer;
QMutex m_buffer_mutex;
};

#endif



CaptureBuffer::CaptureBuffer(int size) :
m_buffer(QCircularBuffer<QVideoFrame>(size))
{
}

QList<QVideoFrame::PixelFormat> CaptureBuffer::supportedPixelFormats(
QAbstractVideoBuffer::HandleType handleType) const
{
if (handleType == QAbstractVideoBuffer::NoHandle) {
return QList<QVideoFrame::PixelFormat>()
<< QVideoFrame::Format_RGB24
<< QVideoFrame::Format_RGB32
<< QVideoFrame::Format_ARGB32
<< QVideoFrame::Format_ARGB32_Premultiplied
<< QVideoFrame::Format_RGB565
<< QVideoFrame::Format_RGB555;
} else {
return QList<QVideoFrame::PixelFormat>();
}
}

bool CaptureBuffer::start(const QVideoSurfaceFormat& format)
{
const QImage::Format image_format = QVideoFrame::imageFormatFromPixelFormat(format.pixelFormat());
const QSize size = format.frameSize();

if (image_format != QImage::Format_Invalid && !size.isEmpty()) {
m_image_format = image_format;
m_image_size = size;

QAbstractVideoSurface::start(format);

return true;
} else {
return false;
}
}

void CaptureBuffer::stop()
{
QAbstractVideoSurface::stop();
}

bool CaptureBuffer::present(const QVideoFrame& frame)
{
pushBack(frame);
return true;
}

bool CaptureBuffer::isEmpty() const
{
return m_buffer.empty();
}

void CaptureBuffer::pushBack(const QVideoFrame& frame)
{
m_buffer_mutex.lock();
m_buffer.push_back(frame);
m_buffer_mutex.unlock();
}

void CaptureBuffer::popFront()
{
m_buffer_mutex.lock();
m_buffer.pop_front();
m_buffer_mutex.unlock();
}

bool CaptureBuffer::top(QVideoFrame& frame)
{
if(m_buffer.empty())
return false;

m_buffer_mutex.lock();
frame = m_buffer.front();
m_buffer_mutex.unlock();
return true;
}

bool CaptureBuffer::back(QVideoFrame& frame)
{
if(m_buffer.empty())
return false;

m_buffer_mutex.lock();
frame = m_buffer.back();
m_buffer_mutex.unlock();
return true;
}

void CaptureBuffer::setNativeResolution( const QSize & resolution )
{
QAbstractVideoSurface::setNativeResolution(resolution);
}

以下是 QCamera 的使用和附加到捕获缓冲区的方式:

m_camera = camera;
m_camera->setCaptureMode(QCamera::CaptureVideo);
m_camera->setViewfinder(m_capture_buffer);
m_camera->start();

考虑到网络摄像头支持此分辨率,我该如何调整输入捕获分辨率,使其从 640 x 480 变为 1280 x 720 等。

最佳答案

从 Qt5.2.1(来自 git)开始,Digia 似乎没有为 Windows 完全完成 QCamera。但是,还有更多选项可以解决分辨率设置问题。

如果便携性是必须的:

您可以试试 gstreamer。如我所见,gstreamer 插件的必要部分已实现。

我在 Windows 上工作,gstreamer 在 Windows 上使用 DirectShow,所以我决定直接使用 DirectShow 插件。

Qt5.2.1 有一个功能性的 DirectShow 核心插件,但它没有完全连接到 Qt 框架本身,因为 DSImageEncoderControl(将从 QImageEncoderControl 派生)在 DirectShow 插件中不存在。

存在 QAndroidImageEncoderControl 和其他一些移动性实现。看来 Digia 决定先插入 Qt Mobility 业务。

无论如何,他们在 Qt 文档中说:

QImageEncoderSettings imageSettings;
imageSettings.setCodec("image/jpeg");
imageSettings.setResolution(1600, 1200);
imageCapture->setEncodingSettings(imageSettings);

然而,当您调用 QCameraImageCapture::setEncodingSettings 时,Qt 会尝试通过 DSImageEncoderControl 设置分辨率,但由于缺少它,该部分代码将无法运行。大多数控件尚未在 DirectShow 插件中实现。

对我来说,另一个问题是捕获静止图像也需要设置表面,但我只想使用图像数据进行进一步处理,例如使用 OpenCV。

可能的解决方案:

如果您不需要跨平台的东西,您可以使用我从 Qt 的 DirectShow 插件中借来的代码,您还可以设置分辨率和像素格式。在我的示例中,我尝试遵循 Qt 的命名约定。

另一个问题是目前 QImage 只知道 RGB 格式,但一些相机设备以 YUYV 格式输出捕获的数据。因此需要转换。我还在我的代码中添加了一个简单的 YUYV 到 RGB24 转换器(感谢 FourCC.org)来测试我的笔记本电脑的摄像头,但我主要使用罗技 C920 Pro 高清摄像头,它在不需要转换的地方也输出 RGB24。

Download the code from here

关于qt - 更改 QCamera 的输入分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19583191/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com