---
# System prepended metadata

title: OpenCV 學習筆記

---

# [ OpenCV ] 學習歷程筆記

使用程式語言:python
使⽤套件:cv2
作者:允安B


---

這份教學將帶您進入 OpenCV 的世界，特別針對圖像處理的入門內容。我們會從基本概念開始，逐步介紹如何使用 OpenCV 處理圖片，並提供實用的程式碼範例。無論您是初學者還是想快速複習，這個教學都會幫到您！

## 基本介紹
什麼是 OpenCV？
OpenCV（Open Source Computer Vision Library）是一個功能強大的開源電腦視覺函式庫，專為圖像和影片處理設計。它就像一個工具箱，裡面裝滿了各種圖像處理的工具，從簡單的縮放、旋轉，到複雜的人臉辨識、物件追蹤，應有盡有。搭配 Python 的 NumPy 庫，OpenCV 能高效處理圖像數據，讓您用幾行程式碼實現專業效果。例如，您可以用它把彩色照片變成黑白素描，或從影片中提取重要畫面。

## 安裝 OpenCV
在開始之前，您需要安裝 OpenCV。請確保您的電腦已有 Python（建議版本 3.7 或以上）和 pip。安裝步驟很簡單：

打開終端機（Windows 用 CMD 或 PowerShell，macOS/Linux 用 Terminal）。

輸入以下指令：
`pip install opencv-python`
安裝完成後，檢查是否成功：
`print(cv2.__version__)`
如果顯示版本號（例如 4.10.0），就表示成功了！若失敗，可嘗試更新 pip：
`pip install --upgrade pip`
注意：若您的系統有多個 Python 版本，確保使用正確的 pip（例如 pip3）。Windows 用戶若遇到問題，可考慮用 Anaconda 建立虛擬環境。

## 圖片檔案與路徑
在使用 OpenCV 讀取圖片時，檔案路徑非常重要。以下是基本原則：

建議也是最直覺的作法是將圖片（例如 image.jpg）放在與 Python 腳本同一資料夾。

```
project_folder/
├── script.py
├── image.jpg
```

這樣只需用檔名即可讀取：
`image = cv2.imread('image.jpg')`

### 相對路徑
如果圖片在子資料夾，例如 
```
project_folder/
├── script.py
├── allimage/ image1.jpg
```
則可寫：`image = cv2.imread('allimage/image1.png')`
### 絕對路徑
如果圖片在其他地方，你也可以直接寫完整路徑，例如：
```
Windows：C:/Users/YourName/project_folder/image.jpg
macOS/Linux：/home/yourname/project_folder/image.jpg
```


---

小技巧：在 Windos 中，你可以在資料夾中對圖片按右鍵，選擇"內容"後選擇"詳細資料"，接著你可以看到圖片大小(像素)、資料夾路徑等資訊

![image](https://hackmd.io/_uploads/rkE9mnMMxx.png)

## 運作邏輯
OpenCV 的核心概念
OpenCV 的運作核心在於將圖像和影片視為 數值陣列，透過 NumPy 進行高效處理。這就像把圖片當成一個巨大的數字表格，每個格子存著像素資訊。理解這個邏輯，您就能輕鬆掌握 OpenCV 的魔法！
### 圖像如何表示？
在 OpenCV 中，圖像是以 NumPy 陣列儲存的，具體形式取決於圖像類型：

#### 彩色圖像（BGR 格式）
三維陣列，形狀為 (高度, 寬度, 3)，其中 3 代表藍（B）、綠（G）、紅（R）三個通道。每個像素是一個 [B, G, R] 數值組合，例如 `[255, 0, 0]` 表示純藍。
#### 灰階圖像
二維陣列，形狀為 (高度, 寬度)，每個像素只有單一亮度值（0 到 255，0 為黑，255 為白）。
#### 影片
一堆圖像（每一張稱為幀），按時間順序排列，像一本快速翻動的圖畫書。

假設一張 2x2 的彩色圖像，其陣列可能如下：
```
[
  [[255, 0, 0], [0, 255, 0]],  # 第一行：藍色像素、綠色像素
  [[0, 0, 255], [100, 100, 100]]  # 第二行：紅色像素、灰色像素
]
```
灰階版本則是：
```
[
  [200, 150],  # 第一行亮度值
  [100, 50]    # 第二行亮度值
]
```

### `img.shape`
`img.shape` 是 NumPy 陣列的屬性，用來查看圖像的尺寸和通道數，返回一個 tuple：

彩色圖像：(高度, 寬度, 3)，例如 (1080, 1920, 3) 表示 1080 像素高、1920 像素寬的彩色圖。
灰階圖像：(高度, 寬度)，例如 (1080, 1920)。
如果圖片未載入，則會報錯（需檢查 img is None）。

範例：檢查圖像形狀：
```
import cv2
image = cv2.imread('image.jpg')
if image is None:
    print("錯誤：圖片沒讀到！")
else:
    print(image.shape)
```
假設圖片是 1920x1080 的彩色圖，輸出會是：`(1080, 1920, 3)`

可以把 `img.shape`想像成可以告訴你圖片規格的函數：
```
+--------------------+  ← 寬度 (1920 像素)
|                    |
|                    |  ↑ 高度 (1080 像素)
|                    |  × 3 (BGR 通道)
+--------------------+
```
## 圖片轉化以及範例程式碼
OpenCV 的圖像處理本質上是對 NumPy 陣列的操作。您可以直接修改像素值，或使用內建函式進行轉換。常見轉化包括：

色彩轉換：例如從 BGR 轉灰階，用 cv2.cvtColor() 將三維陣列壓縮成二維，去掉色彩只留亮度。
縮放：用 `cv2.resize()` 改變陣列尺寸，例如把 (1080, 1920) 縮到 (300, 300)。
旋轉：用 `cv2.rotate()` 重新排列像素，例如順時針 90 度會交換高度和寬度。
切割：用陣列切片提取部分區域，例如只取左上角。

### 切割圖片
切割圖片是直接操作 NumPy 陣列的子集，使用 `[y1:y2, x1:x2]` 語法提取指定區域。`y1:y2` 選取高度範圍，`x1:x2` 選取寬度範圍。
範例：切割圖片的左上四分之一：
```
import cv2
image = cv2.imread('image.jpg')
if image is None:
    print("錯誤：圖片沒讀到！")
else:
    height, width = image.shape[0:2]  # 取得高度和寬度
    cropped_image = image[0:height//2, 0:width//2]  # 切割左上角
    cv2.imshow('切割後', cropped_image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
```

假設原圖是 1000x1000，切割後是 500x500：
```
+-----------------------+
| [保留區域] |           |  ← (0:500, 0:500)
|-----------+-----------|
|           |           |
+-----------------------+
切割後：
+---------+
| 500x500 |  ← 只保留左上角區域
+---------+
```

注意：確保 `y1:y2` 和 `x1:x2` 不超過圖像邊界，否則會報錯。


---

## 常見函數語法
以下是 OpenCV 的核心函數，以及一些簡單範例：
cv2.imread()
功能：讀取圖像。語法：
image = cv2.imread('檔案路徑', 模式)

範例：
image = cv2.imread('image.jpg')

cv2.imshow()
功能：顯示圖像。語法：
cv2.imshow('視窗名稱', 圖像)

範例：
cv2.imshow('圖像', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.imwrite()
功能：儲存圖像。語法：
cv2.imwrite('新檔案名稱', 圖像)

範例：
cv2.imwrite('saved_image.jpg', image)

cv2.resize()
功能：調整圖像大小。語法：
resized_image = cv2.resize(圖像, (寬度, 高度))

範例：
resized_image = cv2.resize(image, (300, 300))

cv2.cvtColor()
功能：轉換色彩空間。語法：
converted_image = cv2.cvtColor(圖像, 轉換代碼)

範例：
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

cv2.rectangle()
功能：繪製矩形。語法：
cv2.rectangle(圖像, (x1, y1), (x2, y2), 顏色, 粗細)

範例：
cv2.rectangle(image, (100, 100), (200, 200), (0, 0, 255), 2)

cv2.VideoCapture()
功能：開啟影片或攝影機。語法：
cap = cv2.VideoCapture(來源)

範例：
cap = cv2.VideoCapture('video.mp4')

圖像操作
以下是實用的圖像處理範例，結合上述函數。
讀取、顯示與儲存
範例：讀取、顯示並儲存圖片：
import cv2
image = cv2.imread('image.jpg')
if image is None:
    print("錯誤：圖片沒讀到！")
else:
    cv2.imshow('圖像', image)
    cv2.waitKey(0)
    cv2.imwrite('saved_image.jpg', image)
    cv2.destroyAllWindows()

縮放與色彩轉換
範例：轉灰階並縮放：
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
resized_image = cv2.resize(gray_image, (300, 300))
cv2.imshow('灰階縮放', resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

切割圖片
範例：切割左上角：
height, width = image.shape[:2]
cropped_image = image[0:height//2, 0:width//2]
cv2.imshow('切割後', cropped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

播放影片
範例：播放影片，按 'q' 退出：
cap = cv2.VideoCapture('video.mp4')
while True:
    ret, frame = cap.read()
    if not ret:
        break
    cv2.imshow('影片', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

學完之後
您現在應該對 OpenCV 的基礎有了扎實理解！這些技能是電腦視覺的敲門磚，後續可進階到人臉辨識或物件追蹤。想深入學習？試試這些資源：

OpenCV 官方文件（{%preview https://docs.opencv.org/%}）：函式詳細說明。
LearnOpenCV（{%preview https://learnopencv.com/%}）：實用教學。
PyImageSearch（{%preview https://pyimagesearch.com/%}）：進階應用。

動手做個小專案吧，例如把照片轉成卡通風，或從影片抓出特定畫面。OpenCV 的世界等您探索！
