---
# System prepended metadata

title: OpenCV in Python
tags: [OpenCV, CV2, Python]

---

# 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>![Screenshot 2024-06-02 at 7.59.17 AM](https://hackmd.io/_uploads/HyliIEFNC.jpg)</kbd>

#### 進入資料匣，開啟 VSCode，建立此目錄下的 conda 環境
<kbd>![Screenshot 2024-06-02 at 8.05.28 AM](https://hackmd.io/_uploads/S1GiOVKVR.png)</kbd>


<kbd>![Screenshot 2024-06-02 at 8.07.18 AM](https://hackmd.io/_uploads/H1ZJt4tEA.png)</kbd>

<kbd>![Screenshot 2024-06-02 at 8.08.02 AM](https://hackmd.io/_uploads/Bk-lFEYVC.png)</kbd>

#### 進入剛建立的環境下的終端機
<kbd>![Screenshot 2024-06-02 at 8.18.19 AM](https://hackmd.io/_uploads/SJSs9NYE0.jpg)</kbd>
:::


### Step 2: 在 conda 環境裡安裝 opencv 套件

:::success
#### 尋找 opencv 在 conda 下安裝的指令
<kbd>![Screenshot 2024-06-02 at 8.24.46 AM](https://hackmd.io/_uploads/Bk5mnVYEC.png)</kbd>

<kbd>![Screenshot 2024-06-02 at 8.25.01 AM](https://hackmd.io/_uploads/ryt43EFNR.jpg)</kbd>

<kbd>![Screenshot 2024-06-02 at 8.30.08 AM](https://hackmd.io/_uploads/B1T3-HtVC.jpg)</kbd>

#### 建一個 test.py 程式檔引用 `import cv2` 執行看看有沒有錯誤訊息
<kbd>![Screenshot 2024-06-02 at 8.53.08 AM](https://hackmd.io/_uploads/SJzJXHtVA.jpg)</kbd>
:::


### OpenCV 使用範例

:::warning
#### 讀入影像，並顯示影像
<kbd>![Screenshot 2024-06-02 at 9.04.31 AM](https://hackmd.io/_uploads/Hy_3rSKVR.jpg)</kbd>

<kbd>![Screenshot 2024-06-02 at 9.00.35 AM Large](https://hackmd.io/_uploads/BJbAHStE0.jpg)</kbd>

#### 讀入彩色影像，轉換成灰階，顯示後將灰階影像存成檔案
<kbd>![Screenshot 2024-06-02 at 9.16.13 AM](https://hackmd.io/_uploads/ryM8uHF4R.jpg)
</kbd>

<kbd>![Screenshot 2024-06-02 at 9.11.34 AM Large](https://hackmd.io/_uploads/SyxvOBtNR.jpg)
</kbd>

#### 讀入影像，加入藍色矩形框框，將結果儲存成檔案
<kbd>![Screenshot 2024-06-02 at 9.32.48 AM Large](https://hackmd.io/_uploads/HkfshSYVA.jpg)
</kbd>

<kbd>![Screenshot 2024-06-02 at 9.24.27 AM Large](https://hackmd.io/_uploads/rJW23HF4C.jpg)
</kbd>

#### 使用 opencv 進行影像人臉辨識
先點 [<a href='https://github.com/kipr/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml'>這個連結</a>] 下載檔案
<kbd>![Screenshot 2024-06-02 at 2.01.48 PM](https://hackmd.io/_uploads/SJ8InFKER.jpg)</kbd>

<kbd>![Screenshot 2024-06-02 at 2.02.00 PM](https://hackmd.io/_uploads/rkywntKE0.png)</kbd>

<kbd>![Screenshot 2024-06-02 at 4.05.05 PM](https://hackmd.io/_uploads/HyZSOsKVA.jpg)</kbd>

<kbd>![Screenshot 2024-06-02 at 2.15.38 PM Large](https://hackmd.io/_uploads/HktwdiK4A.jpg)
</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>![OpenCV_FaceRecognition](https://hackmd.io/_uploads/SJ6enotV0.jpg)</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>![Screenshot 2024-06-01 at 9.19.29 PM](https://hackmd.io/_uploads/BJguWjO4C.png)</kbd>

<kbd>![Screenshot 2024-06-01 at 9.19.06 PM](https://hackmd.io/_uploads/HyW3bidV0.png)</kbd>

Step 5: 使用 `python -m pip install opencv-python` 安裝 OpenCV 套件
<kbd>![Screenshot 2024-06-01 at 9.24.59 PM](https://hackmd.io/_uploads/BJoWMjdE0.png)</kbd>

Step 6: 建立一個 python 檔測試看看 套件是否安裝成功 
<kbd>![Screenshot 2024-06-01 at 9.30.21 PM](https://hackmd.io/_uploads/H1voModE0.png)
</kbd>


### 使用 opencv 讀入影像並顯示影像

:::success
<kbd>![Screenshot 2024-06-01 at 10.22.29 PM](https://hackmd.io/_uploads/BJV8fhdVR.png)
</kbd>

<kbd>![Screenshot 2024-06-01 at 10.29.02 PM Large](https://hackmd.io/_uploads/ByMRf3dEC.jpg)</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>![Screenshot 2024-06-01 at 10.48.37 PM](https://hackmd.io/_uploads/BkYsrnu4R.png)</kbd>

<kbd>![Screenshot 2024-06-01 at 10.43.54 PM Large](https://hackmd.io/_uploads/rJ6hB3OEA.jpg)
</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>![Screenshot 2024-06-01 at 11.04.25 PM](https://hackmd.io/_uploads/HysLqhOVC.png)
</kbd>

<kbd>![Screenshot 2024-06-01 at 11.08.54 PM](https://hackmd.io/_uploads/r1aY5h_4C.jpg)
</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>![Screenshot 2024-06-01 at 11.27.43 PM](https://hackmd.io/_uploads/HykWWpdVC.png)</kbd>

**範例程式**
<kbd>![Screenshot 2024-06-03 at 9.25.36 AM](https://hackmd.io/_uploads/Hk_Ts954A.jpg)
</kbd>

**執行結果**
<kbd>![Screenshot 2024-06-01 at 11.36.44 PM](https://hackmd.io/_uploads/Hy8UZaOE0.jpg)</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)
```
:::