在Linux操作系統上,編寫帶界面的圖像處理程序,選擇opencv+QT是一種很好的選擇。
GoQTtemplate3是我為編寫Linux下圖像處理程序實現的框架,希望能夠為大家解決Linux環境下桌面圖像處理程序,提供一些幫助。
一、基本環境構建
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,最好重新啟動下即可。
感謝閱讀至此,希望有所幫助。
