1. 程式人生 > >基於opencv和QT的攝像頭採集程式碼( GoQTtemplate3持續更新)

基於opencv和QT的攝像頭採集程式碼( GoQTtemplate3持續更新)

在Linux作業系統上,編寫帶介面的影象處理程式,選擇opencv+QT是一種很好的選擇。 GoQTtemplate3是我為編寫Linux下影象處理程式實現的框架,希望能夠為大家解決Linux環境下桌面影象處理程式,提供一些幫助。
文中相關程式碼請參考:https://github.com/jsxyhelu/GOQTtemplate3 一、基本環境構建 a、我們需要完整地安裝QT。具體方法,是從網站上下載線上安裝程式,並且直接安裝
b、下載並且安裝OpenCV

直接使用編譯好的OpenCV類庫

sudo apt-
get install libcv-dev
sudo apt-get install libopencv-dev

全部成功後在QT中進行相關配置:

安裝完成之後,opencv相關的標頭檔案被安裝到/usr/include目錄中,該目錄是linux預設標頭檔案查詢路徑。

修改配置檔案:

編寫相關程式碼

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

#include <opencv2/imgproc/imgproc.hpp>
#include <QFileDialog>
using namespace cv;
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this);}
MainWindow::~MainWindow(){ delete ui;}
void MainWindow::on_pushButton_clicked()
{
    //第3個引數表示查詢檔案時從哪個目錄開始,如果為"."的話,表示從該工程目錄開始查詢,最後那個引數的過濾器的名字之間

    //要用空格,否則識別不出來
    QString img_name = QFileDialog::getOpenFileName( this, tr("Open Image"), ".",tr("Image Files(*.png *.jpg *.jpeg *.bmp)"));
    //toAscii()返回8位描述的string,為QByteArray,data()表示返回QByteArray的指標,QByteArray為位元組指標
    //現在已改為toLatinl函式
    Mat src = imread( img_name.toLatin1().data());
    cvtColor( src, src, CV_BGR2RGB );
    QImage img = QImage( (const unsigned char*)(src.data), src.cols, src.rows, QImage::Format_RGB888 );
    ui->label->setPixmap( QPixmap::fromImage(img) );
    img_name.clear();
}

實現以下效果:

注意,所有操作的目錄都不要放在中文目錄下面。能夠正常顯示出Lena,那麼證明QT和OpenCV的環境都是配置正確了。 二、QT自己帶的例子程式是重要參考
這段程式碼主要是基於QCamera實現了攝像頭的抽象,由於是官方程式碼,實現過程中採用了較多的“訊號、槽”的機制,還是很值的參考的。但是就影象處理這塊而言,價值一般。
三、《qt5.9c++開發指南》例程式解析
這個程式最為重要的地方,就是實現了攝像頭裝置的列舉(當然QT官方的例子可能也實現了,但是不是非常明顯);在影象採集這塊,同樣採用的是QCamera。這段程式碼還有 一個特點,就是實現了一個較為完善的介面模型。

//  建立  QCamera物件
    QCameraInfo curCameraInfo =QCameraInfo : :defaultCamera(); //獲取預設攝像頭
    ui - >comboCamera - >addItem(curCameraInfo.description()); //攝像頭描述
    ui - >comboCamera - >setCurrentIndex( 0);
但是這段程式存在一個問題,就是隻選擇預設攝像頭,實際上,我們需要獲得的是所有攝像頭,那麼就必須對這段程式碼進行相關修改:    const QList <QCameraInfo > availableCameras = QCameraInfo : :availableCameras();
    for ( const QCameraInfo &cameraInfo : availableCameras) {
          ui - >comboCamera - >addItem(cameraInfo.description()); //攝像頭描述
    }
    ui - >comboCamera - >setCurrentIndex( 0);

這樣將非常方便後面的操作。 四、結合OpenCV功能,編寫 GoQTtemplate3
我們最終還是需要將OpenCV引入其中,因為這樣才能夠更方便我們進行影象處理操作。之前介
紹過的GoQTtemplate2 就是實現了相關的功能。
需要說明的地方是,為了將攝像頭選擇功能加入目前平臺,需要新增QCameraInfo.h,這個前提
是在.pro檔案中,新增
multimedia類庫。 並且將初始化程式加入其中
同時,我們在開啟攝像頭的時候,也要根據選擇來進行開啟。 同時需要新增錯誤控制,每次開啟攝像頭之前關閉之前的攝像頭。具體內容可以參考程式碼。 五、備註
a、在程式的配置過程中,非常容易出現錯誤的一個問題為::
/usr/bin/ld: cannot find -lxxx  這種情況是系統找不到對應的庫檔案,其中,-lxxx表示連結庫檔案 libxxx.so。 具體的解決方法是先用locat找到指定的lib檔案,檢視連結檔案是否正確的指向了我們希望的lib,如果不是,用  ln -sf */libxxx.so.x */libxxx.so 指令修改它。 連線以後,輸入ldconfig來讓動態連結庫供系統共享。 比如
b、 如果出現 視訊視窗是黑屏的,怎麼回事? 在Vmware Workstation的“虛擬機器”->“虛擬機器設定”->“USB控制器”下,檢視“USB相容性”,如果當前是“USB2.0”就修改為“USB3.0”,反之就修改為“USB2.0”。然後再在“虛擬機器”->“可移動裝置”下重新連線Camera,最好重新啟動下即可。 這裡寫圖片描述
感謝閱讀至此,希望有所幫助。


來自為知筆記(Wiz)