使用准备
在使用QCamera之前需要在pro文件中添加媒体库。
QT += mutimedia mutimediawidgets
类别介绍
QCamera m_pCamera; 摄像头
QCameraViewFinder m_pViewfinder; 取景器,用于显示摄像头的数据
QCameraImageCapture m_pImageCapture; 获取摄像头当前帧
m_pCamera = new Camera(this);
m_pViewfinder = new QCameraViewFinder(this);
m_pImageCapture = new QCameraImageCapture(m_pCamera);
m_pCamera->setCaptureDestination(QCameraImageCapture::CaptureToFile);
m_pCamera->setCaptureMode(QCamera::CaptureStillImage);
m_pCamera->setCaptureMode(QCamera::CaptureMode::CaptureViewfinder);
m_pCamera->setViewfinder(m_pViewfinder);
m_pCamera->start();
m_pCamera->searchAndLock()
connect(focus_btn, SIGNAL(clicked(bool)), m_pCamera, SLOT(searchAndLock()));
m_pCamera->supportedViewfinderResolutions()
for (auto resolution : m_pCamera->supportedViewfinderResolutions()){
}
QCameraViewfinderSettings 为控制相机取景器参数提供了一个抽象类。
取景器的参数有:
- Resolution 分辨率
- PixelAspectRatio 像素宽高比
- MinimumFrameRate 最大帧率
- MaximumFrameRate 最小帧率
- PixelFormat 像素格式
- UserParameter
QCameraViewfinderSettings VfSettings
VfSettings.setResolution(preferred_resolution)
VfSettings.setPixelFormat(QVideoFrame::Format_NV21)
VfSettings.setMaximumFrameRate(15)
m_pCamera->setViewfinderSettings(VfSettings)
QVideoProbe 暂时只在android平台上支持QCamera,允许你监控正在播放或者记录的视频。
auto* probe = new QVideoProbe(camera_);
connect(probe, SIGNAL(videoFrameProbed(QVideoFrame)), this, SLOT(ProcessVideoFrame(QVideoFrame)));
probe->setSource(camera_);
videoFrameProbed是自动触发的信号,其结果将被processFrame截获并处理。信号和槽的方式是可以直接带变量传递的。
QVideoFrame
一个QVideoFrame代表的就是相机的一帧数据。
QVideoFrame::bits() 返回的是一帧图像的起始地址。
- 在调用
bits()函数之前还要先判断frame是否map了。所谓map就是将图像数据放到CPU可以寻址的地方。
那么将一帧的数据转化为一个Mat数据的过程如下:
if (!frame.map(QAbstractVideoBuffer::ReadOnly)) return;
cv::Mat nv21(frame.height()*3/2, frame.width(), CV_8UC1, frame.bits(), static_cast<size_t>(frame.bytesPerLine()));
|