---
tags: python, OpenCV, 物件導向
---
# OpenCV 簡介
OpenCV的全稱是Open Source Computer Vision Library,是一個跨平台的電腦視覺庫。OpenCV是由英特爾公司發起並參與開發,以BSD授權條款授權發行,可以在商業和研究領域中免費使用。
<center> <img src="https://upload.wikimedia.org/wikipedia/commons/5/53/OpenCV_Logo_with_text.png">
</center>
<center>OpenCV的LOGO</center>
OpenCV的應用其實很廣,在許多的 #程式設計 上均有OpenCV的蹤跡,其中近年來以 #python 最為熱門因此本文也將使用python進行使用與探討。
在 #機器視覺 專案的開發中,OpenCV作為較大眾的開源庫,擁有了豐富的常用影象處理函式庫,採用C/C 語言編寫,可以執行在Linux/Windows/Mac等作業系統上,能夠快速的實現一些影象處理和識別的任務。此外,OpenCV還提供了Java、 #python 、 #cuda 等的使用介面、機器學習的基礎演算法呼叫,從而使得影象處理和影象分析變得更加易於上手,讓開發人員更多的精力花在演算法的設計上。
## 應用領域
- 人機互動
- 人臉識別
- 運動分析
- 影像處理
- 邊緣偵測
- 灰階處理
- 濾波降噪
- 物體辨別
- 動作識別
- 汽車安全駕駛
- 結構分析
實務上具有許多操作是混和使用,應用上也十分複雜。
## 安裝OpenCV
以下內容均利用`python`進行操作,主要可分為`pip`與[`conda`](conda用法)兩種,分別指令如下。
### pip 套件管理器
```shell
pip install opencv-python
```
這裡會自動下載[pypi](https://pypi.org/project/opencv-python/)的最新套件內容,這個函數是目前穩定的相關內容,已經驗證過的算式會放入這裡,如果想要使用最新的套件及開發中的套件包,可以安裝這下列版本。
```shell
pip install opencv-contrib-python
```
其詳細解說如[網站](https://pypi.org/project/opencv-contrib-python/)所述。
### conda 套件安裝管理
指令如下,會從[conda套件庫](https://anaconda.org/anaconda/opencv)下載目前的版本。
```shell
conda install opencv
```
其中,利用`pip`與`conda`下載的版本會略有落差,使用實際得特別注意版本差異。
## 匯入OpenCV
在python中,[匯入](python_import語句)OpenCV程式碼如下所示:
```py
import cv2
```
由於python是物件導向的程式語言,因此操作上都是利用`cv2`這個做為開頭,進行OpenCV的一系列函數操作。
## 基本功能
### 讀取影像
```py
cv2.imread('path/image.png',flag)
```
其中`flag`可以用下列參數作為輸入
- cv2.IMREAD_COLOR(可用`1`代替)
- 此為預設值,會載入影片的RGB數據,忽略透明度
- cv2.IMREAD_GRAYSCALE(可用`0`代替)
- 直接將影像轉為灰階圖片
- cv2.IMREAD_UNCHANGED(可用`-1`代替)
- 包含透明度在內的所有資訊均轉入數據
範例示範
```py
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)
```
得到結果如下
```shell
(316, 316, 3)
(316, 316)
(316, 316, 3)
```
這裡使用的圖片是大名鼎鼎的萊娜圖
<center> <img src="https://upload.wikimedia.org/wikipedia/zh/3/34/Lenna.jpg"> </center>
從上述的程式碼中可以發現,由於檔案的[副檔名](副檔名)是`jpg`的格式,因此本身就已經移除透明度的資料,也因此這裡用`cv2.IMREAD_COLOR`與`cv2.IMREAD_UNCHANGED`的結果,最終的陣列大小都是一樣**(316×316×3)** 的大小,而使用`cv2.IMREAD_GRAYSCALE`的陣列大小就僅有二維,這是因為取值僅取得明度的部分,也因此每一個像素僅只有一個強度值,故最後大小呈現二維的陣列。
值得一提的是利用OpenCV取得的陣列,一順序分別是`B` `G` `R`的資料,在陣列中分別表示`[:,:,0]` `[:,:,0]` `[:,:,2]` 的資料順序。
### 顯示影像
剛才利用OpenCV將影像匯入了程式內,轉換為陣列,現在顯示的功能將影像匯出
指令如下:
```py
cv2.imshow('Title',data)
```
其中`data`是放入陣列數據。
而這樣的程式碼,一般來說只會讓影像顯示一瞬間就結束程式,故要加入等待指令
```py
cv2.waitKey(0)
```
括號處可填入停留時間,以毫秒作為單位,若填入`0`則會等待使用者按下任意鍵後才進行關閉OpenCV的視窗。
將剛剛匯入的影像再利用`cv2.imshow`顯示後的範例:
```py
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)
```
顯示結果如下:

#### 關閉視窗設定
當開啟多個視窗可利用下列指令來控制關閉的條件
```py
cv2.waitKey(0)
cv2.destroyAllWindows()
```
利用這組指令,當按下任意鍵後則會自動關閉所有視窗,若希望可以一時間按照順序關閉指定圖片可利用下列指令進行控制:
```py
cv2.waitKey(0)
cv2.destroyWindow('Title') #填入指定的視窗名稱
```
### 儲存影像
最後當我們對影像處理完成後,希望儲存一個新的影像檔案,可利用下列指令進行影像儲存的動作
```py
cv2.imwrite('path/name.jpg',var)
```
依序填入儲存位置,及陣列變數名稱,即可針對影像進行儲存
這裡利用將圖片改為負片後存儲下來:
```py
Anegative = np.array(abs(255-A))
cv2.imshow('negative',Anegative)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('negative.png',Anegative)
```
其結果如下:
<center><img src="https://github.com/edwardhome/Notebook/blob/main/opencv_test/negative.png?raw=true"></center>
之後再利用其他深入的使用方式來介紹OpenCV。
#python #OpenCV #程式設計