IC Imaging Control (Python)

  • サンプルプログラムトップページ
  • デバイスのオープンとハンドリング
    • デバイスを開く
    • ダイアログボックスを使用してデバイスを開く
    • デバイスプロパティ設定の保存と復元
    • プロパティの設定方法
    • 接続しているカメラ一覧を表示
    • ROIの設定方法
    • オートフォーカスで焦点を調整する範囲を指定
    • デバイスロストの検出と再接続方法
  • イメージの取得
    • 8bit静止画保存
    • 16bit静止画保存
    • Enterキーを押下したときに画像保存
    • メモリーレコーディング
    • AVIファイル保存
  • 画像処理
    • コールバック関数の設定方法(OpenCVで二値化)
    • OpenCVで画像処理して表示する方法
    • ソフトウェアトリガー・外部トリガーの使用方法
    • ステレオカメラで表示
    • 2つのカメラで取得した画像の輝度値を平均してバーに表示する
  • IC Imaging Control3.5(pythonnet編)
    • Qtを使ったデモアプリ(pythonnet編)
    • カメラで取得した画像の輝度値を平均してバーに表示する
      (pythonnet編)
    • 動画保存(MediaStreamSink コーデック:H.264)
    • 露光時間・ゲインを設定し、静止画保存をする(pythonnet編)
  • リンク集

    ICImagingControl WEB APIリファレンスマニュアル/サンプルプログラム

    :日本語対応済み :日本語化準備中
    開発言語 APIリファレンスマニュアル サンプルプログラム
    C 4.0
    ()
    - - 4.0
    ()
    - -
    C++ 4.0
    ()
    3.5
    ()
    3.4
    ()
    4.0
    ()
    3.5 3.4
    ()
    C#/VB.NET 4.0
    ()
    3.5
    ()
    3.4
    ()
    4.0
    ()
    3.5
    ()
    3.4
    ()
    Python 4.0
    ()
    3.5 3.4
    ()
    4.0
    ()
    3.5 3.4
    ()

OpenCVで画像処理して表示する方法

概要

取得した画像の収縮処理を実装方法について解説します。キーボード押下する度に画像を取得し、画像処理を実施しています。フレームを取得する度に自動で画像処理をしたい場合には【コールバック関数の設定方法(OpenCVで二値化)】をご覧ください。

サンプルプログラム

サンプル(Python) image_processing_OpenCV_python.zip

サンプルツールの出力

コード全体

import ctypes 
import tisgrabber as tis
import cv2
import numpy as np

#tisgrabber_x64.dllをインポートする
ic = ctypes.cdll.LoadLibrary("./tisgrabber_x64.dll")
tis.declareFunctions(ic)

#ICImagingControlクラスライブラリを初期化します。
#この関数は、このライブラリの他の関数が呼び出される前に1回だけ呼び出す必要があります。
ic.IC_InitLibrary(0)

#ダイアログ画面を表示
hGrabber = tis.openDevice(ic)

#デバイスが有効か確認
if(ic.IC_IsDevValid(hGrabber)):
    #ライブスタート開始 引数:0の時非表示、引数:1の時表示
    #ライブ画面は非表示にしています。
    ic.IC_StartLive(hGrabber, 0)
    key = ""
    while key != "q":
        print("pキー: 画像処理を実行")
        print("qキー: プログラムを終了")
        key = input('pキーかqキーを押下してください。:')
        if key == "p":
            if ic.IC_SnapImage(hGrabber, 2000) == tis.IC_SUCCESS:
                # 画像記述の変数を宣言する
                Width = ctypes.c_long()
                Height = ctypes.c_long()
                BitsPerPixel = ctypes.c_int()
                colorformat = ctypes.c_int()

                # 画像の説明の値を取得する
                ic.IC_GetImageDescription(hGrabber, Width, Height,
                                          BitsPerPixel, colorformat)

                # バッファサイズを計算
                bpp = int(BitsPerPixel.value / 8.0)
                buffer_size = Width.value * Height.value * bpp


                # イメージデータを取得する
                imagePtr = ic.IC_GetImagePtr(hGrabber)

                imagedata = ctypes.cast(imagePtr,
                                        ctypes.POINTER(ctypes.c_ubyte *
                                                       buffer_size))

                # numpyの配列を作成する
                image = np.ndarray(buffer=imagedata.contents,
                                   dtype=np.uint8,
                                   shape=(Height.value,
                                          Width.value,
                                          bpp))

                # 画像にOpenCV関数を適用
                image = cv2.flip(image, 0)
                image = cv2.erode(image, np.ones((11, 11)))

                #表示を縮小
                resized_img = cv2.resize(image,(640, 480)) 
                cv2.imshow('Window', resized_img)
                cv2.waitKey(10)
            else:
                print("2秒間フレームが送られてきませんでした。")

    ic.IC_StopLive(hGrabber)

    cv2.destroyWindow('Window')

else:
    ic.IC_MsgBox(tis.T("No device opened"), tis.T("Simple Live Video"))

ic.IC_ReleaseGrabber(hGrabber)

解説

#ライブスタート開始 引数:0の時非表示、引数:1の時表示
#ライブ画面は非表示にしています。
ic.IC_StartLive(hGrabber, 0)
key = ""
while key != "q":
    print("pキー: 画像処理を実行")
    print("qキー: プログラムを終了")
    key = input('pキーかqキーを押下してください。:')
    if key == "p":
        if ic.IC_SnapImage(hGrabber, 2000) == tis.IC_SUCCESS:

IC_StartLiveメソッドでカメラからのフレーム送信を開始します。while文のループの中で絶えずフレームを監視するようにしますが、フレームをバッファメモリ内に格納する際にはIC_SnapImage(グラバーポインタ,待機する時間(ミリ秒))メソッドを使用します。IC_SnapImageメソッドの引数に待機する時間(ミリ秒)を引き渡すことで、その間カメラから送られてくるフレームを待ち取得する度毎に次のロジックに進みます。なお、待機する時間(ミリ秒)を短くすればするほどフレーム受信を待機する時間を短くなりますが、必ずしも処理時間が早くなるわけではないのでご注意ください。

SnapImageメソッドによって、ライブ画像ストリームより静止画をキャプチャしリングバッファに保存が成功した後、OpenCVで画像を処理するために型をuint8に変更します。uint8に変更するためには画像のnumpyライブラリのndarrayを使用する必要がありますので下記の手順に沿ってコーディングしてください。

  • 取得した画像の解像度・ピクセルごとの使用するビット数、カラーフォーマットを取得
    • IC_GetImageDescription(hGrabber, Width, Height, BitsPerPixel,colorformat)
  • バッファサイズの計算
    • bpp = int(BitsPerPixel.value / 8.0)
    • buffer_size = Width.value * Height.value * bpp
  • イメージデータを取得
    • imagePtr = ic.IC_GetImagePtr(hGrabber)
    • imagedata = ctypes.cast(imagePtr, ctypes.POINTER(ctypes.c_ubyte * buffer_size))
  • NumPy配列で表されたカラー画像にする
    • np.ndarray(buffer=imagedata.contents, dtype=np.uint8, shape=(Height.value, Width.value, bpp))

取得したNumPy配列で表された画像をもとにOpenCVの関数で二値化をしています。

# 画像にOpenCV関数を適用
image = cv2.flip(image, 0)
image = cv2.erode(image, np.ones((11, 11)))

#表示を縮小
resized_img = cv2.resize(image,(640, 480)) 
cv2.imshow('Window', resized_img)
cv2.waitKey(10)

この一連の処理はqキーを押下する度に実行されます。上記の例では二値化のみですが、リアルタイムに画像処理したり、バーコードのデコードやOCRするにもご利用いただけます。

▲ このページの先頭に戻る

Copyright © ARGO Corporation. All Rights Reserved.