计算机视觉及OpenCV入门简介
計算機(jī)視覺及OpenCV入門簡介
這是一篇實驗室培訓(xùn)過后寫的感悟,附帶授課大佬及實驗室GitHub地址:
- 大佬:https://github.com/shentibeitaokongle
- 實驗室:https://github.com/android-nuc
計算機(jī)視覺
什么是計算機(jī)視覺?
計算機(jī)視覺是指用攝影機(jī)和電腦代替人眼對目標(biāo)進(jìn)行識別、跟蹤和測量等機(jī)器視覺,并進(jìn)一步做圖形處理,使電腦處理成為更適合人眼觀察或傳送給儀器檢測的圖像。
簡單概括為:
計算機(jī)視覺能干什么?
- 圖像識別
- 無人汽車
- AR、VR
- 三維重建
- 工程測繪
- 圖像分割
- ……
計算機(jī)視覺(CV)與計算機(jī)圖形學(xué)(CG)的區(qū)別
計算機(jī)圖形學(xué)(Computer Graphics)和計算機(jī)視覺(Computer Vision)是同一過程的兩個方向。CG將抽象的語義信息轉(zhuǎn)化成圖像,而CV是從圖像中提取抽象的語義信息。
計算機(jī)圖形學(xué):輸入的是對虛擬場景的描述,通常為多邊形數(shù)組,而每個多邊形由三個頂點組成,每個頂點包括三維坐標(biāo)、貼圖坐標(biāo)、RGB顏色等。輸出的是圖像,即二維像素數(shù)組。
計算機(jī)視覺:輸入的是圖像或圖像序列,通常來自相機(jī)、攝像頭或視頻文件。輸出的是對于圖像序列對應(yīng)的真實世界的理解,比如檢測人臉、識別車牌。
參考文章:https://blog.csdn.net/hanlin_tan/article/details/50447895
CV對大學(xué)生比賽、就業(yè)、讀研有什么用?
- CV的魅力在于各種高深的研究方向和算法,有廣泛的應(yīng)用場景,結(jié)合CV會有很多有趣的idea
- 圖像處理,或者視覺相關(guān)的崗位薪資比較高
- 計算機(jī)視覺仍然是計算機(jī)科研的熱門方向
OpenCV
下面是對OpenCV的簡單介紹,應(yīng)用實例在后面。
什么是OpenCV?
中文名:開源計算機(jī)視覺庫
英文全稱:Open Source Computer Vision Library
OpenCV于1999年由Intel建立,如今由Willow Garage提供支持。OpenCV是一個基于BSD許可(開源)發(fā)行的跨平臺計算機(jī)視覺庫,可以運行在Linux、Windows和Mac OS操作系統(tǒng)上。它由一系列 C 函數(shù)和少量 C++ 類構(gòu)成,同時提供了Python、Ruby、MATLAB等語言的接口,實現(xiàn)了圖像處理和計算機(jī)視覺方面的很多通用算法。它支持CUDA加速,現(xiàn)在已經(jīng)發(fā)展到了OpenCV4.0.1版本。
為什么會有OpenCV?
計算機(jī)視覺市場巨大而且持續(xù)增長,且這方面沒有標(biāo)準(zhǔn)API,如今的計算機(jī)視覺軟件大概有以下三種:
1、研究代碼(慢,不穩(wěn)定,獨立并與其他庫不兼容)
2、耗費很高的商業(yè)化工具(比如Halcon, MATLAB+Simulink)
3、依賴硬件的一些特別的解決方案(比如視頻監(jiān)控,制造控制系統(tǒng),醫(yī)療設(shè)備)這是如今的現(xiàn)狀,而標(biāo)準(zhǔn)的API將簡化計算機(jī)視覺程序和解決方案的開發(fā),OpenCV致力于成為這樣的標(biāo)準(zhǔn)API。
OpenCV致力于真實世界的實時應(yīng)用,通過優(yōu)化的C代碼的編寫對其執(zhí)行速度帶來了可觀的提升,并且可以通過購買Intel的IPP高性能多媒體函數(shù)庫(Integrated Performance Primitives)得到更快的處理速度。
圖像
圖像的取樣與量化
計算機(jī)保存的圖像都是一個一個的像素點,稱為數(shù)字圖像。我們想要在計算機(jī)中處理圖像,就必須把真實的圖像通過數(shù)字化轉(zhuǎn)變成計算機(jī)能夠接受的顯示和存儲格式,然后再用計算機(jī)進(jìn)行分析處理。
圖像數(shù)字化過程由圖像的取樣與量化來完成。取樣就是要用多少點來描述一幅圖像,取樣結(jié)果質(zhì)量的高低就是用圖像的分辨率來衡量的;量化是指要使用多大范圍的數(shù)值來表示圖像采樣之后的一個點。也可以說,數(shù)字化坐標(biāo)值稱為取樣,數(shù)字化幅度值稱為量化。
上圖左側(cè)是要數(shù)字化的物體,右側(cè)是數(shù)字化后的圖像,每個小格即為一個像素點。
推薦文章:https://www.cnblogs.com/yunfung/p/6753337.html
https://blog.csdn.net/zqhwando/article/details/78871140
圖像還能看成是什么?
圖像由一組波組成,我們要把圖像進(jìn)行數(shù)字化存儲,就需要提到一個概念——傅里葉級數(shù)。
傅里葉級數(shù)指任何周期函數(shù)都可以用正弦函數(shù)和余弦函數(shù)構(gòu)成的無窮級數(shù)來表示。
傅里葉變換(空間域->頻率域)
傅立葉變換,表示能將滿足一定條件的某個函數(shù)表示成三角函數(shù)(正弦和/或余弦函數(shù))或者它們的積分的線性組合。
傅里葉變換的本質(zhì)是將一個周期信號分解成無限多分開的(離散的)正弦波。
為什么要提到傅里葉變換呢?因為當(dāng)你在二維很難處理一個圖像的時候,可能換個“角度”處理起來卻很簡單,這是傅里葉變換的一個魅力所在。
例如,處理一張異常圖片,頻率方向無法進(jìn)行或者工作量太大時,可能改為在時間方向處理會很簡單。
參考文章:https://blog.csdn.net/yangdashi888/article/details/53215256
圖像濾波(空間域濾波)
圖像濾波,即在盡量保留圖像細(xì)節(jié)特征的條件下對目標(biāo)圖像的噪聲進(jìn)行抑制,是圖像預(yù)處理中不可缺少的操作,其處理效果的好壞將直接影響到后續(xù)圖像處理和分析的有效性和可靠性。其實質(zhì)是減少數(shù)字圖像在使用前的的噪聲污染。
線性濾波可以說是圖像處理最基本的方法,它可以允許我們對圖像進(jìn)行處理,產(chǎn)生很多不同的效果。做法很簡單。首先,我們有一個二維的濾波器矩陣(有個高大上的名字叫卷積核or濾波器)和一個要處理的二維圖像。然后,對于圖像的每一個像素點,計算它的鄰域像素和濾波器矩陣的對應(yīng)元素的乘積,然后加起來,作為該像素位置的值。這樣就完成了濾波過程。
卷積
卷積可以看作是一種結(jié)合了矩陣運算的計算方法,它是是分析數(shù)學(xué)中一種重要的運算。
設(shè):f(x),g(x)是R1上的兩個可積函數(shù),作積分:
可以證明,關(guān)于幾乎所有的實數(shù)x,上述積分是存在的。這樣,隨著x的不同取值,這個積分就定義了一個新函數(shù) h(x),稱為函數(shù) f 與 g 的卷積,記為 h(x) = (f * g)(x)。
容易驗證,(f * g)(x) = (g * f)(x),并且(f * g)(x)仍為可積函數(shù)。
卷積與傅里葉變換有著密切的關(guān)系。利用一點性質(zhì),即兩函數(shù)的傅里葉變換的乘積等于它們卷積后的傅里葉變換,能使傅里葉分析中許多問題的處理得到簡化。
卷積關(guān)系最重要的一種情況,就是在信號與線性系統(tǒng)或數(shù)字信號處理中的卷積定理。利用該定理,可以將時間域或空間域中的卷積運算等價為頻率域的相乘運算,從而利用FFT等快速算法,實現(xiàn)有效的計算,節(jié)省運算代價。
C++語言代碼:
void convolution(float *input1, float *input2, float *output, int mm, int nn) { float *xx = new float[mm+nn-1]; // do convolution for (int i = 0; i < mm+nn-1; i++){ xx[i] = 0.0;for (int j = 0; j < mm; j++) { if (i-j > 0 && i-j < nn)xx[i] += input1[j] * input2[i-j]; } }// set value to the output array for (int i = 0; i < mm; i++) output[i] = xx[i + (nn-1) / 2];delete[] xx; }示例:
-
原圖
-
黑白
- 卷積核 or 濾波器:[ -1, 0, 1 ]
另附卷積與相關(guān)的區(qū)別:https://blog.csdn.net/m0_37407756/article/details/78593917
高斯模糊
高斯模糊,也叫高斯平滑,用來減少圖像噪聲以及降低細(xì)節(jié)層次。從數(shù)學(xué)的角度來看,圖像的高斯模糊過程就是圖像與正態(tài)分布做卷積。
可以將高斯模糊簡單理解為圖像中的每個像素都重新設(shè)置像素值為周邊相鄰像素的平均值,相鄰像素的范圍越大,模糊程度就越大。需要注意的是,高斯模糊應(yīng)該使用加權(quán)平均,因為距離當(dāng)前像素越近的像素與其聯(lián)系越密切。
由于正態(tài)分布又叫作高斯分布,所以這項技術(shù)就叫作高斯模糊。由于高斯函數(shù)的傅立葉變換是另外一個高斯函數(shù),所以高斯模糊對于圖像來說就是一個低通濾波器。
還是用前面的黑白圖片做示范:
代碼:
正態(tài)分布
參考文章:https://blog.csdn.net/zouxy09/article/details/49080029
濾波常用API
- 邊緣檢測(微分)
- Sobel算子,拉普拉斯算子
- 圖像去噪/平滑(積分)
- GaussianBlur(高斯模糊)
相關(guān)會議及期刊
以下是收集的一些與計算機(jī)視覺相關(guān)的會議及期刊,感興趣的話可以看看:
會議
- 頂級
ICCV:International Conference on Computer Vision,國際計算機(jī)視覺大會
2019官網(wǎng):http://iccv2019.thecvf.com/
CVPR:International Conference on Computer Vision and Pattern Recognition,國際計算機(jī)視覺與模式識別大會
2019官網(wǎng):http://cvpr2019.thecvf.com/
ECCV:European Conference on Computer Vision,歐洲計算機(jī)視覺大會
2018官網(wǎng):https://eccv2018.org/ - 較好
ICIP:International Conference on Image Processing,國際圖像處理大會
BMVC:British Machine Vision Conference,英國機(jī)器視覺大會
ICPR:International Conference on Pattern Recognition,國際模式識別大會
ACCV:Asian Conference on Computer Vision,亞洲計算機(jī)視覺大會
期刊
- 頂級
PAMI:IEEE Transactions on Pattern Analysis and Machine Intelligence,IEEE 模式分析與機(jī)器智能雜志
官網(wǎng):https://ieeexplore.ieee.org/Xplore/home.jsp
IJCV:International Journal on Computer Vision,國際計算機(jī)視覺雜志
官網(wǎng):https://lmb.informatik.uni-freiburg.de/index.php - 較好
TIP:IEEE Transactions on Image Processing,IEEE圖像處理雜志
CVIU:Computer Vision and Image Understanding,計算機(jī)視覺與圖像理解
PR:Pattern Recognition,模式識別
PRL:Pattern Recognition Letters,模式識別快報
總結(jié)
以上是生活随笔為你收集整理的计算机视觉及OpenCV入门简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows平台下使用GoLand生成
- 下一篇: 人工智能兼职讲师内训讲师叶梓对sony技