1. 程式人生 > >QT入門 使用QCamera來顯示捕獲的視訊(七)

QT入門 使用QCamera來顯示捕獲的視訊(七)

使用準備

在使用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()

    //如果曝光和白平衡模式不是手動模式,那麼就要使用請求的鎖來鎖定相機設定
    //按下對焦按鈕,觸發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()));