ケイエルブイは、ハイパースペクトルカメラ・光学部品・光源など世界中の光学機器を取り扱う専門商社です。

03-3258-1238

お問い合わせ
KLV大学 マシンビジョンコース

【Python×OpenCV】
ディスプレイへ画像を出力するコマンドimshowとは

カメラから取得した画像をディスプレイに表示する方法を2つご紹介します。

1画像処理ライブラリOpenCVの”imshow()"コマンドを使用する方法

OpenCVの”read()”コマンドでカメラから取得した画像をリアルタイムに動画としてディスプレイに出力したい場合に簡単に実行が可能。

2グラフ描画ライブラリMatplotlibの”imshow()”コマンドを使用する方法

行列データのプロットを得意としているMatplotlibは、豊富なオプションを使用して1枚の画像情報を色々な形で出力する場合に適しています。

本記事では、それぞれの出力方法について、使い方や注意点を解説していきます。

※出力の前に、カメラからの画像取得が必要です。
カメラからの画像取得に関してはこちらを参照ください。
カメラから画像を取得するコマンド

画像出力コマンドの紹介

1 OpenCVの”imshow()"コマンド

画面への画像の出力は、以下の1行のコマンドで実現が可能です。

cv2.imshow(‘camera', frame)

このコマンドにおける第1引数の’camera’は出力するWindowのタイトル名です。自由に設定してください。
そして、第2引数の’frame’が主力する画像データが格納されている変数名です。
例えばOpenCVのread()コマンドで、以下のようにカメラから画像を取得した場合は、"frame”が画像データの変数名になります。

ret, frame = cap.read()
CV2のimshowのWindow

・複数のWindowを表示する方法

cv2.imshowを異なるWindow名で実行してください。

cv2.imshow('WindowName1', frame1)
cv2.imshow('WindowName2', frame2)

同じWindow名の場合は、前の画像に変えて新しい画像が上書き表示されます。

・表示したWindowを閉じる方法

Windowを閉じるコマンドには、cv2.destroyWindow()とcv2.destroyAllWindow()があります。

1つのWindowを閉じる場合には、cv2.destroyWindowを使用します。
()内に閉じるWindowの名前を挿入してください。

cv2.destroyWindows('WindowName')

全てのWindowを閉じる場合には、cv2.destroyAllWindowsを使用します。
例えば、プログラムの終了前にWindowを全て閉じるために使われます。

cv2.destroyAllWindows()
・サンプルプログラム

ここまでの内容を踏まえて、カメラから取得した画像をリアルタイム表示するサンプルプログラムを紹介します。

import cv2

#カメラの設定 デバイスIDは0
cap = cv2.VideoCapture(0)

#繰り返しのためのwhile文
while True:
    #カメラからの画像取得
    ret, frame = cap.read()

    #カメラの画像の出力
    cv2.imshow('camera' , frame)

    #繰り返し分から抜けるためのif文
    key =cv2.waitKey(10)
    if key == 27:
        break

#メモリを解放して終了するためのコマンド
cap.release()
cv2.destroyAllWindows()



2 Matplotlibの”imshow()"コマンド

Matplotlibの場合は、以下の2行のコマンドで画像を出力します。

matplotlib.pyplot.imshow(frame)
matplotlib.pyplot.show()

1行目の"imshow()"コマンドで出力する画像データの変数やオプションを指定し、2行目の"show()"コマンドでWindowへの出力が行われます。

MatplotlibのimshowのWindow

・Matplotlibライブラリのインストールとインポート

Matplotlibライブラリを使用するには、ライブラリをインストールした上でインポートする必要があります。

まず、インストールは、コマンドプロンプトやターミナル上で以下のコマンドを実行してください。

pip install matplotlib

次にインポートですが、プログラムの冒頭にimportコマンドで、matplotlib.pyplotを指定します。

import matplotlib.pyplot

この時、以下のように設定することにより、ライブラリを使用する際にmatplotlib.pyplot.imshowというコマンドをplt.imshowと省略することが可能になります。

import matplotlib.pyplot as plt

これは、 as 以降に書かれた "plt"がインポートしたライブラリの省略名として認識されるためです。

・MatplotlibはRGBの情報の順番に注意が必要

OpenCVライブラリのread()やimshow()コマンドは、赤(R)、緑(G)、青(B)の情報をBRGの順番で扱います。
一方、Matplotlibでは、RGBの順番で扱うため、OpenCVのread()コマンドで入力した画像を出力する際には、色の順番を変更する必要があります。
BRG からRGBへの変更には、OpenCVのcv2.cvtColorが便利です。Matplotlibのimshow()で画像を表示する前に以下のコマンドを実行してください。

frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

上記コマンドは、frameという変数に格納された画像情報を取得し、RGBの順番を変更したのちにその情報をframeに上書きするという内容です。

・MatplotlibのWindowの便利機能

・表示箇所の移動、画像の拡大・縮小
MatplotlibのimshowのWindow

上下の十字ボタンでは、マウス操作での表示画像の移動が、虫眼鏡ボタンでは、マウス操作で画像の拡大(左クリック)・縮小(右クリック)が可能です。
また、スライドバーボタンでConfiguretion toolを開くと、スライドバーでグラフの表示位置を変更できます。


・画像の保存
MatplotlibのimshowのWindow

画像の保存ボタンでは、表示している画像をjpegやpngなどの形式で保存することが可能です。


・画像の情報表示
MatplotlibのimshowのWindow

表示されている画像にマウスカーソルを合わせると、右下に座標とその座標のRGBのそれぞれの値が表示されます。

・OpenCVと同じようにWindowの名前を変更するには

OpenCVの場合は、imshow()の第1引数がWindowの名前でしたが、Matplotlibの場合は、imshow()でWindowの名前を設定することはできません。
Windowの名前を変更するには、あらかじめ、plt.figure()で設定する必要があります

fig = plt.figure("WindowName")

・Matplotlibにおけるimshow()のオプションについて

Matplotlibのimshowは第2引数以降にオプションを指定することで、様々なことが可能です。
例えば、cmap=”gray”とaspect=2のオプションを指定する場合には、以下のように記述してください。

plt.imshow(frame, cmap=”gray”, aspect=2)

オプションの種類と内容に関して、Matplotlibの公式ページに書かれている内容を一覧にまとめて紹介します。

オプション 内容
cmap 登録済みのカラーマップを使用することでグレースケール化などができます。
例えば、camp=”gray”と指定すると、画像をグレースケール化して表示します。
norm データの値を”0〜1”の値にノーマライズした上で表示(マッピング)できます。
(データが RGB,RGBAの場合は無視されます。)
aspect 画像のアスペクト比を変更することができます。
例えば、aspect=2を指定すると画像が縦長になり、aspect=0.5を指定すると横長になります。
interpolation データの補間方法を選択することができます。
データを補完すると、表示ピクセル間の変化が滑らかになりフィルターがかかった感じになります。
interpolationのオプションの内容や使用時のイメージは以下を参照ください。
公式のinterpolationに関するページ
alpha 画像を透明化することができます。
例えば、alpha=0.5を設定すると画像全体を半透明になって表示されます。
vmin, vmax カラーマップがカバーする値の最大値、最小値の設定を変更できます。
デフォルトでは、画像データ内の最大値、最小値をカバーするように設定されます。
(データが RGB,RGBAの場合は無視されます。)
origin 上下を反転させることができます。
デフォルトは’upper’で、’lower’を選択すると、画像の上が反転します。
extent 画像を配置する座標(left, right, bottom, top)を固定することができます。
例えば、extent=(2.0, 1.0, -2.0, -1.0)と記載するとその座標内に画像がおさまります。この座標によってアスペクト比も決まります。
公式のinterpolationに関するページ
filternorm アンチグレイン画像リサイズフィルタのパラメータを変更できます。
filterrad 補間において、半径パラメータが必要な手法(’sinc’, ‘lanczos’, ‘blackman’) で使用されるフィルターの半径を変更できます。
resample リサンプルを行うかの選択ができます。
Trueを指定した場合はリサンプルを実施、False を指定した場合は、入力画像より出力画像の方が大きい場合にのみリサンプルを実施します。
・サンプルプログラム

ここまでの内容を踏まえて、カメラから取得した画像を出力するサンプルプログラムを紹介します。

import cv2
import matplotlib.pyplot as plt

#カメラの設定 デバイスIDは0
cap = cv2.VideoCapture(0)

#カメラからの画像取得
ret, frame = cap.read()

#取得した画像をBGRからRGBに変換
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

#カメラの画像の出力
plt.imshow(frame)
plt.show()

cv2.waitKey()

#メモリを解放して終了するためのコマンド
cap.release()
cv2.destroyAllWindows()

この時、plt.imshow(frame)にオプションを付加することで、様々な表示が可能です。



まとめ

カメラで取得した画像をリアルタイムに動画として出力するコマンドとしてOpenCVのimshow()コマンドを、
カメラで取得した画像を1枚の画像として出力する際に様々なオプションが選択できるMatplotlibのimshow()を
ご紹介しました。

プログラムの内容に応じて使い分けていただければと思います。

用語集

マシンビジョンコース

ご質問・ご相談お気軽にお問い合せください

お電話でのお問合せ 03-3258-1238 受付時間 平日9:00-18:00(土日祝日除く)
Webでのお問い合わせ