2013年11月15日 星期五

【QT】視訊擷取 Webcam Capture

如何使用QT擷取視訊畫面?

上網爬文後發現大家都是使用OpenCV

最後發現原來QT自己也有擷取視訊的方法

但是使用的人非常少,效果不知如何?

以下是使用QT視訊擷取的程式碼分享

如果有錯誤的地方請大家糾正,感謝!

camera.pro

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets multimedia multimediawidgets

TARGET = Camera
TEMPLATE = app

SOURCES += main.cpp\
        camera.cpp

HEADERS  += camera.h
FORMS    += camera.ui

camera.h
#ifndef CAMERA_H
#define CAMERA_H

#include <QMainWindow>
#include <QCameraImageCapture>
#include <QCameraViewfinder>
#include <QCamera>
#include <QTimer>
#include <QImage>
#include <QDebug>

namespace Ui {
class Camera;
}

class Camera : public QMainWindow
{
    Q_OBJECT

public:
    explicit Camera(QWidget *parent = 0);
    ~Camera();

private:
    Ui::Camera *ui;
    QTimer *timer;
    QCamera *camera;
    QCameraImageCapture *imageCapture;
    QCameraViewfinder *view_finder;

private slots:
    void startCaptureImage();
    void displayImage(int id, QImage image);
    void videoFrameCapture();
};

#endif // CAMERA_H

camera.cpp
#include "camera.h"
#include "ui_camera.h"

Camera::Camera(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Camera)
{
    ui->setupUi(this);
    camera = new QCamera;
    imageCapture = new QCameraImageCapture(camera);
    view_finder = new QCameraViewfinder();
    timer = new QTimer( this );

    connect(timer, SIGNAL(timeout()),  this 
            , SLOT(videoFrameCapture()));
    connect(ui->btnStartCaptureImage, SIGNAL(clicked())
            , this, SLOT(startCaptureImage()));
    connect(imageCapture, SIGNAL(imageCaptured(int,QImage))
            , this, SLOT(displayImage(int,QImage)));

    //設定視訊參數
    camera->setCaptureMode(QCamera::CaptureViewfinder);
    camera->setViewfinder(view_finder); 
}

Camera::~Camera()
{
    delete ui;
}
void Camera::videoFrameCapture()
{
    imageCapture->capture();
    //擷取當下視訊畫面
}

void Camera::startCaptureImage()
{
    camera->start(); //開始擷取畫面
    timer->start(33);//每隔33MS觸發事件    
}

void Camera::displayImage(int id, QImage image)
{
    ui->lblShowImage->setPixmap(QPixmap::fromImage(image));
    //將影像畫在lblShowImage上
}


13 則留言:

  1. 請問 你是否有裝額外的kit
    才能用camera ?
    如果是的話 可以分享一下kit的下載點 和 安裝kit的過程嗎?
    謝謝

    回覆刪除
  2. 你好,我只使用QT的Library爾以
    http://qt-project.org/

    回覆刪除
    回覆
    1. 所以你在ui的部分 沒有拉一個原件出來是嗎?

      刪除
    2. UI只有BUTTON原件,一個顯示圖片,一個驅動事件用。

      刪除
    3. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets multimedia multimediawidgets
      這個是新增專案就出現了嗎?

      刪除
    4. 不好意思!我沒寫清楚,QCamera必須加入multimedia 才可以使用。
      http://qt-project.org/doc/qt-5/qcamera.html

      刪除
    5. 那可以請問一下 你是怎加入的?
      直接include嗎? 還是 要在Qt上設定甚麼的?

      刪除
    6. 可以請問你的email嗎?
      想問你關於Qt控制webcam的問題
      這樣留言有點沒有效率

      刪除
  3. 作者已經移除這則留言。

    回覆刪除
  4. 謝謝你
    是我自己看錯了
    我問題解決了
    謝謝

    回覆刪除
  5. 請問一下 我依照你交的方法 可以一直編譯不過去
    一直出現 undefined reference to QMediaServiceProvider::defaultServiceProvider()
    undefined reference to QCamera::QCamera(Qobject*,QMediaServiceProvider*)
    ....
    需要的函式庫 我都加入了 可是還是不行
    請問這是甚麼問題ㄚ?

    回覆刪除
  6. 請問你讓他一直capture(),他不會一直輸出成圖片檔嗎

    我在試的時候"我的圖片"裡面一直輸出檔案,發現的時候已經好幾千張了。

    請問這該如何解決呢 感謝

    回覆刪除
    回覆
    1. 你好,基本上這段CODE沒有儲存圖片的功能,應該不會一直存檔,截取完只會暫存在記憶體中。

      刪除