跳至內容
測試伺服器
開發伺服器

與 OpenCV 整合#

本主題說明如何將 pypylon 影像擷取與 OpenCV 整合,以進行視覺化和影像處理。

為什麼使用 OpenCV?#

OpenCV 是最廣泛使用的電腦視覺函式庫之一。它提供下列功能:

  • 快速的影像處理演算法
  • 視覺化工具
  • 支援特徵偵測、濾波與分析
  • 與 NumPy 的互通性

由於 pypylon 影像本身就是 NumPy 陣列,因此整合過程非常流暢。

基本工作流程#

Camera → pypylon → NumPy Array → OpenCV → Display/Processing

簡單範例#

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 操作#

灰度轉換#

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

Edge Detection#

edges = cv2.Canny(image, 50, 150)

模糊/過濾#

blur = cv2.GaussianBlur(image, (5, 5), 0)

繪製覆蓋層#

cv2.rectangle(image, (50, 50), (200, 200), (0, 255, 0), 2)

結合 NumPy 與 OpenCV#

此範例展示了一個結合 pypylon、NumPy 和 OpenCV 的完整視覺處理管線。它從相機連續擷取影像、擷取固定的興趣區 (ROI)、計算簡單的統計數據(平均強度),並直接在即時影像中視覺化結果。

步驟如下:

  1. 使用 NumPy 切片定義並擷取 ROI。
  2. 計算 ROI 的平均強度。
  3. 使用 OpenCV 矩形覆蓋層將 ROI 視覺化。
  4. 簡單規則式決策(「亮度區域」)的結果會顯示在影像上。

此模式代表常見的實際工作流程:

Acquire → Select ROI → Compute Feature → Visualize → Decide
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 可實現靈活的處理管線。