基於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,最好重新啟動下即可。
這里寫圖片描述

感謝閱讀至此,希望有所幫助。






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM