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

基於opencv和QT的攝像頭采集代碼( GoQTtemplate3持續更新)

c++開發 linux 安裝 click linu 機制 系統 cannot 代碼

在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)

基於opencv和QT的攝像頭采集代碼( GoQTtemplate3持續更新)