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