第一個Qt開發的OpenCV程序

OpenCV計算機視覺開發實踐:基于Qt C++ - 商品搜索 - 京東

下載安裝Qt:https://download.qt.io/archive/qt/5.14/5.14.2/qt-opensource-windows-x86-5.14.2.exe

下載安裝OpenCV:https://opencv.org/releases/

下載安裝CMake:Download CMake

這些軟件安裝完成完成后,我們可以開始用Qt編寫OpenCV程序了。

【例2.2】第一個Qt開發的OpenCV程序

(1)在桌面上找到Qt Creator 4.11.1 (Community),雙擊打開Qt Creator,我們準備新建一個控制臺項目,項目名是hello。在Qt Creator主界面的Projects旁點擊New按鈕,如圖2-31所示。

圖2-31

然后在出現的“新建項目”,選中“Qt Console Application”,如圖2-32所示。

圖2-32

點擊Choose按鈕,然后輸入項目名稱和創建路徑,路徑建議用全英文路徑,如圖2-33所示。

圖2-33

隨后連續點擊下一步,直到向導結束出現編輯窗口,我們可以看到一個自動生成了一個main函數了。我們來簡單修改下程序,使之既能輸出圖形對話框,又能在命令窗口中輸出字符串,代碼如下:

#include <QApplication>
#include <QMessageBox>int main(int argc, char *argv[])
{QApplication a(argc, argv); 		//定義應用程序對象QString text = "helloworld"; 		//定義一個字符串并賦值// 創建并顯示消息對話框QMessageBox::information(nullptr, "hi", text);puts("helloworld"); 					//在控制臺窗口輸出字符串return a.exec(); 					//進入事件循環
}

QApplication是Qt應用程序中必不可少的一部分,它負責管理應用程序的生命周期,處理事件循環,設置應用的整體樣式等。QString是Qt框架中處理文本數據的核心類之一。它提供了強大的字符串處理能力,支持多種文本編碼和操作,我們定義字符串text,并通過QMessageBox::information將其在消息對話框上輸出。然后,用C函數puts在控制臺上輸出字符串helloworld。程序很簡單,沒啥好講,若學過Qt,一看便懂。

由于這個項目原本是控制臺項目,因此如果要輸出圖形消息框,還需要在項目配置文件中進行一些修改,打開hello.pro,在文件開頭添加“QT+=widgets”,如下所示:

QT+=widgets

Widgets是在Qt中創建用戶界面的主要元素。Widgets可以顯示數據和狀態信息,接收用戶輸入,并為應該組合在一起的其他小部件提供容器。QT+的意思是加上widgets模塊。如果此時運行程序,則可以出現消息對話框并可以在控制臺上輸出字符串helloworld。

(2)Qt項目能運行了,但還不是一個OpenCV程序,下面我們加上OpenCV代碼。首先要在工程配置文件中添加OpenCV庫和頭文件的路徑,在hello.pro的末尾添加代碼如下:

INCLUDEPATH += D:/opencvBuild/install/include/LIBS += -L D:/opencvBuild/install/x64/mingw/lib/libopencv_*.a

宏INCLUDEPATH用來指定頭文件所在路徑,LIBS用來指定庫文件所在路徑,兩個宏都要用一個+,并且LIBS+=右邊要用-L來指定路徑,這個寫法和gcc指定庫路徑寫法類似。

下面我們添加源代碼,在Qt Creator中打開main.cpp,輸入代碼如下:

#include <QApplication>
#include <QMessageBox>
#include <opencv2/opencv.hpp>
#include <QDebug>
#include <QDir>
#include <iostream>using namespace cv;  //所有OpenCV類都在命名空間cv下
using namespace std;void f()   //自定義函數,實現兩幅圖片混合
{double alpha = 0.5; double beta; double input;Mat src1, src2, dst; //創建Mat對象,Mat用于存儲圖片的矩陣類,dst用于存放混合后的圖片//提示用戶輸入第一幅圖片的權值alphaqDebug() <<"線性混合:";qDebug() << "輸入第一幅圖片的權重alpha [0.0-1.0]: ";cin >> input;   //用戶輸入//如果用戶輸入值介于0和1之間,則用該輸入值作為alpha的值if (input >= 0 && input <= 1)alpha = input;QString currentPath = QDir::currentPath();  //獲取當前路徑qDebug() <<"當前路徑是:"<< currentPath;//讀取兩幅大小必須一樣的JPG圖片src1 = imread("p1.jpg");src2 = imread("sbh.jpg");if (src1.empty()) { cout << "Error loading src1" << endl; return; }if (src2.empty()) { cout << "Error loading src2" << endl; return; }beta = (1.0 - alpha);addWeighted(src1, alpha, src2, beta, 0.0, dst);//將圖1與圖2線性混合imshow("res",dst); 	//顯示混合后的圖片waitKey(0); 			//等待按鍵響應后退出,0改為5000就是5秒后自動退出
}int main(int argc, char *argv[])
{QApplication a(argc, argv);   	//定義應用程序對象QString text = "helloworld";  	//定義一個字符串并賦值cv::Mat image = cv::imread("d:/test.jpg");  //讀取d盤上test.jpg文件if (image.empty()) { 			//判斷文件是否為空return -1;  					//為空返回-1,結束程序}std::string strTitle = text.toStdString(); //把QString字符串轉為std::string字符串namedWindow(strTitle, cv::WINDOW_AUTOSIZE); //創建一個標題是strTitle窗口imshow(strTitle, image); 	//在標題為strTitle的窗口中顯示圖像waitKey(0); 					//等待用戶按鍵destroyWindow(strTitle);		//銷毀標題是strTitle的窗口// 創建并顯示消息對話框QMessageBox::information(nullptr, "hi", text);f();return a.exec();
}

上述代碼的自定義函數f功能將圖片p1.jpg和sbh.jpg兩幅圖片進行混合,它們的大小必須一樣。這兩幅圖片必須復制到D:\ex\build-hello-Desktop_Qt_5_14_2_MinGW_64_bit-Debug目錄下。其中,OpenCV庫中的API函數imread用來從文件中讀取圖片。API函數addWeighted用于將兩張相同大小、相同類型的圖片進行融合,第二個參數alpha表示第一幅圖片所占的權重,第四個參數beta表示第2個圖片所占的權重。權重越大的圖片顯示得越多,比如我們輸入alpha為0.9,則主要顯示第一幅圖片。main中的代碼比較簡單,主要是從d盤讀取一個圖片文件test.jpg,然后調用f。

(2)復制動態鏈接庫到exe文件所在文件夾。首先我們打開以下路徑來查看exe文件:

D:\ex\build-hello-Desktop_Qt_5_14_2_MinGW_64_bit-Debug\debug

?

圖2-4

這個路徑是我們程序生成的hello.exe文件所在的路徑,hello.exe是一個Windows下的可執行文件,是不是覺得很神奇,MinGW能在編譯階段加載Linux下的靜態庫(.a)文件,最終生成了Windows下的.exe文件。但hello.exe還需要加載OpenCV源碼編譯出來的動態鏈接庫后才能運行。打開目錄D:\opencvBuild\install\x64\mingw\bin\,把該目錄下的libopencv_core4100.dll、libopencv_highgui4100.dll、libopencv_imgcodecs4100.dll和libopencv_imgproc4100.dll四個文件復制到hello.exe文件所在文件夾。

(3)運行程序,在Qt Creator中點擊點擊左下角的三角運行按鈕或直接按快捷鍵Ctrl+R來運行項目。運行結果如圖2-4所示。

隨便按一個鍵盤鍵,則會顯示helloworld信息框,關閉信息框,會讓我們在控制臺窗口上輸入權值,這里我們輸入0.9,可以看到輸入第一幅圖片權重是0.9后,sbh.jpg顯示的效果就淡了很多,如圖2-5所示。

圖2-5

如圖圖片不能加載,請確認p1.jgp和sbh.jpg是否復制到以下路徑:

D:\ex\build-hello-Desktop_Qt_5_14_2_MinGW_64_bit-Debug

以及,test.jpg是否復制到d盤。在這個程序中,我們即加載了絕對路徑下的圖片文件(test.jpg),也加載了當前路徑下的圖片文件(p1.jpg和sbh.jpg)。這3個文件平時可以到工程目錄的res文件夾下找到。

至此,基于Qt Creator的OpenCV的開發環境搭建起來了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/77337.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77337.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/77337.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入解析 Python 中的裝飾器 —— 從基礎到實戰

1. 裝飾器基礎 1.1 什么是裝飾器&#xff1f; 裝飾器本質上是一個 Python 函數&#xff0c;它可以讓其他函數在不需要做任何代碼變動的前提下增加額外功能。裝飾器的返回值也是一個函數對象。 1.2 語法糖&#xff1a; 符號 Python 提供了 符號作為裝飾器的語法糖&#xff0c…

研究生面試常見問題

研究生面試是考研復試的重要環節&#xff0c;面試表現直接關系到錄取結果。以下從面試流程、常見問題分類及回答技巧等方面為您整理了相關內容&#xff0c;幫助您更好地準備面試。 一、研究生面試的基本流程 自我介紹&#xff1a;通常需要準備1分鐘左右的中文或英文自我介紹&a…

無人機避障與目標識別技術分析!

一、無人機避障技術 1. 技術實現方式 傳感器融合&#xff1a; 視覺傳感&#xff08;RGB/雙目/紅外相機&#xff09;&#xff1a;基于SLAM&#xff08;同步定位與地圖構建&#xff09;實現環境建模&#xff0c;但依賴光照條件。 激光雷達&#xff08;LiDAR&#xff09;&…

Facebook隱私保護:從技術到倫理的探索

在這個數字化時代&#xff0c;隱私保護已成為公眾關注的焦點。Facebook&#xff0c;作為全球最大的社交媒體平臺之一&#xff0c;其用戶隱私保護問題更是引起了廣泛的討論。本文將從技術層面和倫理層面探討 Facebook 在隱私保護方面的努力和挑戰。 技術層面的隱私保護 在技術…

vmware17 虛擬機 ubuntu22.04 橋接模式,虛擬機無法接收組播消息

問題描述&#xff1a; 在一個項目中&#xff0c;宿主機win10中&#xff0c;使用的vmware17pro 虛擬機安裝的ubuntu22.04&#xff0c;按照網上的教程使用Qt綁定組播消息&#xff0c;在另外一個Ubuntu工控機上發送用wiresahrk抓包的組播消息 sudo tcpreplay -i enp1s0 --loop0 y…

《Operating System Concepts》閱讀筆記:p735-p737

《Operating System Concepts》學習第 62 天&#xff0c;p735-p737 總結&#xff0c;總計 3 頁。 一、技術總結 1.distributed system (1)定義 A collection of loosely coupled nodes interconnected by a communication network(一組通過通信網絡相互連接的松散耦合節點)…

NO.92十六屆藍橋杯備戰|圖論基礎-最小生成樹-Prim算法-Kruskal算法|買禮物|繁忙的都市|滑雪(C++)

一個具有n個頂點的連通圖&#xff0c;其?成樹為包含n-1條邊和所有頂點的極?連通?圖。對于?成樹來說&#xff0c;若砍去?條邊就會使圖不連通圖&#xff1b;若增加?條邊就會形成回路。 ?個圖的?成樹可能有多個&#xff0c;將所有?成樹中權值之和最?的樹稱為最??成樹…

小白從0學習網站搭建的關鍵事項和避坑指南(2)

以下是針對小白從零學習網站搭建的 進階注意事項和避坑指南&#xff08;第二期&#xff09;&#xff0c;覆蓋開發中的高階技巧、常見陷阱及解決方案&#xff0c;幫助你在實戰中提升效率和質量&#xff1a; 一、進階技術選型避坑 1. 前端框架選擇 誤區&#xff1a;盲目追求最新…

Java的Servlet的監聽器Listener 筆記250417

Java的Servlet的監聽器Listener 筆記250417 分類1: 一、生命周期監聽器 監聽容器&#xff08;如 Tomcat&#xff09;中應用、會話或請求的創建與銷毀。 監聽器接口觸發事件典型用途ServletContextListener應用啟動 (contextInitialized)、關閉 (contextDestroyed)全局資源管…

網絡安全領域的AI戰略準備:從概念到實踐

網絡安全領域的AI準備不僅涉及最新工具和技術的應用&#xff0c;更是一項戰略必需。許多企業若因目標不明確、數據準備不足或與業務重點脫節而未能有效利用AI技術&#xff0c;可能面臨嚴重后果&#xff0c;包括高級網絡威脅數量的激增。 AI準備的核心要素 構建穩健的網絡安全…

[數據結構]2. 順序表

順序表 1. 介紹基本概念存儲方式優點缺點應用場景 2. 順序表操作SeqList.hSeqlist.c 1. 介紹 基本概念 順序表是用一組地址連續的存儲單元依次存儲線性表的數據元素。線性表是具有相同數據類型的 n 個數據元素的有限序列&#xff0c;在順序表中&#xff0c;元素之間的邏輯順序…

o3和o4-mini的升級有哪些亮點?

ChatGPT是基于OpenAI GPT系列的高性能對話生成AI&#xff0c;經過多代迭代不斷提升自然語言理解和生成能力。 在過去的一年中&#xff0c;OpenAI先后發布了GPT-4、GPT?4.1及多種mini版本&#xff0c;為不同使用場景提供靈活選擇。? 隨著用戶需求向更高效、更精準的推理和視覺…

Chrome漏洞可竊取數據并獲得未經授權的訪問權限

在發現兩個關鍵漏洞后,谷歌發布了Chrome瀏覽器的緊急安全更新。這些漏洞可能允許攻擊者竊取敏感數據并未經授權訪問用戶系統。 這些缺陷被識別為CVE-2025-3619和CVE-2025-3620,在Windows和Mac的135.0.7049.95/.96之前影響Chrome版本,影響Linux的135.0.7049.95/.96。該更新將在…

力扣面試150題--兩數之和 和 快樂數

Day 25 題目描述 思路 創建一個hashmap從前向后遍歷數組如果存在target-nums[i]在map中&#xff0c;記錄它們兩個的序號返回即可不存在&#xff0c;就將該元素放入map中&#xff0c;存放序號 注意&#xff1a;題目說的是必然存在唯一解 class Solution {public int[] twoSum…

Flutter_學習記錄_狀態管理之GetX

Flutter GetX 狀態管理框架全面解析 1. 狀態管理與 Flutter GetX 介紹 1.1 狀態管理 通俗理解&#xff1a;當我們需要在多個頁面&#xff08;組件/Widget&#xff09;之間共享狀態&#xff08;數據&#xff09;&#xff0c;或者在一個頁面中的多個子組件之間共享狀態時&…

ASP.NET常見安全漏洞及修復方式

Microsoft IIS 版本信息泄露 查看網頁返回的 Header 信息&#xff0c;默認會包含 IIS&#xff0c;ASP.NET 版本信息&#xff1a; 隱藏 Server 標頭 編輯 web.config 文件&#xff0c;在 system.webServer 節點中配置 requestFiltering 來移除Server標頭&#xff1a; <sec…

深入解析Java日志框架Logback:從原理到最佳實踐

Logback作為Java領域最主流的日志框架之一,由Log4j創始人Ceki Glc設計開發,憑借其卓越的性能、靈活的配置以及與SLF4J的無縫集成,成為企業級應用開發的首選日志組件。本文將從架構設計、核心機制、配置優化等維度全面剖析Logback的技術細節。 一、Logback的架構設計與核心模…

OpenStack Yoga版安裝筆記(22)Swift筆記20250418

一、官方文檔 https://docs.openstack.org/swift/yoga/admin/objectstorage-components.html#https://docs.openstack.org/swift/yoga/admin/objectstorage-components.html# 二、對象存儲簡介&#xff08;Introduction to Object Storage&#xff09; OpenStack 對象存儲&a…

Spring Boot日志系統詳解:Logback與SLF4J的默認集成

大家好呀&#xff01;&#x1f44b; 今天我們來聊聊Spring Boot中一個超級重要但又經常被忽視的功能——日志系統&#xff01; 一、日志系統的重要性 首先&#xff0c;咱們得明白為什么日志這么重要&#xff1f;&#x1f937;?♂? 想象一下&#xff0c;你正在玩一個超級復…

【AI提示詞】退休規劃顧問專家

提示說明 隨著人口老齡化的加劇&#xff0c;越來越多的人開始關注退休規劃問題。一個專業的退休規劃顧問可以幫助用戶合理規劃退休生活&#xff0c;確保退休后的生活質量。 提示詞 # 角色 退休規劃顧問專家## 注意 1. 專家設計應符合退休規劃的專業性和可靠性&#xff0c;幫…