OpenCV的全稱是Open Source Computer Vision Library,是一個跨平台的電腦視覺庫。OpenCV是由英特爾公司發起並參與開發,以BSD授權條款授權發行,可以在商業和研究領域中免費使用。
在 #機器視覺 專案的開發中,OpenCV作為較大眾的開源庫,擁有了豐富的常用影象處理函式庫,採用C/C 語言編寫,可以執行在Linux/Windows/Mac等作業系統上,能夠快速的實現一些影象處理和識別的任務。此外,OpenCV還提供了Java、 #python 、 #cuda 等的使用介面、機器學習的基礎演算法呼叫,從而使得影象處理和影象分析變得更加易於上手,讓開發人員更多的精力花在演算法的設計上。
以下內容均利用python
進行操作,主要可分為pip
與conda
兩種,分別指令如下。
pip install opencv-python
這裡會自動下載pypi的最新套件內容,這個函數是目前穩定的相關內容,已經驗證過的算式會放入這裡,如果想要使用最新的套件及開發中的套件包,可以安裝這下列版本。
pip install opencv-contrib-python
其詳細解說如網站所述。
指令如下,會從conda套件庫下載目前的版本。
conda install opencv
其中,利用pip
與conda
下載的版本會略有落差,使用實際得特別注意版本差異。
在python中,匯入OpenCV程式碼如下所示:
import cv2
由於python是物件導向的程式語言,因此操作上都是利用cv2
這個做為開頭,進行OpenCV的一系列函數操作。
cv2.imread('path/image.png',flag)
其中flag
可以用下列參數作為輸入
1
代替)
0
代替)
-1
代替)
範例示範
import cv2
import numpy as np
A = np.array(cv2.imread('Lenna.jpg',cv2.IMREAD_COLOR))
B = np.array(cv2.imread('Lenna.jpg',cv2.IMREAD_GRAYSCALE))
C = np.array(cv2.imread('Lenna.jpg',cv2.IMREAD_UNCHANGED))
A_size = np.shape(A)
B_size = np.shape(B)
C_size = np.shape(C)
print(A_size)
print(B_size)
print(C_size)
得到結果如下
(316, 316, 3)
(316, 316)
(316, 316, 3)
這裡使用的圖片是大名鼎鼎的萊娜圖
從上述的程式碼中可以發現,由於檔案的副檔名是jpg
的格式,因此本身就已經移除透明度的資料,也因此這裡用cv2.IMREAD_COLOR
與cv2.IMREAD_UNCHANGED
的結果,最終的陣列大小都是一樣**(316×316×3)** 的大小,而使用cv2.IMREAD_GRAYSCALE
的陣列大小就僅有二維,這是因為取值僅取得明度的部分,也因此每一個像素僅只有一個強度值,故最後大小呈現二維的陣列。
值得一提的是利用OpenCV取得的陣列,一順序分別是B
G
R
的資料,在陣列中分別表示[:,:,0]
[:,:,0]
[:,:,2]
的資料順序。
剛才利用OpenCV將影像匯入了程式內,轉換為陣列,現在顯示的功能將影像匯出 指令如下:
cv2.imshow('Title',data)
其中data
是放入陣列數據。
而這樣的程式碼,一般來說只會讓影像顯示一瞬間就結束程式,故要加入等待指令
cv2.waitKey(0)
括號處可填入停留時間,以毫秒作為單位,若填入0
則會等待使用者按下任意鍵後才進行關閉OpenCV的視窗。
將剛剛匯入的影像再利用cv2.imshow
顯示後的範例:
cv2.imshow('B',(A[:,:,0])) #取得影像藍色數據
cv2.imshow('G',(A[:,:,1])) #取得影像綠色數據
cv2.imshow('R',(A[:,:,2])) #取得影像紅色數據
cv2.imshow('all',(A[:,:,:])) #取得影像所有數據
cv2.imshow('gray',B) #取得影像數據
cv2.waitKey(0)
顯示結果如下:
當開啟多個視窗可利用下列指令來控制關閉的條件
cv2.waitKey(0)
cv2.destroyAllWindows()
利用這組指令,當按下任意鍵後則會自動關閉所有視窗,若希望可以一時間按照順序關閉指定圖片可利用下列指令進行控制:
cv2.waitKey(0)
cv2.destroyWindow('Title') #填入指定的視窗名稱
最後當我們對影像處理完成後,希望儲存一個新的影像檔案,可利用下列指令進行影像儲存的動作
cv2.imwrite('path/name.jpg',var)
依序填入儲存位置,及陣列變數名稱,即可針對影像進行儲存 這裡利用將圖片改為負片後存儲下來:
Anegative = np.array(abs(255-A))
cv2.imshow('negative',Anegative)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('negative.png',Anegative)
其結果如下:
之後再利用其他深入的使用方式來介紹OpenCV。
#python #OpenCV #程式設計