博客 / 詳情

返回

『OpenCV-Python』繪製圖形

點贊 + 關注 + 收藏 = 學會了

推薦 《OpenCV-Python專欄》

使用 OpenCV 做目標檢查時,我們可以通過 OpenCV 提供的圖形繪製功能,將監測到的目標框起來,方便我們調試。這些功能在數據可視化、圖像標註等場景中非常實用。

OpenCV 支持繪製以下圖形:

  • 線段
  • 矩形
  • 圓形
  • 橢圓
  • 多邊形
  • 填充多邊形
  • 帶箭頭的線

用法都很簡單,動手試試~

繪製線段

繪製線段的方法叫 cv2.line()

可傳以下參數

cv2.line(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)
  • img: 要繪製直線的目標圖像。
  • pt1: 起點座標。
  • pt2: 終點座標。
  • color: 線條顏色((B, G, R) 格式)。
  • thickness: 線條寬度(默認 1,負值無效)。
  • lineType: 線條類型(cv2.LINE_8 默認)。

    • cv2.LINE_8(默認值):8-connected 線條(像素完全連接)。
    • cv2.LINE_4:4-connected 線條(像素部分連接)。
    • cv2.LINE_AA:抗鋸齒線條(平滑效果更好)。
  • shift: 座標的小數點精度(用於處理亞像素座標)。默認為 0,表示整數座標。

01.png

import cv2
import numpy as np

# 創建空白圖像
img = np.zeros((400, 400, 3), dtype=np.uint8)

# 繪製不同類型的線條
cv2.line(img, (50, 50), (200, 50), (255, 255, 255), 1)            # 白色線條,默認類型
cv2.line(img, (50, 100), (200, 100), (0, 255, 0), 30)          # 綠色線條,粗細為 30
cv2.line(img, (50, 150), (200, 150), (0, 0, 255), 30, cv2.LINE_AA)  # 紅色抗鋸齒線條

# 展示圖片
cv2.imshow("Img", img)

cv2.waitKey(0)
cv2.destroyAllWindows()

繪製矩形

繪製矩形的方法是 cv2.rectangle()

可傳以下參數

cv2.rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)
  • img: 要繪製矩形的目標圖像。
  • pt1: 矩形的左上角頂點。
  • pt2: 矩形的右下角頂點。
  • color: 矩形邊框或填充的顏色。
  • thickness: 矩形邊框的寬度(像素)。值為負數時填充矩形。
  • lineType: 矩形邊框類型(cv2.LINE_8 默認)。

    • cv2.LINE_8(默認值):8-connected 線條(像素完全連接)。
    • cv2.LINE_4:4-connected 線條(像素部分連接)。
    • cv2.LINE_AA:抗鋸齒線條(平滑效果更好)。
  • shift: 座標的小數點精度(用於處理亞像素座標)。默認為 0,表示整數座標。

02.png

import cv2
import numpy as np

# 創建空白圖像
img = np.zeros((400, 400, 3), dtype=np.uint8)

# 繪製不同類型的矩形
cv2.rectangle(img, (50, 50), (150, 150), (255, 0, 0), 10)       # 藍色矩形,邊框寬度 3
cv2.rectangle(img, (200, 50), (300, 150), (0, 255, 0), -1)     # 綠色填充矩形
cv2.rectangle(img, (50, 200), (150, 300), (0, 0, 255), 10, cv2.LINE_AA)  # 紅色抗鋸齒矩形

# 顯示圖像
cv2.imshow('Img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

繪製圓形

繪製圓形的方法叫 cv2.circle()

可傳以下參數

cv2.circle(img, center, radius, color, thickness=None, lineType=None, shift=None)
  • img: 要繪製圓形的目標圖像。
  • center: 圓心座標 (x, y)。
  • radius: 圓半徑(像素)。
  • color: 圓形邊框或填充的顏色。
  • thickness: 圓形邊框的寬度(像素)。值為負數時填充圓形。
  • lineType: 圓形邊框類型(cv2.LINE_8 默認)。

    • cv2.LINE_8(默認值):8-connected 線條(像素完全連接)。
    • cv2.LINE_4:4-connected 線條(像素部分連接)。
    • cv2.LINE_AA:抗鋸齒線條(平滑效果更好)。
  • shift: 座標的小數點精度(用於處理亞像素座標)。默認為 0,表示整數座標。

03.png

import cv2
import numpy as np

# 創建空白圖像
img = np.zeros((400, 400, 3), dtype=np.uint8)
# 繪製不同類型的圓形
cv2.circle(img, (100, 100), 50, (255, 0, 0), 2)        # 藍色圓形,邊框寬度2
cv2.circle(img, (250, 100), 50, (0, 255, 0), -1)       # 綠色填充圓形
cv2.circle(img, (100, 250), 50, (0, 0, 255), 2, cv2.LINE_AA)  # 紅色抗鋸齒圓形

# 顯示圖像
cv2.imshow('Circles', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

繪製橢圓

繪製橢圓的方法叫 cv2.ellipse()

可傳以下參數

cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness=None, lineType=None, shift=None)
  • img: 要繪製橢圓的目標圖像。
  • center: 橢圓中心 (x, y)。
  • axes: 長軸和短軸的半徑 (major, minor)。
  • angle: 橢圓旋轉角度(逆時針)。
  • startAngle: 起始角度(單位:度)。
  • endAngle: 終止角度(單位:度)。
  • color: 橢圓邊框或填充的顏色。
  • thickness: 橢圓邊框的寬度(像素)。值為負數時填充橢圓。
  • lineType: 橢圓邊框類型(cv2.LINE_8 默認)。

    • cv2.LINE_8(默認值):8-connected 線條(像素完全連接)。
    • cv2.LINE_4:4-connected 線條(像素部分連接)。
    • cv2.LINE_AA:抗鋸齒線條(平滑效果更好)。
  • shift: 座標的小數點精度(用於處理亞像素座標)。默認為 0,表示整數座標。

04.png

import cv2
import numpy as np

# 創建空白圖像
img = np.zeros((400, 400, 3), dtype=np.uint8)

# 繪製不同類型的橢圓
cv2.ellipse(img, (100, 100), (80, 40), 0, 0, 360, (255, 0, 0), 2)  # 藍色橢圓,邊框寬度2
cv2.ellipse(img, (250, 100), (40, 80), 45, 0, 360, (0, 255, 0), -1)  # 綠色填充橢圓,旋轉45度
cv2.ellipse(img, (100, 250), (60, 30), 90, 0, 360, (0, 0, 255), 2, cv2.LINE_AA)  # 紅色抗鋸齒橢圓,旋轉90度

# 繪製不閉合的橢圓(只繪製0-180度部分)
cv2.ellipse(img, (250, 250), (70, 35), 135, 0, 180, (255, 255, 0), 2)  # 黃色不閉合橢圓,旋轉135度

# 顯示圖像
cv2.imshow('Ellipses', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

繪製多邊形

繪製一組多邊形線條可以用 cv2.polylines() 方法。

可傳以下參數

cv2.polylines(img, pts, isClosed, color, thickness=None, lineType=None, shift=None)
  • img: 要繪製多邊形的目標圖像。
  • pts: 頂點列表(數組形式,例如 [[(x1, y1), (x2, y2), ...]])。
  • isClosed: 是否閉合多邊形。
  • color: 多邊形邊框顏色。
  • thickness: 線條寬度。
  • lineType: 線條類型。
  • shift: 座標小數點精度。

05.png

import cv2
import numpy as np

# 創建空白圖像
img = np.zeros((400, 400, 3), dtype=np.uint8)

# 創建多邊形頂點座標
triangle = np.array([[100, 100], [50, 200], [150, 200]], np.int32)  # 三角形
pentagon = np.array([[100, 250], [50, 300], [75, 350], [125, 350], [150, 300]], np.int32)  # 五邊形

# 繪製多邊形
cv2.polylines(img, [triangle], True, (255, 0, 0), 2)  # 藍色三角形輪廓
cv2.polylines(img, [pentagon], True, (0, 0, 255), 2, cv2.LINE_AA)  # 紅色抗鋸齒五邊形輪廓

# 創建不閉合多邊形的頂點座標
open_polygon = np.array([[250, 250], [200, 300], [250, 350], [300, 300]], np.int32)  # 四邊形
# 繪製不閉合的多邊形 (isClosed=False)
cv2.polylines(img, [open_polygon], False, (0, 255, 0), 2)  # 綠色不閉合多邊形


# 顯示圖像
cv2.imshow('Polygons', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

繪製填充多邊形

繪製一組多邊形線條可以用 cv2.fillPoly() 方法。

可傳以下參數

cv2.fillPoly(img, pts, color, lineType=None, shift=None, offset=None)
  • img: 要繪製多邊形的目標圖像。
  • pts: 頂點列表(數組形式,例如 [[(x1, y1), (x2, y2), ...]])。
  • color: 填充顏色。
  • lineType: 邊界線條類型。
  • shift: 座標小數點精度。
  • offset: 全局頂點偏移量 (x_offset, y_offset)。

06.png

import cv2
import numpy as np

# 創建空白圖像
img = np.zeros((400, 400, 3), dtype=np.uint8)

# 創建多邊形頂點座標
triangle = np.array([[100, 100], [50, 200], [150, 200]], np.int32)  # 三角形
pentagon = np.array([[100, 250], [50, 300], [75, 350], [125, 350], [150, 300]], np.int32)  # 五邊形

# 繪製填充多邊形
cv2.fillPoly(img, [triangle], (255, 0, 0))  # 藍色填充三角形
cv2.fillPoly(img, [pentagon], (0, 0, 255))  # 紅色填充五邊形

# 顯示圖像
cv2.imshow('Filled Polygons', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

繪製帶箭頭的線

繪製帶箭頭的線可以用 cv2.arrowedLine()

可傳以下參數

cv2.arrowedLine(img, pt1, pt2, color, thickness=None, lineType=None, shift=None, tipLength=None)
  • img: 要繪製圖形的目標圖像。
  • pt1: 箭頭的起點。
  • pt2: 箭頭的終點。
  • color: 箭頭顏色。
  • thickness: 線條寬度。
  • lineType: 線條類型。
  • shift: 座標小數點精度。
  • tipLength: 箭頭尖端長度(0.0 到 1.0 之間)。

07.png

import cv2
import numpy as np

# 創建空白圖像
img = np.zeros((400, 400, 3), dtype=np.uint8)

# 繪製不同類型的箭頭線
cv2.arrowedLine(img, (50, 50), (200, 50), (255, 0, 0), 2)  # 藍色水平箭頭線
cv2.arrowedLine(img, (50, 100), (200, 200), (0, 255, 0), 3)  # 綠色斜向箭頭線
cv2.arrowedLine(img, (50, 250), (50, 350), (0, 0, 255), 2, cv2.LINE_AA, 0, 0.3)  # 紅色垂直抗鋸齒箭頭線,箭頭大小為0.3

# 顯示圖像
cv2.imshow('Arrowed Lines', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

點贊 + 關注 + 收藏 = 學會了

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.