一、概述
(一)簡介
OpenCV是一個基于BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS作業系統上,它輕量級而且高效——由一系列 C 函式和少量 C++ 類構成,OpenCV用C++語言撰寫,它的主要介面也是C++語言,但是依然保留了大量的C語言介面,
在計算機視覺專案的開發中,OpenCV作為較大眾的開源庫,擁有了豐富的常用影像處理函式庫,能夠快速的實作一些影像處理和識別的任務,此外,OpenCV還提供了Java、python、cuda等的使用介面、機器學習的基礎演算法呼叫,從而使得影像處理和影像分析變得更加易于上手,讓開發人員更多的精力花在演算法的設計上,
(二)應用領域
主要包含下列應用領域:
人機互動,物體識別,影像分割,人臉識別,動作識別,運動跟蹤,機器人,運動分析,機器視覺,結構分析,汽車安全駕駛,
(三)主要功能
影像資料的操作 ( 分配、釋放、復制、設定和轉換), 影像是視頻的輸入輸出I/O (檔案與攝像頭的輸入、影像和視頻檔案輸出),
矩陣和向量的操作以及線性代數的演算法程式(矩陣積、解方程、特征值以及奇異值等),
各種動態資料結構(串列、佇列、集合、樹、圖等),
基本的數字影像處理(濾波、邊緣檢測、角點檢測、采樣與差值、色彩轉換、形態操作、直方圖、影像金字塔等),
結構分析(連接部件、輪廓處理、距離變換、各自距計算、模板匹配、Hough變換、多邊形逼近、直線擬合、橢圓擬合、Delaunay 三角劃分等),
攝像頭定標(發現與跟蹤定標模式、定標、基本矩陣估計、齊次矩陣估計、立體對應),
運動分析(光流、運動分割、跟蹤),
目標識別(特征法、隱馬爾可夫模型:HMM),
基本的GUI (影像與視頻顯示、鍵盤和滑鼠事件處理、滾動條)
二、影像識別教程
(一)安裝
1.下載程式
下載openCV安裝包官網地址:Home - OpenCV
程式目錄如下:

選擇對應環境的檔案夾,本文以java為例,java所需檔案如下:

Jar檔案為依賴包,win64位作業系統選擇x64檔案夾:
![]()
2.環境搭建
本文以IDEA開發工具為例,maven構建專案,pom管理jar包;
由于專案需要用到 opencv 的dll檔案,故要么放在java library path 中,或放在jre lib 中,windows下可放在System32目錄下,也可以在代碼中動態加載,如下:

pom引入 opencv.jar:

(二)基本流程
1.影像預處理
(1)Mat-基本影像容器
Mat 是一個類,由兩個資料部分組成:矩陣頭(包含矩陣尺寸,存盤方法,存盤地址等資訊)和一個指向存盤所有像素值的矩陣(根據所選存盤方法的不同矩陣可以是不同的維數)的指標,矩陣頭的尺寸是常數值,但矩陣本身的尺寸會依影像的不同而不同,通常比矩陣頭的尺寸大數個數量級,
轉換影像為Mat物件代碼如下:
![]()
(2)影像灰度化
在RGB模型中,如果R=G=B時,則彩色表示灰度顏色,其中R=G=B的值叫灰度值;因此,灰度影像每個像素點只需一個位元組存放灰度值(又稱強度值、亮度值),灰度范圍為0-255,一般常用的是加權平均法來求像素點的灰度值
常見的加權方法如下:
1)Gray = B ; Gray = G ; Gray = R
2)Gray = max({B , G , R})
3)Gray = (B + G + R) / 3
4)Gray = 0.072169 * B + 0.715160 * G + 0.212671 * R
5)Gray = 0.11 * B + 0.59 * G + 0.3 * R
這幾種方法中,第一為分量法,即用RGB三個分量的某一個分量作為該點的灰度值;第二種方法為最大值法,將彩色影像中的三個分量亮度的最大值作為灰度圖的灰度值;第三種方法是將彩色影像中的三分量求平均得到一個灰度圖;后兩種都屬于加權平均法,其中第四種是opencv開發庫所采用的一種求灰度值演算法;第五種為從人體生理學角度所提出的一種求灰度值演算法(人眼對綠色的敏感最高,對藍色敏感最低)
影像灰度化代碼如下:
(3)影像二值化
影像的二值化,就是將影像上的像素點的灰度值設定位0或255這兩個極點,也就是將整個影像呈現出明顯的只有黑和白的視覺效果,
常見的二值化方法為固定閥值和自適應閥值,固定閥值就是制定一個固定的數值作為分界點,大于這個閥值的像素就設為255,小于該閥值就設為0,這種方法簡單粗暴,但是效果不一定好.另外就是自適應閥值,每次根據圖片的灰度情況找合適的閥值,自適應閥值的方法有很多,這里采用了一種類似K均值的方法,就是先選擇一個值作為閥值,統計大于這個閥值的所有像素的灰度平均值和小于這個閥值的所有像素的灰度平均值,再求這兩個值的平均值作為新的閥值,重復上面的計算,直到每次更新閥值后,大于該閥值和小于該閥值的像素數目不變為止,
二值化代碼如下:

(4)影像降噪
處理掉一些干擾因素;
主要的降噪演算法
濾波類:通過設計濾波器對影像進行處理,特點是速度往往比較快,很多卷積濾波可以借助快速傅里葉變化來加速
稀疏表達類:自然圖片之所以看起來不同于隨機噪音/人造結構,是因為大家發現他們總會在某一個橫型下存在稀疏表達,而我們想排除的噪音往往無法被稀疏化,基于這個判別式模型,用稀疏性來約束自然影像,在很多逆問題里取得了拔群的效果
外部先驗:如果從有噪音的圖片本身無法找到規律,我們也可以借助其他類似但又沒有噪音的圖片,來總結圖片具有的固有屬性,這一類方法利用的外部圖片來創造先驗條件,然后用于約束需要預測的圖片,最有代表性就是混合高斯模型
聚類低秩:除了可稀疏性,低秩性也是自然圖片常見的一個特性,數學上,可稀疏表達的資料可以被認為是在Union of low-dimensional subspaces;而低秩資料則是直接存在于一個Low-dimensional subspace,這個更嚴格的限制往往也可以取得很好的降噪效果,
深度學習(Deep Learning):這類可以歸于外部先驗的子類,如果說解決逆問題的關鍵,是尋找一個好的影像約束器,那么我們為什么不用一個最好的約束器?深度學習方法的精髓,就在于通過大量的資料,學習得到一個高復雜度(多層網路結構)的圖片約束器,從而將學習外部先驗條件這一途徑推到極限,近期的很多這類作業,都是沿著這一思路,取得了非常逆天的效果,
字符分割:就是把圖片有用的部分一個個分割下來;字符分割有很多方法,但并不是每一種方法都是萬能的,我們需要根據自己的業務來調整;常見的就是投影法和連通域法
投影法:就是分析每一維上黑色像素點的個數(假設是二值化的影像),然后設定一個闕值,根據這個闕值來分割圖片
影像降噪代碼如下:

(5)影像腐蝕、膨脹
腐蝕:影像的一部磁區域與指定的核進行卷積,求核的最小值并賦值給指定區域,腐蝕可以理解為影像中高亮區域的領域縮小,
膨脹:影像的一部磁區域與指定的核進行卷積,求核的最大值并賦值給指定區域,膨脹可以理解為影像中高亮區域的領域擴大,
腐蝕、膨脹代碼如下:

2.影像識別
(1)特征值提取
為了解決圖片旋轉縮放后的匹配問題,就需要用到計算機視覺處理演算法中的特征變換匹配演算法,其思路是先找到影像中的一些“穩定點”,這些點不會因為視角的改變、光照的變化、噪音的干擾而消失,比如角點、邊緣點、暗區域的亮點以及亮區域的暗點,這樣如果兩幅圖中有相同的景物,那么穩定點就會在兩幅影像的相同景物上同時出現,這樣就能實作匹配,
特征值提取代碼如下:

效果如下:

(2)特征值比對
OpenCV 中針對特征點匹配問題已經提供了很多演算法,包括 FAST 、SIFT 、SURF 、ORB,
特征值比對代碼如下:

效果如下:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/394095.html
標籤:其他
上一篇:風格遷移模型測驗效果
