Like Share Discussion Bookmark Smile

J.J. Huang   2026-01-31   Python OpenCV 04.幾何與繪圖篇   瀏覽次數:次   DMCA.com Protection Status

Python | OpenCV 在圖片中加入文字標註

📚 前言

在前一篇我們學會了 繪製各種形狀,能夠在圖片上標註直線、矩形、圓形、橢圓、多邊形與箭頭。
這一篇要介紹 在圖片中加入文字標註,這是影像處理中非常常見的需求,例如在圖片上加上說明文字、標記人名或顯示座標資訊。

📝 繪製文字(Text)

原理說明

OpenCV 提供 cv2.putText() 函式來繪製文字:

1
cv2.putText(img, text, org, fontFace, fontScale, color, thickness, lineType)
  • text:要顯示的文字字串。
  • org:文字左下角的座標 (x, y)。
  • fontFace:字型,例如 cv2.FONT_HERSHEY_SIMPLEX
  • fontScale:字體大小縮放。
  • color:文字顏色 (BGR 格式)。
  • thickness:字體粗細。
  • lineType:線條類型,常用 cv2.LINE_AA 讓文字更平滑。

💻 範例程式:基本文字標註

1
2
3
4
5
6
7
8
9
10
11
12
13
import cv2
import numpy as np

# 建立一張黑色背景圖片
img = np.zeros((300, 350, 3), dtype="uint8")

# 在圖片上繪製文字
cv2.putText(img, "Hello OpenCV", (50, 150),
cv2.FONT_HERSHEY_SIMPLEX, 1.2, (255, 255, 0), 2, cv2.LINE_AA)

cv2.imshow("Text Example", img)
cv2.waitKey(0)
cv2.destroyAllWindows()


圖:程式碼執行結果 — 基本文字標註

💻 範例程式:多種字型與大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import cv2
import numpy as np

# 建立一張黑色背景圖片
img = np.zeros((300, 300, 3), dtype="uint8")

# 使用不同字型與大小示範

# SIMPLEX:最常用的基本字型,字體簡單清晰
# (30, 50) 為文字左下角座標
# fontScale=1 表示字體大小,(255,255,255) 為白色,thickness=2 表示字體粗細
cv2.putText(img, "SIMPLEX", (30, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 2)

# DUPLEX:比 SIMPLEX 更厚重的字型,字體較粗
# 顏色設為綠色 (0,255,0)
cv2.putText(img, "DUPLEX", (30, 100), cv2.FONT_HERSHEY_DUPLEX, 1, (0,255,0), 2)

# COMPLEX:較複雜的字型,筆劃更細緻
# 顏色設為紅色 (0,0,255)
cv2.putText(img, "COMPLEX", (30, 150), cv2.FONT_HERSHEY_COMPLEX, 1, (0,0,255), 2)

# ITALIC:斜體字,通常搭配 COMPLEX 或 SIMPLEX 使用
# 使用 FONT_HERSHEY_COMPLEX | FONT_ITALIC 表示複合字型 + 斜體
# 顏色設為黃色 (255,255,0)
cv2.putText(img, "ITALIC", (30, 200), cv2.FONT_HERSHEY_COMPLEX | cv2.FONT_ITALIC, 1, (255,255,0), 2)

cv2.imshow("Fonts Example", img)
cv2.waitKey(0)
cv2.destroyAllWindows()


圖:程式碼執行結果 — 多種字型與大小

🀄 顯示中文字

原理說明

OpenCV 的 cv2.putText() 只支援英文字型,如果直接輸入中文字,通常會出現亂碼或無法顯示。
要在圖片中正確顯示中文,必須搭配 Pillow (PIL) 與 OpenCV:

  1. 準備中文字型檔
    • 下載支援繁體或簡體中文的字型,例如 Google 的 Noto Sans Traditional Chinese
    • 解壓縮後會得到 .ttf 檔案(例如 NotoSansTC-Regular.ttf)。
    • 將字型檔放在程式同一個資料夾,或指定完整路徑。
  2. 使用 Pillow 繪製文字
    • 先將 OpenCV 的圖片轉換成 Pillow 的 Image 格式。
    • 使用 ImageFont.truetype() 載入中文字型檔。
    • ImageDraw.text() 在圖片上繪製中文字。
  3. 轉回 OpenCV 格式
    • 將 Pillow 的圖片轉換成 numpy array,就能繼續用 OpenCV 顯示或處理。
  • 💡 補充說明:常見可用的中文字型檔包括:
    • Noto Sans TC (NotoSansTC-Regular.ttf) — Google 提供的免費字型,支援繁體中文。
    • 微軟正黑體 (msjh.ttc) — Windows 系統常見字型。
    • 思源黑體 (SourceHanSansTC-Regular.otf) — Adobe & Google 合作的開源字型。

💻 範例程式:中文字標註

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import cv2
import numpy as np
from PIL import ImageFont, ImageDraw, Image

# 建立黑色背景圖片
img = np.zeros((300, 350, 3), dtype="uint8")

# 轉換成 PIL Image
pil_img = Image.fromarray(img)

# 指定中文字型檔 (例如 NotoSansTC-Regular.ttf)
font = ImageFont.truetype("NotoSansTC-Regular.ttf", 32, encoding="utf-8")

# 繪製中文字
draw = ImageDraw.Draw(pil_img)
draw.text((50, 120), "你好,OpenCV!", font=font, fill=(255, 255, 0))

# 轉回 OpenCV 格式
img = np.array(pil_img)

cv2.imshow("Chinese Text", img)
cv2.waitKey(0)
cv2.destroyAllWindows()


圖:程式碼執行結果 — 顯示中文字

💻 範例程式:文字搭配形狀標註

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import cv2
import numpy as np

img = np.zeros((300, 300, 3), dtype="uint8")

# 繪製矩形框
cv2.rectangle(img, (50, 50), (200, 200), (0,255,0), 2)

# 在框旁邊加上文字標註
cv2.putText(img, "Target Area", (50, 45), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0,255,0), 2, cv2.LINE_AA)

cv2.imshow("Text with Shape", img)
cv2.waitKey(0)
cv2.destroyAllWindows()


圖:程式碼執行結果 — 文字搭配形狀標註

📊 效果比較

功能 函式 常見用途
基本文字 cv2.putText() 在圖片上加上簡單文字
多種字型 cv2.putText() + 字型選擇 美化文字展示
中文文字 Pillow + OpenCV 顯示繁體或簡體中文
文字搭配形狀 cv2.putText() + cv2.rectangle() 標註區域並加上說明

⚠️ 注意事項

  • 座標系統:文字座標是以左下角為基準。
  • 字型選擇:OpenCV 內建字型只支援英文,顯示中文需搭配 Pillow。
  • 字型檔:必須準備支援中文的字型檔(如 NotoSansTC-Regular.ttf、微軟正黑體 msjh.ttc)。
  • 平滑效果:建議使用 cv2.LINE_AA,文字邊緣會更平滑。
  • 顏色格式:OpenCV 使用 BGR,而 Pillow 使用 RGB,轉換時要注意。

🎯 結語

這一篇我們學會了 在圖片中加入文字標註,包括英文與中文的處理方式,能夠在影像上加上說明文字或標記資訊。這些技巧在影像處理、資料集標註、製作教學圖片時非常常見。

在下一篇,我們將進一步探索 建立遮罩與透明效果,學習如何利用遮罩來選擇性處理影像區域,並透過透明度控制讓圖片合成更自然。

📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。

註:以上參考了
OpenCV Tutorials
OpenCV-Python Tutorials