# OpenCV in Python
## Introduction (簡介)
:::info
- OpenCV 是 Open Source Computer Vision 的縮寫,是一個功能強大的開放原始碼的電腦視覺套件
- 它主要用於即時電腦視覺應用程式
- 主要用途
- OpenCV 的主要用途包括但不限於影像處理、視訊擷取和分析、物體識別與跟蹤、臉部識別和影像增強等
- 它支持多種功能,如影像讀取與寫入、影像轉換、濾波、形態學變換、邊緣偵測和特徵比對等
- 優點
1. **支援跨平台**:OpenCV 支持在多個操作系統上運行,包括 Windows、Linux 和 MacOS。
2. **GPU 加速**:OpenCV 支持 GPU 加速,能顯著提高計算速度。
3. **豐富的套件函數**:提供了多種影像處理和電腦視覺演算法,方便開發者使用。
4. **與其他套件的兼容性**:OpenCV 可以與 NumPy、SciPy 等科學計算套件無縫整合,使數據處理更加高效
- 缺點
1. **學習曲線陡峭**:對於初學者來說,OpenCV 的學習曲線較為陡峭,尤其是在處理複雜的電腦視覺任務時
2. **說明文件不夠詳細**:雖然 OpenCV 的說明文件已經相對完善,但在某些高級功能上仍有不夠詳細之處,可能需要開發者自己去研究和試驗
- OpenCV 適用於多種情境,包括但不限於:
1. **實時視頻處理**:如監控系統中的即時視訊串流分析
2. **物體識別與追踪**:如自動駕駛中的行人識別與追踪
3. **面部識別**:如安全防護系統中的臉部識別
4. **圖像增強與修復**:如醫療影像的增強與修復
:::
## =========== For Windows =============
### Step 1: 環境建立
:::info
#### 建立資料匣
<kbd></kbd>
#### 進入資料匣,開啟 VSCode,建立此目錄下的 conda 環境
<kbd></kbd>
<kbd></kbd>
<kbd></kbd>
#### 進入剛建立的環境下的終端機
<kbd></kbd>
:::
### Step 2: 在 conda 環境裡安裝 opencv 套件
:::success
#### 尋找 opencv 在 conda 下安裝的指令
<kbd></kbd>
<kbd></kbd>
<kbd></kbd>
#### 建一個 test.py 程式檔引用 `import cv2` 執行看看有沒有錯誤訊息
<kbd></kbd>
:::
### OpenCV 使用範例
:::warning
#### 讀入影像,並顯示影像
<kbd></kbd>
<kbd></kbd>
#### 讀入彩色影像,轉換成灰階,顯示後將灰階影像存成檔案
<kbd>
</kbd>
<kbd>
</kbd>
#### 讀入影像,加入藍色矩形框框,將結果儲存成檔案
<kbd>
</kbd>
<kbd>
</kbd>
#### 使用 opencv 進行影像人臉辨識
先點 [<a href='https://github.com/kipr/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml'>這個連結</a>] 下載檔案
<kbd></kbd>
<kbd></kbd>
<kbd></kbd>
<kbd>
</kbd>
**補充說明**
```python=
faces = face_cascade.detectMultiScale(grayImg, 1.1, 4)
```
在 `detectMultiScale(grayImg, 1.1, 4)` 指令參數為
1. **grayImg**:
- 這是輸入圖像,應該是一個灰度圖像。為了提高檢測速度和準確性,通常先將彩色圖像轉換為灰度圖像。
2. **1.1 (scaleFactor)**:
- 這個參數指定了圖像大小在每個圖像金字塔層級縮放的比例。1.1 意味著每次圖像尺寸減少 10%。如果設置為 1.05,則每次尺寸縮小 5%。這個參數可以控制檢測的細緻程度,數值越小檢測越精細,但也會增加計算量。
3. **4 (minNeighbors)**:
- 這個參數指定每個候選矩形應該具有多少個鄰近矩形才能被保留。數值越高,檢測結果越少但質量越高(即,誤檢的可能性更小)。這個參數可以過濾掉一些誤檢的結果。
<kbd></kbd>
source: <a href="https://pyimagesearch.com/2018/09/24/opencv-face-recognition/">https://pyimagesearch.com/2018/09/24/opencv-face-recognition/</a>
:::
## =========== For Mac =============
### Package installation (套件安裝) (Mac OS)
Step 1: 建立一個資料匣
Step 2: 進入資料匣之後 以 VSCode 建立 Conda env (舉例 OpenCV_Project)
Step 3: 進入 OpenCV_Project 環境的終端機畫面
Step 4: 使用 `conda install conda-forge::opencv` 指令安裝 OpenCV 套件
<kbd></kbd>
<kbd></kbd>
Step 5: 使用 `python -m pip install opencv-python` 安裝 OpenCV 套件
<kbd></kbd>
Step 6: 建立一個 python 檔測試看看 套件是否安裝成功
<kbd>
</kbd>
### 使用 opencv 讀入影像並顯示影像
:::success
<kbd>
</kbd>
<kbd></kbd>
```python=
import cv2
if __name__ == "__main__":
img = cv2.imread('imgs/IMG_0464.jpeg')
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
:::
### 讀入影像將影像轉成灰階影像後顯示影像並儲存成檔案
:::info
<kbd></kbd>
<kbd>
</kbd>
```python=
import cv2
if __name__ == "__main__":
img = cv2.imread('imgs/IMG_0464.jpeg')
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('Gray image', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('imgs/gray_image.jpg', gray_image)
```
:::
### 讀入影像在影像中畫紅色框框
:::warning
<kbd>
</kbd>
<kbd>
</kbd>
```python=
import cv2
img = cv2.imread('imgs/IMG_0464.jpeg')
imgH, imgW = img.shape[0], img.shape[1]
start_point = (int(imgW/4), int(imgH/4))
end_point = (int(imgW*3/4), int(imgH*3/4))
color = (0, 0, 255) # BGR 中的紅色
thickness = 8
image = cv2.rectangle(img,
start_point,
end_point,
color,
thickness)
cv2.imwrite('imgs/rectangle_output.jpg', image)
```
:::
### 讀入影像並識別影像中的人臉
:::info
先前往 <a href='https://github.com/kipr/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml'>連結</a> 下載人臉檢測的 xml 檔,並將檔案放到程式相同資料匣內
<kbd></kbd>
**範例程式**
<kbd>
</kbd>
**執行結果**
<kbd></kbd>
```python=
import cv2
if __name__ == '__main__':
# 載入人臉檢測的 xml 檔案
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
image = cv2.imread('imgs/IMG_0464.jpeg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 255), 6)
cv2.imshow('Face Detection', image)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.imwrite('imgs/face_detection.jpg', image)
```
:::