今後作成するプログラムのためのシンプルなjpgビューワーを作った。
以下にコードと詳しい説明を書いた。
import sys import cv2 def main(): if len(sys.argv) < 2: print("Usage: python viewer.py <image.jpg>") sys.exit(1) img_path = sys.argv[1] img = cv2.imread(img_path) if img is None: print(f"Failed to open image: {img_path}") sys.exit(1) cv2.imshow("Image Viewer", img) while True: key = cv2.waitKey(0) & 0xFF if key == ord('q'): break cv2.destroyAllWindows() if __name__ == "__main__": main()
使い方としては上のプログラムをviewer.pyで保存したとしたら
promptやterminalで
python viewer.py image.jpg
として開きたいjpgファイル(上ではimage.jpg)を書いて起動すればよい。
キーボードでqを入力すると終了。
以下は動作に関するメモ。
一行目の
import sys
標準ライブラリのsysのインポート
コマンドライン引数(実行時に入力されたファイル名など)を扱うために必要。
次の
import cv2
はOpenCVのインポート。画像に関するライブラリ。
次は画像表示にあたり、正しく画像が指定されているかを判定する部分になる。
if len(sys.argv) < 2:
len()関数は文字列の長さを返す関数。
引数のsys.argvはsysライブラリの中のargparse(アーグパース)モジュール。
sys.argvには実行時に渡された引数をリストを持っている。
つまり、len(sys.argv)はコマンドライン引数の数を調べています。
今回はviewer.pyとimage.jpgというプログラムと画像名の二つの引数があるはず。
なので2以下であった場合は正しく入力されていないのでエラーを返して終了する
エラー終了する部分はその後の
print("Usage: python viewer.py <image.jpg>") sys.exit(1)
の部分が該当していて引数を二つ入れろというメッセージと
sys.exit(1)の1 は異常終了を示す終了コード。
上のチェックを通り抜けたら今度は指定された画像ファイルを開くための準備に入る。
img_path = sys.argv[1]
sys.argv[1] が引数の二つ目である画像名である。
これをimag_pathという変数に格納。
img = cv2.imread(img_path)
OpenCV の関数 cv2.imread() で画像ファイルを読み込む。
cv2.imread()は画像ファイルを読み込む関数。読み込まれるとNumpy配列として読み込まれる。
読み込まれた配列をimgという配列に格納。
成功すれば画像データ(NumPy 配列)が返り、失敗すれば None 。
なので次に
if img is None:
の部分で読み込みに失敗したかどうかをチェック。
None の場合はファイルが存在しない、壊れている、読み込めない形式という場合。
その場合は
print(f"Failed to open image: {img_path}") sys.exit(1)
エラーメッセージとともに終了。
以上のチェックを無事に通れば画像を表示。
cv2.imshow("Image Viewer", img)
読み込んだ画像を ウィンドウに表示。
"Image Viewer" はウィンドウのタイトル。適当でいい。
imgはcv2.imread()で読み込んだ画像情報の配列。cv2.imshow()では二つ目に表示データを入れる。
while True: key = cv2.waitKey(0) & 0xFF if key == ord('q'): break
キーボードでqが押されるまで無限ループ。
cv2.waitKey()はOpenCVでキー入力を待つための関数。
引数は数字でms(ミリ秒)を意味する。
0を引数にとる場合はキーボードが押されるまで待つという意味になる。
cv2.destroyAllWindows()
OpenCVのウィンドウを閉じる。
if __name__ == "__main__":
Python ファイルが「スクリプトとして直接実行された場合」にだけ、この下の処理を実行するというお決まりの書き方。
他のファイルからインポートされた場合には実行されない。
main()
main関数を実行。