コンテンツにスキップ
ステージングサーバー
開発サーバー

OpenCVとの統合#

このトピックでは、可視化と画像処理のためにpypylonによる画像取得をOpenCVと統合する方法について説明します。

OpenCVを使用する理由#

OpenCVは、最も広く使用されているコンピュータビジョンライブラリの1つです。次のような機能を提供します。

  • 高速な画像処理アルゴリズム
  • 可視化ツール
  • 特徴検出、フィルタリング、および解析のサポート
  • 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)

エッジ検出#

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を組み合わせることで、柔軟なパイプラインが可能になります。