摘要:在Linux環境下可以通過V4L2介面及ioctl相關函數直接在底層調用攝像頭設備,進行攝像頭控制及圖像預覽和捕獲,但是該方法相對比較複雜;Qt5.0版本新增了QMultimedia模塊提供了更為方便的編程支持,該模塊主要涵蓋視頻、音頻、收音機以及攝像頭等功能支持,提供了非常多的QML類型和C
摘要:在Linux環境下可以通過V4L2介面及ioctl相關函數直接在底層調用攝像頭設備,進行攝像頭控制及圖像預覽和捕獲,但是該方法相對比較複雜;Qt5.0版本新增了QMultimedia模塊提供了更為方便的編程支持,該模塊主要涵蓋視頻、音頻、收音機以及攝像頭等功能支持,提供了非常多的QML類型和C++類用以處理多媒體內容,Qt 5將Qt Multimedia模塊放在了核心模塊中,因此它支持所有主要平臺,這些類需要在 pro 文件中添加 QT += multimedia.
平臺環境:Qt5.0.2,Qt Creator(ubuntu系統),筆記本自帶攝像頭.
Step1:用Qt creator新建Qt Widgets Application工程
按照提示下一步即可創建模板工程,如圖,並修改.pro文件添加 QT +=multimedia,QT+=multimediawidgets項
Step2:雙擊mainwindow.ui啟動qt designer可視化佈局界面
首先在佈局左側放置一個Horizental Layout控制項,修改對象名為ImageView,用於圖像預覽顯示;再在右側放一個Vertical Layout 控制項,依次在其中放置一個label和三個Push Button,修改label的對象名為ImageCapture,用於顯示捕獲的圖像,修改按鈕的顯示名稱及對象名分別為buttonCapture, buttonSave, buttonQuit,拖動控制項到合適的佈局,如圖
Step3:修改mainwindow.h
源碼如下
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QCamera> #include <QCameraViewfinder> #include <QCameraImageCapture> #include <QFileDialog> namespace Ui { class MainWindow; } class QCamera; class QCameraViewfinder; class QCameraImageCapture; class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: void captureImage(); void displayImage(int,QImage); void saveImage(); private: Ui::MainWindow *ui; QCamera *camera; QCameraViewfinder *viewfinder; QCameraImageCapture *imageCapture; }; #endif // MAINWINDOW_HView Code
Step4:修改mainwindow.cpp
源碼如下
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); camera=new QCamera(this); viewfinder=new QCameraViewfinder(this); imageCapture=new QCameraImageCapture(camera); ui->ImageView->addWidget(viewfinder); ui->ImageCapture->setScaledContents(true); camera->setViewfinder(viewfinder); camera->start(); connect(imageCapture, SIGNAL(imageCaptured(int,QImage)), this, SLOT(displayImage(int,QImage))); connect(ui->buttonCapture, SIGNAL(clicked()), this, SLOT(captureImage())); connect(ui->buttonSave, SIGNAL(clicked()), this, SLOT(saveImage())); connect(ui->buttonQuit, SIGNAL(clicked()), qApp, SLOT(quit())); } MainWindow::~MainWindow() { delete ui; } void MainWindow::captureImage() { ui->statusBar->showMessage(tr("capturing..."), 1000); imageCapture->capture(); } void MainWindow::displayImage(int , QImage image) { ui->ImageCapture->setPixmap(QPixmap::fromImage(image)); ui->statusBar->showMessage(tr("capture OK!"), 5000); } void MainWindow::saveImage() { QString fileName=QFileDialog::getSaveFileName(this, tr("save file"), QDir::homePath(), tr("jpegfile(*.jpg)")); if(fileName.isEmpty()) { ui->statusBar->showMessage(tr("save cancel"), 5000); return; } const QPixmap* pixmap=ui->ImageCapture->pixmap(); if(pixmap) { pixmap->save(fileName); ui->statusBar->showMessage(tr("save OK"), 5000); } }View Code
Step5:編譯工程效果如下
總結:QCamera類封裝了很多底層操作,為了更進一步地瞭解Linux下攝像頭的調用機制,我將在後續探討V4L2及ioctl操作攝像頭的機理。