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

與 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格式,而相機可能會輸出以下格式:

  • 單色(灰階)
  • 拜耳
  • 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. ROI 是透過 OpenCV 的矩形疊加層來視覺化的。
  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 可實現靈活的處理流程。