基於opencv和QT的攝像頭採集程式碼( GoQTtemplate3持續更新)
阿新 • • 發佈:2019-01-13
在Linux作業系統上,編寫帶介面的影象處理程式,選擇opencv+QT是一種很好的選擇。
GoQTtemplate3是我為編寫Linux下影象處理程式實現的框架,希望能夠為大家解決Linux環境下桌面影象處理程式,提供一些幫助。
文中相關程式碼請參考:https://github.com/jsxyhelu/GOQTtemplate3 一、基本環境構建 a、我們需要完整地安裝QT。具體方法,是從網站上下載線上安裝程式,並且直接安裝
b、下載並且安裝OpenCV
這段程式碼主要是基於QCamera實現了攝像頭的抽象,由於是官方程式碼,實現過程中採用了較多的“訊號、槽”的機制,還是很值的參考的。但是就影象處理這塊而言,價值一般。
三、《qt5.9c++開發指南》例程式解析
這個程式最為重要的地方,就是實現了攝像頭裝置的列舉(當然QT官方的例子可能也實現了,但是不是非常明顯);在影象採集這塊,同樣採用的是QCamera。這段程式碼還有 一個特點,就是實現了一個較為完善的介面模型。
這樣將非常方便後面的操作。 四、結合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)
文中相關程式碼請參考: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)