
跟身邊很多想入門電腦視覺的朋友聊過,最常聽到的卡關點是這句:
「我看了一堆教學,但好像每個都要我先讀完線性代數、再讀完 CNN、再讀完 transformer,那我什麼時候才能跑出一張有結果的圖?」
懂,我也經歷過這個階段。所以這篇我直接反過來——先讓你看到結果,再回頭講原理。三個範例由淺到深:
- 第一天:Webcam 即時 Canny 邊緣偵測(約 14 行 Python)
- 第一週:拍一張紙、自動轉成 A4 PDF 的文件掃描器(約 35 行 Python)
- 第一個月:拿 YOLO11 接上 Webcam 做即時物件偵測(約 15 行 Python)
整篇文章我不會碰太重的數學,只在你需要踩坑時提醒一下。Code 全部可以直接複製貼上跑。
環境與前置條件
不囉嗦,先給你一個能用的環境:
| 項目 | 建議版本 | 說明 |
|---|---|---|
| Python | 3.11 或 3.12 | 3.13 也行,但部分套件 wheel 可能還沒到位 |
| OpenCV | opencv-python==4.13.x | 寫這篇時最新;想嚐鮮 5.0 可改 opencv-python>=5.0 |
| NumPy | 2.x | OpenCV 從 4.11.0 起正式支援 NumPy 2.x,本文用 4.13 |
| Ultralytics | ultralytics>=8.3 | 第三個範例用到 YOLO11 |
| 攝影機 | 內建 Webcam 或 USB cam | macOS 第一次跑要授權 Terminal/IDE 攝影機權限 |
裝環境一行解決:
python -m venv .venv && source .venv/bin/activate
pip install "opencv-python>=4.13" "numpy>=2.0" "ultralytics>=8.3"
如果你不確定 Webcam 跑不跑得起來,先存這個 5 行的「相機測試」:
import cv2
cap = cv2.VideoCapture(0) # macOS 上有時要試 1、2
ok, frame = cap.read()
print("frame shape =", frame.shape if ok else "FAILED")
cap.release()
跑得出 shape 就代表 OK。跑不出來最常見原因是權限——macOS 去「系統設定 → 隱私權與安全性 → 攝影機」把你的 Terminal 打勾。
範例 1:Webcam 即時 Canny(第一天就能跑)
Canny 邊緣偵測 是電腦視覺的「Hello World」。它是 1986 年 John Canny 提出來的演算法,用兩個閾值找出影像中「梯度夠陡」的位置,這些位置就是邊緣。
import cv2
cap = cv2.VideoCapture(0)
while True:
ok, frame = cap.read()
if not ok:
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 1.4)
edges = cv2.Canny(blurred, 80, 160)
cv2.imshow("Canny", edges)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
這 14 行東西就是一個即時邊緣偵測程式。按 q 退出。手動把鏡頭對著房間裡任何東西——書本、馬克杯、貓——你會看到輪廓被白色線條精準畫出來。
三個重點記下來
cvtColor(BGR2GRAY):OpenCV 讀進來的圖預設是 BGR(不是 RGB),這是 1999 年留下來的歷史包袱,別問為什麼,習慣就好。GaussianBlur是 Canny 前必做的去噪:不模糊一下,邊緣會一堆雜訊。Canny(img, low, high)的兩個閾值用「low ≈ high / 2」這個經驗法則調起,效果不好再 fine-tune。

範例 2:自動文件掃描器(第一週的成就感)
這是 PyImageSearch 入門系列 裡的經典題目。你拍一張歪歪的紙本文件,程式自動找到文件邊框、把它矯正成正面、輸出乾淨的掃描結果。要用到三個技巧的組合:Canny → findContours → warpPerspective。
import cv2
import numpy as np
def order_points(pts):
rect = np.zeros((4, 2), dtype="float32")
s = pts.sum(axis=1)
rect[0] = pts[np.argmin(s)] # 左上
rect[2] = pts[np.argmax(s)] # 右下
diff = np.diff(pts, axis=1)
rect[1] = pts[np.argmin(diff)] # 右上
rect[3] = pts[np.argmax(diff)] # 左下
return rect
img = cv2.imread("paper.jpg")
ratio = img.shape[0] / 800.0
small = cv2.resize(img, (int(img.shape[1] / ratio), 800))
gray = cv2.cvtColor(small, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
edges = cv2.Canny(blurred, 75, 200)
contours, _ = cv2.findContours(edges, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
contours = sorted(contours, key=cv2.contourArea, reverse=True)[:5]
doc_cnt = None
for c in contours:
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.02 * peri, True)
if len(approx) == 4:
doc_cnt = approx
break
if doc_cnt is None:
raise RuntimeError("找不到文件四邊形——請拍張對比度高一點的照片再試")
pts = order_points(doc_cnt.reshape(4, 2) * ratio)
(tl, tr, br, bl) = pts
maxW = int(max(np.linalg.norm(br - bl), np.linalg.norm(tr - tl)))
maxH = int(max(np.linalg.norm(tr - br), np.linalg.norm(tl - bl)))
dst = np.array([[0, 0], [maxW - 1, 0], [maxW - 1, maxH - 1], [0, maxH - 1]], dtype="float32")
M = cv2.getPerspectiveTransform(pts, dst)
warped = cv2.warpPerspective(img, M, (maxW, maxH))
cv2.imwrite("scanned.jpg", warped)
把任何一張包含 A4 紙的照片存成 paper.jpg,跑一次,會吐出 scanned.jpg——一張矯正後的乾淨文件圖。
流程拆解
原始照片
→ 縮小 + 灰階
→ GaussianBlur
→ Canny 邊緣
→ findContours 找最大輪廓
→ approxPolyDP 拿四個角
→ order_points 排序角點
→ getPerspectiveTransform + warpPerspective 矯正
→ 輸出 scanned.jpg
常見踩坑
| 症狀 | 原因 | 解法 |
|---|---|---|
| 找不到四邊形 | 邊緣斷裂 / 文件邊框不完整 | 拍照時讓紙本與背景對比大;可改用 cv2.morphologyEx 補邊 |
| 矯正結果上下顛倒 | order_points 排序錯 | 檢查 s 和 diff 的方向;OpenCV 座標 y 軸向下 |
| 顏色發黃 | 沒做白平衡 | 對 warped 再做 cv2.adaptiveThreshold 變黑白文件 |

範例 3:YOLO11 + OpenCV,第一個月就能玩現代物件偵測
範例 2 教你用幾何方法處理靜態文件,但你應該已經想到下一個問題——「畫面裡到底有什麼東西」這個問題傳統 CV 沒辦法回答,因為它需要語意理解。這就是深度學習接手的地方。
到了 2026 年,光會傳統 CV 不夠——你要會把 OpenCV 跟現代深度學習模型接起來。最簡單的接法就是 Ultralytics YOLO,這套工具把訓練、推論、export 整個包成幾行 Python。
import cv2
from ultralytics import YOLO
model = YOLO("yolo11n.pt") # 第一次跑會自動下載 nano 模型
cap = cv2.VideoCapture(0)
while True:
ok, frame = cap.read()
if not ok:
break
results = model(frame, verbose=False)
annotated = results[0].plot()
cv2.imshow("YOLO11 + OpenCV", annotated)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
15 行 Python,你的 Webcam 已經能即時辨識 80 類常見物件(人、貓、筆電、手機、椅子⋯⋯)。
為什麼這樣搭最聰明?
OpenCV 與 YOLO 是分工關係,不是替代關係:
- OpenCV 負責:相機 I/O、影像前處理(resize、色彩空間)、後處理(畫框、寫字、輸出影片)
- YOLO 負責:推論、給出 bounding box
如果你想做進階一點的「物件追蹤 + 計數 + 視覺化」,加上 Roboflow Supervision 這個套件會更省事——它是 model-agnostic 的,YOLO、SAM、Hugging Face Transformers 接哪個都一致。
Python vs C++:新手怎麼選?
這是入門最常糾結的問題。直接給你結論:
| 比較項 | Python | C++ |
|---|---|---|
| 學習曲線 | 平緩 | 陡到爆 |
| 開發速度 | 快(Jupyter 互動式視覺化) | 慢 |
| 純 OpenCV 呼叫的執行速度 | 跟 C++ 接近(底層仍是 C++) | 最快 |
| 自寫 for-loop 逐像素處理 | 非常慢(必須改 NumPy 向量化) | 快 |
| 部署目標 | 桌面、伺服器、Mac、PC | 嵌入式、即時、IoT |
新手的話無腦選 Python。LearnOpenCV 在這篇對比文 也建議:「If you are a python programmer, use OpenCV with Python.」原因很簡單——Python 加 Jupyter Notebook 可以做到「改一行、馬上看到結果」,這對學 CV 是無可取代的優勢。
什麼時候才需要 C++?等你以後要把模型部署到 Jetson Nano、做即時 30fps 以上的工業檢測、或者自己寫像素級新演算法,再轉就好。多數應用其實一輩子不用碰 C++。
學會這三招之後要往哪走?
到這裡你已經會:讀寫影像、邊緣偵測、輪廓 + 透視變換、現代物件偵測。下一步建議按這個順序走:
OpenCV 經典 + YOLO 入門(你在這)
→ NumPy 向量化(避免 Python for-loop 地獄)
→ CS231n 講義(理解 CNN / ResNet / ViT)
→ 自訓資料集(Roboflow 標註 → YOLO 訓練)
→ ONNX export(跨框架部署)
→ 邊緣裝置(Raspberry Pi 5 / Jetson Orin Nano)
→ VLM 多模態(OpenCV 5 內建 Qwen / PaliGemma)
幾個我自己覺得最受用的資源:
- PyImageSearch:Adrian Rosebrock 寫的,新手聖地
- LearnOpenCV:OpenCV.org 官方部落格,C++ 與 Python 雙語範例
- Stanford CS231n:CNN 領域的聖經,YouTube 免費
- Ultralytics Docs:YOLO 系列最完整的官方教學
新手最常踩的五個坑
最後分享幾個我自己踩過的坑,少走點冤枉路:
- 跳過經典 CV 直接學 YOLO:不懂 NMS、IoU、anchor 是什麼,模型一壞就只能換版本。
- 覺得 OpenCV 過時所以不學:5.0 才剛把 LLM/VLM 整合進來,反而比以前更值得學。
- Python 用 for-loop 處理像素:慢到懷疑人生,所有逐像素操作必須改 NumPy 向量化。
- 只會
model.predict()不會部署:找工作會卡關。學會 ONNX export、INT8 量化、用 OpenCV DNN 跑推論。 - 資料集太乾淨:Kaggle 的影像太理想,去 Roboflow Universe 找接近真實雜訊的資料才有用。
結語
電腦視覺看起來很玄,其實 80% 的入門路徑就只是「讀進影像 → 做幾個變換 → 輸出結果」這個迴圈。三個範例你都跑過一次之後,這個迴圈會內化成肌肉記憶——剩下的就是把不同的工具(OpenCV、YOLO、Supervision、SAM2、VLM)塞進這個迴圈裡組合。
下一篇會深拆 2026 年 6 月剛發布的 OpenCV 5.0——它把整個 DNN 引擎重寫、ONNX 覆蓋率衝到 80%、還把 LLM 跟 VLM 直接塞進函式庫。如果你已經會用 OpenCV 4.x,那篇會告訴你升級該注意什麼;如果你剛入門,那篇會讓你看見未來兩年 CV 的樣貌。
延伸閱讀
- OpenCV Tutorial - PyImageSearch —— 系統性入門
- Contour Detection - LearnOpenCV —— 文件掃描器原理拆解
- Ultralytics YOLO Docs —— YOLO11 完整指南
- Roboflow Supervision —— model-agnostic 視覺化與追蹤
- OpenCV Python Tutorial - GeeksforGeeks —— API 速查
- Stanford CS231n - CNNs for Visual Recognition —— DL CV 聖經
- The Beginner's Guide to Computer Vision - MachineLearningMastery —— 整體輪廓
沒有留言:
張貼留言