與 OpenCV 整合#
為什麼要使用 OpenCV?#
OpenCV 是最廣泛使用的電腦視覺函式庫之一。它提供以下功能:
- 快速影像處理演算法
- 視覺化工具
- 支援特徵偵測、濾鏡與分析
- 與 NumPy 的互通性
由於 pypylon 影像已經是 NumPy 陣列,因此整合過程非常流暢。
基本工作流程#
簡單範例#
import cv2
from pypylon import pylon
with pylon.InstantCamera(pylon.FirstFound) as camera:
camera.StartGrabbingMax(1)
with camera.RetrieveResult(5000) as grab_result:
if grab_result.GrabSucceeded():
image = grab_result.Array
# Display using OpenCV
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Color Format 考量#
OpenCV 期望影像為 BGR 格式,而相機可能會輸出以下格式:
- Mono(單色)
- Bayer
- RGB
將影像轉換為與 OpenCV 相容的格式#
對於即時迴圈,建議優先使用 converter.ConvertToArray(grab_result):這會將轉換後的像素直接寫入預先配置的 NumPy 陣列中,並避免額外複製 converter.Convert(grab_result).Array (請參閱 處理影像 (如需詳細資訊)。
converter = pylon.ImageFormatConverter()
converter.OutputPixelFormat = pylon.PixelType_BGR8packed
image = converter.ConvertToArray(grab_result)
即時顯示迴圈#
import cv2
from pypylon import pylon
with pylon.InstantCamera(pylon.FirstFound) as camera:
camera.StartGrabbing(pylon.GrabStrategy_LatestImageOnly)
while camera.IsGrabbing():
with camera.RetrieveResult(5000) as grab_result:
if grab_result.GrabSucceeded():
image = grab_result.Array
cv2.imshow("Live", image)
if cv2.waitKey(1) == 27: # ESC to exit
break
cv2.destroyAllWindows()
典型的 OpenCV 操作#
灰階轉換#
邊緣偵測#
模糊/濾鏡#
繪製覆疊#
結合 NumPy 與 OpenCV#
此範例展示了結合 pypylon、NumPy 與 OpenCV 的完整機器視覺處理流程。它能持續從相機擷取影像、提取固定的 ROI、計算簡單的統計數據(平均亮度),並直接在即時影像中視覺化結果。
步驟如下:
- 使用 NumPy 切片來定義並提取 ROI。
- 計算 ROI 的平均亮度。
- 使用 OpenCV 的矩形覆蓋圖來視覺化 ROI。
- 在影像上顯示簡單規則式決策(「亮區」)的結果。
此模式代表常見的實際應用工作流程:
import cv2
from pypylon import pylon
import numpy as np
with pylon.InstantCamera(pylon.FirstFound) as camera:
camera.StartGrabbing(pylon.GrabStrategy_LatestImageOnly)
while camera.IsGrabbing():
with camera.RetrieveResult(5000) as grab_result:
if grab_result.GrabSucceeded():
image = grab_result.Array
# Define ROI coordinates
y1, y2 = 100, 200
x1, x2 = 200, 300
# Extract ROI
roi = image[y1:y2, x1:x2]
# Compute statistics
mean = np.mean(roi)
# Draw rectangle around ROI
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
if mean > 100:
cv2.putText(image, "Bright Region", (50, 50),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow("Live", image)
if cv2.waitKey(1) == 27:
break
cv2.destroyAllWindows()
重點整理#
- pypylon 透過 NumPy 與 OpenCV 進行無縫整合。
- 通常需要進行色彩轉換。
- OpenCV 提供了強大的視覺化與處理工具。
- 結合 NumPy 與 OpenCV 可實現具彈性的處理流程。