OpenCV學習之旅 簡介

cc復CC發表於2017-12-13

##1、什麼是影像,對影像進行處理是神馬操作 一副影像可以定義為二維的函式z = f(x,y),其中x、y是其空間座標,而其值z的大小就是函式在該點的灰度值。

例圖.png
比如我用Matlab開啟了一張256x256大小的圖片,一張黑白圖片,而在計算機中,它的實際資料結構是這樣子的

影像的區域性矩陣結構.png

我特意擷取了灰白色和黑色邊界的資料,通過資料我們可以看到,圖片的大小為256x256,而其邊界座標是縱座標y(豎直方向)為127-128,灰白色的數值大小為230,黑色為0。每個座標位置我們稱之為一個畫素,而對應座標數值的大小稱之為灰度值。這樣看起來應該是比較直觀的,影像就是二維的資料集合,我們的影像處理就是對這些數值進行轉換。說比較難說清楚,讓我們做個小變動,我把邊界上的一部分為230的值置為0之後會發生什麼事情呢?就像下面一樣。

邊界畫素值改動.png
經過這步改動之後我們的圖片也隨之發生了改變,很明顯,置為0值的位置,畫素點變成了黑色。
例圖2.png
##2、數字影像處理、計算機視覺、OpenCV之間的關係   數字影像處理,一般指輸入時影像,輸出也是影像的處理,包括影像特徵的提取,直至各個目標的識別。主要是通過計算機對影像進行濾波和增強、復原、壓縮、形態學處理、分割、表示描述以及目標識別的處理方法及技術手段。   計算機視覺的目標是使用計算機來模擬人的視覺,理解影像輸入並根據輸入進行分析來採取行動,其本身屬於人工智慧(AI)的一個分支,最終目的是對人進行模仿,已經涉及到理解已識別的目標及具備一定的認知功能。   OpenCV (Open Source Computer Vision Library),直譯過來就是計算機開源視覺庫,它實現了影像處理和計算機視覺領域的很多通用演算法,庫本身是採用 C++ 編寫的,但是同時也對 Python, Java, C# 等語言提供介面支援。也就是說在Android中也是可以使用的。 ##3、OpenCV使用的領域

  • 人機互動
  • 物體識別
  • 影像分割
  • 人臉識別
  • 動作識別
  • 運動跟蹤
  • 機器人
  • 運動分析
  • 機器視覺
  • 結構分析
  • 汽車安全駕駛 應用領域是非常廣泛的,甚至一些AR/VR也需要用到OpenCV進行計算機視覺處理。 ##4、具體使用示例   OpenCV現在已經出到OpenCV3了,先跑個Demo看下效果過過癮,目前的執行環境是VisualStudio2017+OpenCV3,當然也可以在Android環境下使用,但是OpenCV3本身是C++實現,在Android上使用不僅需要真機測試,還需要JNI呼叫,學習階段使用起來不太方便。 先來個平滑濾波,具體原理也暫時先不解釋,效果上來講就是對圖片進行模糊處理。先貼上程式碼,核心程式碼就是blur(),由它進行均值濾波操作。
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
using namespace cv; 

int main( )
{ 
	//【1】載入原始圖
	Mat srcImage = imread("orange.jpg"); 

	//【2】顯示原始圖
	imshow( "均值濾波【原圖】", srcImage ); 

	//【3】進行均值濾波操作
	Mat dstImage; 
	blur( srcImage, dstImage, Size(15, 15)); 

	//【4】顯示效果圖
	imshow( "均值濾波【效果圖】" ,dstImage ); 

	waitKey( 0 );     
} 
複製程式碼

均值濾波原圖.png
均值濾波效果圖.png

程式碼實現起來很簡單,這就是OpenCV的強大之處了,圖片的載入,顯示,以及圖片的操作,這些實現的方法都極其簡潔。 對於均值濾波背後的演算法剛開始講解起來會比較麻煩一點,因為會涉及到一些卷積、'核'以及線性濾波、非線性濾波,空間濾波以及頻域濾波一些概念,這些得慢慢來,後續會盡量講到的。

相關文章