opencv3编程入门-毛星云
文章目錄
- 第1章 邂逅OpenCV
- 1.1 OpenCV周邊概念認(rèn)知
- 1.1.1 圖像處理、計(jì)算機(jī)視覺(jué)與OpenCV
- 1.2 OpenCV基本架構(gòu)分析
- 第3章 HighGUI圖形用戶界面初步
- 第4章 OpenCV數(shù)據(jù)結(jié)構(gòu)與基本繪圖
- 4.2 常用數(shù)據(jù)結(jié)構(gòu):
- 4.3 基本圖形的繪制
- 第5章 core組件進(jìn)階
- 5.1 訪問(wèn)圖像中的像素
- 5.1.2 顏色空間縮減
- 5.1.4 計(jì)時(shí)函數(shù)
- 5.1.5 訪問(wèn)圖像中像素的三類方法
- 5.2 ROI區(qū)域圖像疊加&圖像混合
- 5.2.1 感興趣區(qū)域ROI
- 5.2.2 線性混合操作
- 5.2.3 計(jì)算數(shù)組加權(quán)和:addWeighted()函數(shù)
- 5.3 分離顏色通道、多通道圖像混合
- 5.4 圖像對(duì)比度、亮度值調(diào)整
- 5.5 離散傅里葉變換
- 5.6 XML文件YAML文件的操作
- 第6章 圖像處理
- 6.1 線性濾波:方框?yàn)V波、均值濾波、高斯濾波
- 6.1.2 圖像濾波與濾波器
- 6.1.3 線性濾波器
- 6.1.4 濾波和模糊
- 6.1.5 鄰域算子和線性鄰域?yàn)V波
- 6.2 非線性濾波: 中值濾波、雙邊濾波
- 6.3 形態(tài)學(xué)濾波(1):腐蝕與膨脹
- 6.4 形態(tài)學(xué)濾波(2):開(kāi)運(yùn)算、閉運(yùn)算、形態(tài)學(xué)梯度、頂帽、黑帽
- 第7章 圖像變換
- 7.1 基于OpenCV的邊緣檢測(cè)
- 7.1.1 邊緣檢測(cè)的一般步驟
- 7.1.2 canny算子
- 7.2 霍夫變換
第1章 邂逅OpenCV
1.1 OpenCV周邊概念認(rèn)知
1.1.1 圖像處理、計(jì)算機(jī)視覺(jué)與OpenCV
- 數(shù)字圖像處理是通過(guò)計(jì)算機(jī)對(duì)圖像進(jìn)行去除噪聲、增強(qiáng)、復(fù)原、分割、提取特征等處理的方法和技術(shù)
1.2 OpenCV基本架構(gòu)分析
一些核心模塊:
- core: 核心功能模塊包含如下內(nèi)容:
- OpenCV基本數(shù)據(jù)結(jié)構(gòu)
- 動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)
- 繪圖函數(shù)
- 數(shù)組操作和相關(guān)函數(shù)
- 輔助功能與系統(tǒng)函數(shù)和宏
- 與OpenGL的互操作
- imgproc: Image和Process這兩個(gè)單詞的縮寫組合,圖像處理模塊
- gpu: 運(yùn)用GPU加速的計(jì)算機(jī)視覺(jué)模塊
- highgui: 高層GUI圖形用戶界面
- ml: Machine Learning,機(jī)器學(xué)習(xí)模塊,包括如下內(nèi)容:
- 統(tǒng)計(jì)模型(Statistical Models)
- 一般貝葉斯分類器(Normal Bayes Classifier)
- K-近鄰(K-Nearest Neighbors)
- 支持向量機(jī)(Support Vector Machines)
- 決策樹(shù)(Decision Trees)
- 提升(Boosting)
- 梯度提高數(shù)(Gradiect Boosted Trees)
- 隨機(jī)數(shù)(Random Trees)
- 超隨機(jī)數(shù)(Extremely randomized trees)
- 期望最大化(Expectation Maximization)
- 神經(jīng)網(wǎng)絡(luò)(Neural Networks)
- ML Data
OpenCV各版本的差異:
OpenCV2 帶來(lái)全新的c++接口;通過(guò)CUDA和OpenCL實(shí)現(xiàn)GPU加速
OpenCV3 進(jìn)行項(xiàng)目架構(gòu)改變,使用內(nèi)核+插件的架構(gòu)方式;大部分方法都使用了OpenCL加速
OpenCV4 c++11編譯器才能編譯
OpenCL:
OpenCL是一個(gè)為異構(gòu)平臺(tái)編寫程序的框架。編寫語(yǔ)言基于c99。用于并行計(jì)算,加速計(jì)算。
openCV中集成了OpenCL
OpenCL和CUDA比較:
不同點(diǎn):
OpenCL是通用的異構(gòu)平臺(tái)編程語(yǔ)言,為了兼顧不同設(shè)備,使用繁瑣。
CUDA是nvidia公司發(fā)明的專門在其GPGPU上的編程的框架,使用簡(jiǎn)單,好入門
相同點(diǎn):
都是基于任務(wù)并行與數(shù)據(jù)并行。
OpenGL是什么,為什么存在與OpenCV中
一個(gè)跨編程語(yǔ)言、跨平臺(tái)的應(yīng)用程序接口(API)的規(guī)格,它用于生成二維、三維圖像。
在 2.3 之前 OpenCV 的渲染部分都是由 CPU 來(lái)實(shí)現(xiàn)的,不論是畫線還是把圖片顯示到屏幕上。這有兩個(gè)問(wèn)題,速度慢,同時(shí)沒(méi)法畫> 三維物體。引入 OpenGL 是為了借助 顯卡的力量,顯卡比 CPU 更擅長(zhǎng)渲染,同時(shí)顯卡和 CPU 可以同時(shí)干活
第3章 HighGUI圖形用戶界面初步
| imread | 讀取文件 |
| imshow | 顯示圖片 |
| namedWindow | 用于創(chuàng)建一個(gè)窗口 |
| imwrite | 輸出文件 |
| createTrackbar | 創(chuàng)建一個(gè)可以調(diào)整數(shù)值的軌跡條 |
| getTrackbarPos | 獲取軌跡條的當(dāng)前位置 |
| SetMouseCallback | 為指定的窗口設(shè)置鼠標(biāo)回調(diào) |
第4章 OpenCV數(shù)據(jù)結(jié)構(gòu)與基本繪圖
Mat不但是一個(gè)非常有用的圖像容器類,同時(shí)也是一個(gè)通用的矩陣類,可以用來(lái)創(chuàng)建和操作多維矩陣。
- OpenCV函數(shù)中輸出圖像的內(nèi)存分配是自動(dòng)完成的
- 使用OpenCV的c++接口時(shí)不需要考慮內(nèi)存的釋放問(wèn)題
- 賦值運(yùn)算符和拷貝構(gòu)造函數(shù)(構(gòu)造函數(shù))只復(fù)制信息頭
- 使用函數(shù)clone() 或者copyTo()來(lái)復(fù)制一幅圖像的矩陣
4.2 常用數(shù)據(jù)結(jié)構(gòu):
| Point | 2維點(diǎn), 支持int , Point_ Point2i Point 等價(jià) |
| Point2f | 2維點(diǎn) , 支持float |
| Point3f | 3維點(diǎn) |
| Scalar | 顏色RGB |
| Size | 顏色RGB, typedef Size_ Size2i;typedef Size2i Size |
| Rect | 矩形 |
| cvtColor | 顏色空間轉(zhuǎn)換 |
| Matx | 輕量級(jí)Mat,使用前規(guī)定好大小 |
| Vec | Matx的派生類,是一個(gè)以為的Matx,和vector很相似 |
OpenCV圖片通道的存儲(chǔ)順序時(shí)BGR,而不是RGB.
4.3 基本圖形的繪制
- 繪制直線 line函數(shù)
- 繪制橢圓 ellipse 函數(shù)
- 繪制舉行 rectangle 函數(shù)
- 繪制圓形 circle函數(shù)
- 多邊形 fillPoly 函數(shù)
第5章 core組件進(jìn)階
5.1 訪問(wèn)圖像中的像素
5.1.2 顏色空間縮減
單通道的像素值只有256個(gè),但是三通道有256*256*256種,處理起來(lái)比較麻煩,進(jìn)行縮減后圖像會(huì)有一樣的效果。
像素縮減的辦法是:
Inew=(iold/10)?10I_{new}=(i_{old}/10)* 10 Inew?=(iold?/10)?10
乘除法運(yùn)算代價(jià)高,加減法及賦值運(yùn)算代價(jià)低。
可以把所有的像素對(duì)應(yīng)關(guān)系存表,利用查表后復(fù)制的方式替代上述計(jì)算公式,以減小運(yùn)算代價(jià)
5.1.4 計(jì)時(shí)函數(shù)
double time0=static_cast<double>(getTickCount());//記錄起始時(shí)間 //進(jìn)行圖像處理操作 time0=((double)getTickCount() - time0) / getTickFrequency(); cout<<"此方法的運(yùn)行時(shí)間為:“<<time0<<"秒”<<endl;5.1.5 訪問(wèn)圖像中像素的三類方法
-
方法一 指針訪問(wèn)
-
方法二 迭代器
-
方法三 動(dòng)態(tài)地址計(jì)算
5.2 ROI區(qū)域圖像疊加&圖像混合
5.2.1 感興趣區(qū)域ROI
定義ROI有兩種方法:
- 方法一 指定矩形的左上角坐標(biāo)和矩形長(zhǎng)寬
- 方法二 指定感興趣行或列的范圍
5.2.2 線性混合操作
進(jìn)行畫面疊加理論公式:
g(x)=(1?α)f0(x)+αf1(x)g(x)=(1-\alpha )f_0(x)+\alpha f_1(x) g(x)=(1?α)f0?(x)+αf1?(x)
5.2.3 計(jì)算數(shù)組加權(quán)和:addWeighted()函數(shù)
5.3 分離顏色通道、多通道圖像混合
有時(shí)需要對(duì)BGR三個(gè)通道分別顯示和調(diào)整。通過(guò)OpenCV的split和merge方法可以達(dá)到目的。
5.4 圖像對(duì)比度、亮度值調(diào)整
理論依據(jù)公式:
g(x)=a?f(x)+bg(x)=a*f(x)+b g(x)=a?f(x)+b
- a用來(lái)控制圖像的對(duì)比度
- b用來(lái)控制圖像的亮度
5.5 離散傅里葉變換
《傅里葉分析》
對(duì)一張圖像使用傅里葉變換就是將它分解成正弦和余弦兩部分,也就是將圖像從空間域轉(zhuǎn)換到頻域。
一些關(guān)鍵函數(shù):
| dft | 進(jìn)行傅里葉變換 |
| getOptimalDFTSize | 返回DFT最有尺寸 |
| copyMakeBorder | 擴(kuò)充圖像邊界 |
| magnitude | 計(jì)算二維矢量的幅值 |
| log | 計(jì)算自然對(duì)數(shù) |
| normalize | 矩陣歸一化 |
此部分理解需要一些理論基礎(chǔ),待學(xué)習(xí)《數(shù)字信號(hào)處理》中相關(guān)內(nèi)容再來(lái)細(xì)致學(xué)習(xí)吧~
5.6 XML文件YAML文件的操作
使用FileStorage類進(jìn)行文件xml和yaml文件操作
第6章 圖像處理
6.1 線性濾波:方框?yàn)V波、均值濾波、高斯濾波
6.1.2 圖像濾波與濾波器
- 圖像濾波的目的: 抽出圖像的特征作為圖像識(shí)別的特征模式;適應(yīng)圖像處理要求,消除圖像數(shù)字化時(shí)所混入的噪聲
- 平滑濾波的目的: 模糊;消除噪音
- 濾波器,可以想象為一個(gè)包含加權(quán)系數(shù)的窗口,透過(guò)這個(gè)窗口去看圖像
五種常用的圖像平滑處理操作:
| 方框?yàn)V波 | BoxBlur函數(shù) |
| 均值濾波 | Blur函數(shù) |
| 高斯濾波 | GaussianBlur函數(shù) |
| 中值濾波 | medisnBlur函數(shù) |
| 雙邊濾波 | bilateralFilter函數(shù) |
6.1.3 線性濾波器
| 低通濾波器 | 允許低頻率通過(guò) |
| 高通濾波器 | 允許高頻率通過(guò) |
| 帶通濾波器 | 允許一定范圍頻率通過(guò) |
| 帶阻濾波器 | 允許一定范圍頻率通過(guò)并且允許其他頻率通過(guò) |
| 全通濾波器 | 允許所有頻率通過(guò),僅僅改變相位關(guān)系 |
| 陷波濾波器 | 阻止一個(gè)狹窄頻率范圍通過(guò) |
6.1.4 濾波和模糊
兩者的區(qū)別: 濾波可以分為低通濾波和高通濾波,低通就是模糊,高通就是銳化。
6.1.5 鄰域算子和線性鄰域?yàn)V波
6.2 非線性濾波: 中值濾波、雙邊濾波
| 中值濾波 | medianBlur |
| 雙邊濾波 | bilateralFilter |
6.3 形態(tài)學(xué)濾波(1):腐蝕與膨脹
主要功能:
- 消除噪聲
- 分割出獨(dú)立的圖像元素,在圖像中連接相鄰的元素
- 尋找圖像中的明顯的極大值區(qū)域或極小值區(qū)域
- 求出圖像的梯度
膨脹(dilate) 就是求局部最大值的操作。
腐蝕(erode) 就是求局部最小值的操作。
API函數(shù):
| 膨脹 | dilate |
| 腐蝕 | erade |
6.4 形態(tài)學(xué)濾波(2):開(kāi)運(yùn)算、閉運(yùn)算、形態(tài)學(xué)梯度、頂帽、黑帽
- 開(kāi)運(yùn)算: 先腐蝕后膨脹
- 閉運(yùn)算: 先膨脹后腐蝕
- 形態(tài)學(xué)梯度: 膨脹圖與腐蝕圖之差(可以保留物體的邊緣輪廓)
- 頂帽:原圖像與開(kāi)運(yùn)算只差
- 黑帽:閉運(yùn)算與原圖像之差
第7章 圖像變換
變換常見(jiàn)的例子就是傅里葉變換。這類操作的結(jié)果仍然保存為OpenCV圖像結(jié)構(gòu)的形式,但是新圖像的每個(gè)單獨(dú)像素表示原始圖像的頻譜分量,而不是通常考慮的空間分量。
7.1 基于OpenCV的邊緣檢測(cè)
7.1.1 邊緣檢測(cè)的一般步驟
7.1.2 canny算子
- Canny 邊緣檢測(cè)的步驟
邊緣檢測(cè)對(duì)應(yīng)API
| Canny邊緣檢測(cè) | Canny |
| Soble算子 | Sobel |
| scharr濾波器 | Scharr |
7.2 霍夫變換
OpenCV中的霍夫線變換有如下三種:
總結(jié)
以上是生活随笔為你收集整理的opencv3编程入门-毛星云的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 深度测试与alpha混合(3)
- 下一篇: 类String的构造函数、析构函数和赋值