【OpenCV】Qt + OpenCV 开发配置 + 入门知识(代码示例)
目錄
前言?
一、OpenCV簡介
二、OpenCV + QT 開發環境搭建
🚀資源下載
三、OpenCV圖像原理
🌭位圖模式?
🌭灰度模式
🌭RGB模式
四、OpenCV基礎圖像操作
🍔讀圖像
🍔顯示圖片?
🍔保存圖片
🍔Mat類
🍔像素
五、案例實現?
🌈毛玻璃效果
🌈高斯模糊
🌈XY軸模糊
🌈中值濾波
🌈灰度處理
🌈視頻獲取
🌈攝像頭調用
?六、總結
前言?
本文主要學習 Windows下?Qt + OpenCV?的開發環境的相關配置,以及OpenCV入門相關案例
包括 OpenCV圖像原理、基礎圖像操作、案例實現
一、OpenCV簡介
- OpenCV 于1999年由Gary Bradsky在英特爾創立,第一個版本于2000年問世
- OpenCV 是一個基于開源發行的跨平臺計算機視覺庫,它實現了圖像處理和計算機視覺方面的很多通用算法,已成為計算機視覺領域最有力的研究工具
- OpenCV 由一系列 C函數 和 少量C++類構成,也有提供其他語言的接口,例如,支持python、matlab等語言
應用領域:?
- 包括在衛星和網絡地圖上拼接圖像,圖像掃描校準,醫學圖像的降噪,目標分析,安保以及工業檢測系統,自動駕駛和安全系統,制造感知系統,相機校正,軍事應用,無人空中、地面、水下航行器
生活中的例子:
- 像我們的短視頻、直播上面的一些特效、美顏,現在比較火的無人快遞車、汽車自動駕駛等,還有我們出行最常見的地鐵站 ,用于疫情防控的人臉識別測溫等等
概念區分:
- 圖像處理側重于 “處理” 圖像,如增強,還原,去噪,分割等等
- 計算機視覺重點在于使用計算機來模擬人的視覺,因此模擬才是計算機視覺領域的最終目標
二、OpenCV + QT 開發環境搭建
🚀資源下載
下載鏈接:win10-opencv-Qt-WindowsServer文檔類資源-CSDN下載?
首先,預設值一個存放QT工程文件的文件夾,博主文件名為?QT-project?,如下圖所示:
PS:千萬不能有中文或者空格
然后,將46個.dll文件(除了.exe文件)拷貝一份到以下路徑 C:\Windows\SysWOW64?
Qt工程配置
這是博主使用的QT版本,如下圖所示:
本文OpenCV學習均使用C++進行編譯,Qt創建工程操作如下:?
設置工程名字,這邊的創建路徑就是上文創建的?QT-project?,然后持續點擊下一步,完成創建
在?.pro文件?下,添加如下,路徑可根據自己設定的位置進行修改:
INCLUDEPATH += D:\QT-project\opencv_3.4.2_Qt/include LIBS += D:\QT-project\opencv_3.4.2_Qt/x86/bin/libopencv_*.dllCtrl+s 保存后,主函數導入相關頭文件進行測試,效果如下圖,出現 Hello Word! 即為測試成功!
#include <opencv2/opencv.hpp>using namespace cv;以上,即為 Qt + OpenCV 開發環境開發的全部內容啦,下面進入到相關的知識介紹以及案例實現
三、OpenCV圖像原理
- 在計算機看來,圖像只是一些亮度各異的點
- 一副M*N的圖片可以用M*N的矩陣來表示,矩陣的值表示這個位置上像素的亮度,他可以被表示為多種模式
- 位圖模式
- 灰度模式
- RGB模式
🌭位圖模式?
- 位圖模式是1位深度的圖像,它只是黑和白兩種顏色
- 它可以由掃描或置入黑色的矢量線條圖像生成,也能由灰度模式轉換而成
- 其他圖像模式不能直接轉換為位圖模式
| 0 | 1 | 1 | 0 | 。。。 |
| 1 | 0 | 1 | 1 | 。。。 |
| 0 | 0 | 0 | 1 | 。。。 |
| 1 | 0 | 1 | 0 | 。。。 |
🌭灰度模式
- 灰度模式是8位深度的圖像模式
- 在全黑和全白之間插有254個(2^8)灰度等級的顏色來描繪灰度模式的圖像
- 所有模式的圖像都能換成灰度模式
| 0 | 98 | 1 | 98 | 。。。 |
| 1 | 78 | 25 | 68 | 。。。 |
| 123 | 56 | 57 | 41 | 。。。 |
| 206 | 33 | 13 | 51 | 。。。 |
🌭RGB模式
- RGB模式是數碼圖像中最重要的一個模式,它不是用數碼而是用電平來描述的
- 掃描儀和數碼相機都是捕捉RGB圖像信息的
- RGB模式是24位顏色深度。它共有三個通道,每個通道都有8位深度
- 三個通道合成一起可生成1677萬種顏色,我們也稱之謂 “真彩色”
四、OpenCV基礎圖像操作
🍔讀圖像
功能:載入一張圖片
函數原型:Mat cv::imread(char filename,int flag);
返回值:Mat 可以理解為一個存儲數據的容器,定義了一個img對象來存圖片的數據?
參數:
參數1:圖片路徑名
參數2:
????????cv::IMREAD_COLOR:讀入一副彩色圖像。圖像的透明度會被忽略,默認參數可寫成1?
????????cv::IMREAD_GRAYSCALE:以灰度模式讀入圖像可以寫成 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????????cv::IMREAD_UNCHANGED:讀入一幅圖像,并且包括圖像的 alpha 通道,可以寫成-1
🍔顯示圖片?
功能:顯示一張圖片
函數原型:void cv::imshow(const String&vinname,InputArry mat);
返回值: ? 無類型
參數: ?
參數1:顯示的窗口名,可以使用cv::namedWindow函數創建窗口,如不創建,imshow函數自動創建? ?
參數2:需要顯示的圖像
🍔保存圖片
功能:保存一張圖片到指定的文件
函數原型:bool ?cv::imwrite(const String& filename, InputArry mat,?
? ? ? ? ? ? ? ? ? const std::vector<int>¶ms=std::vector<int>());
返回值: ? bool類型
參數: ?
參數1:圖片名稱.圖片格式 ?
參數2:Mat類型的圖像數據 ?
參數3:特定格式保存的參數編碼,默認值為 std::vector<int>();一般可以不寫
🍔Mat類
Mat類:是 OpenCV 用于處理圖像而引入的一個封裝類,他是一個自動內存管理工具
Mat:本質上是由兩個數據部分組成的類
- 包含信息有矩陣的大小,用于存儲的方法,矩陣存儲的地址等,?矩陣頭和一個指針
- 指向包含了像素值的矩陣(可根據選擇用于存儲的方法采用任何維度存儲數據)
- 矩陣頭部的大小是恒定的
- 矩陣本身的大小因圖像的不同而不同,通常是較大的數量級圖像矩陣比較耗時
🍔像素
- 是指由圖像的小方格組成的,這些小方格都有一個明確的位置和被分配的色彩數值,小方格顏色和位置就決定該圖像所呈現出來的樣子
- 像素點不可再分割成更小的單位或元素
- 一張圖片就是由很多個像素點組成的,如果圖片大小為25*25,那么這張圖片就是由625個像素點組成,一行有25個像素點,一共25列
- 一張圖片所有的像素點存在MAT矩陣中,MAT(i,j)的值就是當前像素點的值
五、案例實現?
🌈毛玻璃效果
代碼實現
#include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv;//毛玻璃特效 Mat imgeGalss(Mat &img) {RNG rng;int random = 0;int num = 5;for(int i = 0;i<img.rows - num;i++){for (int j=0;j<img.cols - num;j++){random = rng.uniform(0,num);//三通道img.at<Vec3b>(i,j)[0] = img.at<Vec3b>(i+random,j+random)[0];img.at<Vec3b>(i,j)[1] = img.at<Vec3b>(i+random,j+random)[1];img.at<Vec3b>(i,j)[2] = img.at<Vec3b>(i+random,j+random)[2];}}return img; }int main(int argc, char *argv[]) {Mat img = imread("C:/Users/86177/Desktop/image/dog.jpg");//圖片路徑//處理前imshow("img",img);//顯示圖片//處理后的Mat resimg = imgeGalss(img);//毛玻璃imshow("resimg",resimg);//顯示圖片waitKey(0);//等待按鍵return 0; }🌈高斯模糊
代碼實現?
#include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv;int main(int argc, char *argv[]) {Mat img = imread("C:/Users/86177/Desktop/image/dog.jpg");//圖片路徑//處理前imshow("img",img);//顯示圖片Mat resimg;//高斯模糊cv::GaussianBlur(img,resimg,Size(5,5),0);imshow("resimg",resimg);//顯示圖片waitKey(0);//等待按鍵return 0; }🌈XY軸模糊
代碼實現??
#include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv;int main(int argc, char *argv[]) {Mat img = imread("C:/Users/86177/Desktop/image/dog.jpg");//圖片路徑//處理前imshow("img",img);//顯示圖片Mat resimg;//XY軸模糊cv::blur(img,resimg,Size(10,10));imshow("resimg",resimg);//顯示圖片waitKey(0);//等待按鍵return 0; }🌈中值濾波
代碼實現??
#include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv;int main(int argc, char *argv[]) {Mat img = imread("C:/Users/86177/Desktop/image/dog.jpg");//圖片路徑//處理前imshow("img",img);//顯示圖片Mat resimg;//中值濾波cv::medianBlur(img,resimg,5);imshow("resimg",resimg);//顯示圖片waitKey(0);//等待按鍵return 0; }🌈灰度處理
代碼實現
#include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv;int main(int argc, char *argv[]) {Mat img = imread("C:/Users/86177/Desktop/image/dog.jpg");//圖片路徑//處理前imshow("img",img);//顯示圖片Mat resimg;//灰度處理cvtColor(img,resimg,CV_BGR2GRAY);imshow("resimg",resimg);//顯示圖片waitKey(0);//等待按鍵return 0; }🌈視頻獲取
代碼實現??
#include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv;int main(int argc, char *argv[]) { Mat frame;VideoCapture cap("C:/Users/86177/Desktop/image/ren.mp4");//視頻獲取while (cap.read(frame)) {imshow("frame",frame);waitKey(24); }return 0; }🌈攝像頭調用
代碼實現??
#include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv;int main(int argc, char *argv[]) { Mat frame;VideoCapture cap(0);//攝像頭調用while (cap.read(frame)) {imshow("frame",frame);waitKey(24); }return 0; }?六、總結
- OpenCV 在機器視覺,圖像處理這方面經常用到,特別是疫情當下,用于我們日常生活中的人臉體溫檢測,真的深有體會,目前,人臉識別的市場還是相當廣闊的!
- 博主也會繼續學習這塊內容,多嘗試做一些有意思的 demo!
以上就是本文的全部內容啦!如果對您有幫助,麻煩點贊啦!收藏啦!歡迎各位評論區留言!!!
總結
以上是生活随笔為你收集整理的【OpenCV】Qt + OpenCV 开发配置 + 入门知识(代码示例)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python字典生成器
- 下一篇: QDROP: RANDOMLY DROP