OpenCV 画像処理 & 表示(GbE-2 / Python)
This content is not available in your language yet.
HelloWorld で作成した共通モジュール puclib.py を使用して、GbE-2 から取得した 1 フレームの画像データに対して OpenCV (cv2) でフィルタリング処理(ノイズ除去・エッジ検出)を行い、画面表示および結果の保存を行うプログラムの作成手順です。
-
スクリプトの作成
puclib.pyと同じフォルダーにgbe2_opencv_single_process.pyを作成し、以下のコードを記述します。gbe2_opencv_single_process.py from ctypes import c_uint32, c_ushort, c_ubyte, c_void_p, byrefimport numpy as npimport cv2# 共通モジュール puclib.py から読み込みfrom puclib import (load_sdk, PUC_SUCCEEDED, PUC_DETECT_TARGET_HAWK,PUC_Q_COUNT, PUC_DETECT_FILTER, PUC_DETECT_INFO, PUC_XFER_DATA_INFO)def main():print("INFINICAM GbE-2 OpenCV 画像処理サンプル開始...")# 1. SDKのロードと初期化puclib = load_sdk()if puclib.PUC_Initialize() != PUC_SUCCEEDED:print("エラー: SDKの初期化に失敗しました。")return# 2. デバイスの検索とオープンdetect_filter = PUC_DETECT_FILTER(nDeviceTypeFlags=PUC_DETECT_TARGET_HAWK)detect_info = PUC_DETECT_INFO()if puclib.PUC_DetectDevice2(byref(detect_filter), byref(detect_info)) != PUC_SUCCEEDED or detect_info.nDeviceCount == 0:print("エラー: GbE-2 カメラが見つかりませんでした。")returnh_device = c_void_p()if puclib.PUC_OpenDevice2(0, byref(h_device)) != PUC_SUCCEEDED:print("エラー: デバイスのオープンに失敗しました。")return# 3. 解像度・量子化テーブル・転送サイズの取得width, height = c_uint32(), c_uint32()puclib.PUC_GetResolution(h_device, byref(width), byref(height))w, h = width.value, height.valueq_vals = (c_ushort * PUC_Q_COUNT)()puclib.PUC_GetQuantization2(h_device, q_vals)xfer_data_size = c_uint32()puclib.PUC_GetXferDataSize(h_device, byref(xfer_data_size))print(f"解像度: {w} x {h} ピクセル")# 4. バッファの確保comp_buffer = (c_ubyte * xfer_data_size.value)()line_bytes = (w + 3) & ~3 # 4バイト境界アラインメントdecoded_buffer = (c_ubyte * (line_bytes * h))()# 5. 1フレームデータのキャプチャxfer_info = PUC_XFER_DATA_INFO()xfer_info.pData = comp_bufferxfer_info.nDataSize = xfer_data_size.valueprint("1フレーム撮影中...")if puclib.PUC_GetSingleXferData(h_device, byref(xfer_info)) == PUC_SUCCEEDED:# 6. 復号処理ret = puclib.PUC_DecodeData(decoded_buffer, 0, 0, w, h, line_bytes, comp_buffer, q_vals)if ret == PUC_SUCCEEDED:# 7. NumPy 配列に変換 (2次元モノクロ画像)img_raw = np.ctypeslib.as_array(decoded_buffer).reshape((h, line_bytes))[:, :w]# 8. OpenCV 画像処理# ガウシアンフィルタによるノイズ低減img_blur = cv2.GaussianBlur(img_raw, (5, 5), 0)# Canny アルゴリズムによるエッジ検出img_edges = cv2.Canny(img_blur, 50, 150)# 原本画像とエッジ結果画像を左右に連結img_combined = np.hstack((img_raw, img_edges))# 9. エッジ検出結果の保存filename = "opencv_edges_result.png"cv2.imwrite(filename, img_edges)print(f"SUCCESS: エッジ抽出結果を保存しました ({filename})")# 10. OpenCV ウィンドウでの表示(任意のキー入力で終了)window_name = "Original Image (Left) vs Canny Edges (Right)"cv2.imshow(window_name, img_combined)print("画像表示中... 何らかのキーを押すと終了します。")cv2.waitKey(0)cv2.destroyAllWindows()else:print(f"エラー: 画像データの復号に失敗しました。ErrorCode: {ret}")else:print("エラー: 画像データの取得に失敗しました。")# 11. クローズpuclib.PUC_CloseDevice(h_device)if __name__ == "__main__":main() -
スクリプトの実行
Terminal window python gbe2_opencv_single_process.py実行すると OpenCV の表示ウィンドウが立ち上がり、左側に原画像、右側に Canny アルゴリズムで抽出したエッジ画像が並べて表示されます。キーボードのキーを押すとウィンドウが閉じ、カレントディレクトリに
opencv_edges_result.pngが保存されます。
OpenCV 画像処理のポイント
Section titled “OpenCV 画像処理のポイント”1. ノイズ除去(cv2.GaussianBlur)
Section titled “1. ノイズ除去(cv2.GaussianBlur)”エッジ検出などの前に平滑化フィルタを適用することで、高感度撮影時の細かなセンサノイズによる誤検出を抑え、安定した輪郭描画が可能になります。
img_blur = cv2.GaussianBlur(img_raw, (5, 5), 0)2. Canny エッジ検出(cv2.Canny)
Section titled “2. Canny エッジ検出(cv2.Canny)”2つの閾値(threshold1, threshold2)を指定して、輝度変化の激しい境界線(輪郭)のみを抽出します。
img_edges = cv2.Canny(img_blur, 50, 150)3. 画像の並列結合(np.hstack)
Section titled “3. 画像の並列結合(np.hstack)”幅・高さ・チャンネル数が同一の NumPy 配列であれば、np.hstack(水平結合)や np.vstack(垂直結合)を用いて複数の処理過程結果を 1 つの表示ウィンドウにまとめて描画できます。
