與 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 操作#
灰度轉換#
Edge Detection#
模糊/過濾#
繪製覆蓋層#
結合 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 可實現靈活的處理管線。