QT入門 使用QCamera來顯示捕獲的視訊(七)
阿新 • • 發佈:2018-11-10
使用準備
在使用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 =
m_pCamera->searchAndLock()
//如果曝光和白平衡模式不是手動模式,那麼就要使用請求的鎖來鎖定相機設定 //按下對焦按鈕,觸發camera的動作,鎖定相機設定:對焦於單次自動對焦模式,曝光和白平衡。 connect(focus_btn, SIGNAL(clicked(bool)), m_pCamera, SLOT(searchAndLock()));
m_pCamera->supportedViewfinderResolutions()
//返回支援的取景器解析度列表 for (auto resolution : m_pCamera->supportedViewfinderResolutions()){ //dosomething about the resolution
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_); //一旦有探測到有視訊,就觸發了ProcessVideoFrame函式 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()));