1. 程式人生 > >OpenCV學習筆記(二十五)——OpenCV圖形介面設計Qt+VS2008

OpenCV學習筆記(二十五)——OpenCV圖形介面設計Qt+VS2008

一直對MFC對OpenCV的支援不好而耿耿於懷,瞭解了Qt對OpenCV支援很好,但網上這方面的資料很少。大部分的圖形互動的設計都是基於OpenCV2.0之前的資料結構lpImage進行的。最近得到了一本好書《OpenCV 2 Computer Vision Application Programming Cookbook》,下載的連結為http://ishare.iask.sina.com.cn/f/20485520.html?retcode=0,2011年5月出版,全書都是基於OpenCV2.2版本的實現,採用了新的資料結構。我這裡強烈建議利用C++開發的朋友們不要再使用老版本的資料結構了,實在影響開發效率。至於大家最熟悉的參考書《learning OpenCV》和《OpenCV教程——基礎篇》這兩本廣為流傳的書,我的看法是已經遠遠不能滿足OpenCV新版本的學習了。真的希望這本新書的中文版儘快出爐。

參考這本書的利用Qt建立GUI,不過書中的辦法是在Qt Creator下實現的,我這裡通過VS2008+Qt實現。下面結合一個例程介紹一下如何在Qt的GUI環境下開發OpenCV。

先新建工程Qt Project --> Qt Application,點選finish完成工程的建立。然後在專案屬性裡的聯結器的附加依賴項裡面新增opencv的lib檔案。工程建立好之後,一個字尾名為.ui的檔案就是關於介面設計的。首先建立兩個按鈕,拖拽兩個Push Buttons到Form中去,修改其屬性,一個名字為Open Image,一個為Process。右鍵按鈕選擇connect signal為其新增響應函式,選擇clicked()。對應的cpp檔案多出了on_OpenImage_clicked函式,程式碼如下:

#include "qttest1.h"

qttest1::qttest1(QWidget *parent, Qt::WFlags flags)
	: QMainWindow(parent, flags)
{
	ui.setupUi(this);
}

qttest1::~qttest1()
{

}


void qttest1::on_OpenImage_clicked()
{

}

接下來要在對應的標頭檔案中新增顯示圖片的必要程式碼,新增QFileDialog類的宣告,OpenCV必要的include標頭檔案包含,在類中宣告一個cv :: Mat成員變數。程式碼如下:
#ifndef QTTEST1_H
#define QTTEST1_H

#include <QtGui/QMainWindow>
#include <QFileDialog>
#include "ui_qttest1.h"

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

class qttest1 : public QMainWindow
{
	Q_OBJECT

public:
	qttest1(QWidget *parent = 0, Qt::WFlags flags = 0);
	~qttest1();

private:
	Ui::qttest1Class ui;
	cv::Mat image;	// cv圖片

private slots:
	void on_OpenImage_clicked();
};

#endif // QTTEST1_H


接下來新增on_OpenImage_clicked的函式內容。程式碼如下:

void qttest1::on_OpenImage_clicked()
{
	QString fileName = QFileDialog::getOpenFileName(this, tr("Open Image"), ".", tr("Image Files (*.png *.jpg *.jpeg *.bmp)"));
	image = cv::imread(fileName.toAscii().data());
	cv::namedWindow("Original Image");
	cv::imshow("Original Image", image);
}

類似的辦法新增Process按鈕的相應程式碼:
void qttest1::on_Process_clicked()
{
	cv::flip(image, image, 1);
	cv::namedWindow("Output Image");
	cv::imshow("Output Image", image);
}

這樣就可以實現一個普通的按鈕響應。但我們的目的是將圖片顯示在對話方塊form中,這還需要進一步深入學習。與MFC中顯示圖片需要CvvImage類似,要想在Qt的Form中顯示圖片,圖片的格式也必須為QImage,需要將cv::Mat的BGR通道順序變換為RGBA,QImage的格式為Format_RGB32,呼叫cvtColor實現(這裡例程裡呼叫的為BGR2RGB,然後QImage的格式為Format_RGB888,但我試驗顯示結果是有問題的,故自己調整了一下)。(後經實驗,BGR2RGB,Format_RGB888這組引數對於webcam視訊是正確的,對於我當時的實驗照片是不正確的,格式的問題真是混亂!!!)實現程式碼如下:

	cv::cvtColor(image, image, CV_BGR2RGBA);
	QImage img = QImage((const unsigned char*)(image.data), image.cols, image.rows, QImage::Format_RGB32);
	QLabel *label = new QLabel(this);
	label->move(200, 50);
	label->setPixmap(QPixmap::fromImage(img));
	label->resize(label->pixmap()->size());	
	label->show();

注意開啟圖片的路徑不要有中文,最後的顯示結果為


相關推薦

OpenCV學習筆記——OpenCV圖形介面設計Qt+VS2008

一直對MFC對OpenCV的支援不好而耿耿於懷,瞭解了Qt對OpenCV支援很好,但網上這方面的資料很少。大部分的圖形互動的設計都是基於OpenCV2.0之前的資料結構lpImage進行的。最近得到了一本好書《OpenCV 2 Computer Vision Applica

python OpenCV學習筆記:傅立葉變換Fourier Transform

傅立葉變換用於分析各種濾波器的頻率特性。對於影象,二維離散傅立葉變換(2D Discrete Fourier Transform/DFT)用於尋找頻域。快速傅立葉變換(Fast Fourier Transform/FFT)的快速演算法用於計算DFT。

Linux學習筆記shell特殊符號、 sort_wc_uniq、tee_tr_split

tee_tr_split命令一、特殊字符 1.‘* ‘任意個任意字符‘? ‘任意一個字符‘# ‘註釋字符‘ \ ‘脫義字符‘ | ‘管道符其中大部分之前都用過,對於脫義符‘\‘脫義符用法舉例如圖 2.幾個與管道有關的命令cut 分割,-d 分隔符 -f 指定段號 -c 指定第幾個字符 sort 排序,

OpenCV學習筆記——小試SVM演算法ml OpenCV學習筆記——基於級聯分類器的目標檢測objdect OpenCV學習筆記——光流法對運動目標跟蹤Video Ope

OpenCV學習筆記(二十六)——小試SVM演算法ml  總感覺自己停留在碼農的初級階段,要想更上一層,就得靜下心來,好好研究一下演算法的東西。OpenCV作為一個計算機視覺的開源庫,肯定不會只停留在數字影象處理的初級階段,我也得加油,深入研究它的演算法庫。就從ml入手

OpenCV學習筆記——簡單的單目視覺測距嘗試

    前言:         視覺測距作為機器視覺領域內基礎技術之一而受到廣泛的關注,其在機器人領域內佔有重要的地位,廣泛應用於機器視覺定位、目標跟蹤、視覺避障等。機器視覺測量主要分為:單目視覺測量、雙目視覺測量、結構光視覺測量等。結構光由於光源的限制,應用的場合比較固定;

OpenCV學習筆記——小試SVM演算法ml

總感覺自己停留在碼農的初級階段,要想更上一層,就得靜下心來,好好研究一下演算法的東西。OpenCV作為一個計算機視覺的開源庫,肯定不會只停留在數字影象處理的初級階段,我也得加油,深入研究它的演算法庫。就從ml入手吧,最近做東西遇到隨機森林,被搞的頭大,深深感覺自己肚子裡貨太

OpenCV學習筆記——車輛識別和跟蹤

     今天在GitHub上看到一個對車輛訓練好的模型,即xml檔案,於是拿來測試了一個效果。我用這個xml檔案對視訊中的每一幀畫面進行簡單的車輛識別定位,演示程式碼如下:import cv2 import numpy as np camera = cv2.VideoCa

Android程式設計權威指南第二版學習筆記—— 第25章 搜尋

本章主要講了 ToolBar 中的 SearchView 的使用以及 SharedPreferences 的簡單使用。 GitHub 地址: 完成第25章 1. SearchView SearchView 是一個 ActionVi

MYSQL學習筆記資料庫維護

備份資料 (1) 使用命令列實用程式mysqldump轉儲所有資料庫內容到某個外部檔案; (2) 可用命令列實用程式mysqlhotcopy從一個數據庫複製所有資料; (3) 可使用MYSQl的

python OpenCV學習筆記:Hough線變換

Hough變換是一種很流行的技術,可以檢測任何可以用數學的形式來表示的形狀。即使它被破壞或變形,它也能檢測出它的形狀。我們將會看到它是如何工作的。 一條線可以表示成y = mx + c或引數形式,像ρ=xcosθ+ysinθ,其中ρ是從原點到直線的垂直

Unity3D學習筆記:文件操作

log gin fin 不同 ati text組件 內容 mono www 文件是什麽? 存儲在硬盤上的最後的節點。 文件夾是什麽? 文件的上級單位稱為文件夾。 文件夾的基本結構? 文件夾是層級化結構的,對於同級的文件夾不可以重名,父文件夾和子文件夾可以同名》 IO:I是I

openCV學習筆記 —— 影象濾波 —— 線性濾波方框濾波、均值濾波、高斯濾波

影象濾波簡介 方框濾波——boxFilter()  原理 方框濾波程式  #include<opencv2/opencv.hpp> #include <vector> #include <time.h> using

opencv學習筆記——形態學濾波

開運算 處理過程:先腐蝕後膨脹。 功能:用於消除小物體,在纖細點處分離物體,並且在平滑較大物體的邊界的同時不明顯改變其面積,同時抑制比結構元小的亮細節。 使用例項: #include<opencv2/opencv.hpp> void main

opencv學習筆記cvFilter2D()卷積以及卷積邊界的處理

20.1**cvFilter2D()卷積:** void cvFilter2D( const CvArr* src, CvArr* dst, const CvMat* kernel, CvPoint anchor=c

Python學習筆記StringIO和BytesIO

nbsp from 寫入 enc print == world! byte 初始化 StringIO 很多時候,數據讀寫不一定是文件,也可以在內存中讀寫。 StringIO顧名思義就是在內存中讀寫str。 要把str寫入StringIO,我們需要先創建一個String

Python學習筆記多線程

oop 模擬 筆記 標準庫 函數 只需要 pre 開始 print 摘抄自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431928238187

Python學習筆記網絡編程1TCP編程

包含 ipv sina spa 包括 現在 com 訪問 等等 摘抄:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432004374523e49

Python學習筆記

準備 for ring 價格 python use imp pri exce 使用ElementTree解析XML文件 # 導入Python中內置的處理XML文件的模塊try: import xml.etree.cElementTree as ETexcept Imp

Java學習筆記:類型轉換和instanceof關鍵字

方法 png true feed out 實例 strong 運算符 nbsp 基本數據類型轉換: 自動類型轉換:把大類型的數據賦值給大類型的變量(此時的大小指的是容量的範圍) 1 byte b = 12; //byte是一個字節 2 int i = b; //i

Linux學習筆記管道符和作業控制、shell變量、環境變量配置文件

環境變量配置文件 管道符 一、管道符和作業控制cat 1.txt |wc -l ; cat 1.txt |grep ‘aaa‘將前面命令的結果輸入給後面的命令ctrl z 暫停一個任務、這時候任務隱藏到後臺,通過fg可以重新吊起任務到前臺運行jobs查看後臺的任務bg[id]把任務調到後臺fg[id]