與 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格式,而相機可能會輸出以下格式:
- 單色(灰階)
- 拜耳
- 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)的平均強度。
- ROI 是透過 OpenCV 的矩形疊加層來視覺化的。
- 基於簡單規則的決策結果(「亮區」)會顯示在影像上。
此模式呈現了一種常見的現實世界工作流程:
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 可實現靈活的處理流程。