OpenCVで動画表示; グレイスケール & 2値化映像を表示する

引き続きOpenCVの練習。

先週までに、画像を取得して変換・表示してみた。

・普通の画像 ・グレイスケール( Gray-Scale )に変換した画像 ・2値化( binary )した画像

3種類とも、表示できる。 そりゃそうだ。

画像オブジェクトに対して操作した結果を、別の画像オブジェクトに格納する。 わかりやすくて助かる。

今回は、画像ではなくwebカメラで動画表示。 カメラが捉えている映像を、画面上に表示する。

サンプルコードを見ると、なんと「画像を撮影する」を無限ループしている!

【 Python OpenCV 】カメラで撮影した動画を、リアルタイムで表示させる – Windows, Mac, Linux 対応 –|Zero-Cheese

そんなんでいいのか、、 当たり前と言えば当たり前か、、 「ぱらぱらマンガ」だもんな。

つまり、こんなコード。

while(cam.isOpened()):
    ret, frame = cam.read()
    cv2.imshow('cam', frame)

わかりやすいが、「こんなんでいいのか?」となる。 それは、カメラ、映像の扱いが直観的なレベルでわかっていない証拠。

まぁ、練習だ。数をこなそう。

当然、「普通の画像」による動画表示は成功したので、 実験としては、「組み合わせ」に挑戦。

・グレイスケールによる動画表示 ・バイナリ(2値化)による動画表示

もちろん成功するわけだが、このステップを踏むのが大事。 「Aができた」「Bができた」ならば、 「AしてBもできる?」と、 自分で考えて、試してみる(そして成功する)。

「成功するはず」「成功するに決まってる」くらいの内容が 精神的にちょうど良い。

負担が少なく、面白がって、余裕を持って取り組めるからだ。

学ぶには(=身につけるには = 変わっていくには)この「余裕」を作るのがコツ。

import cv2

cam = cv2.VideoCapture(1)            # デスクトップPC & USBカメラは、(1)で使えた

while(cam.isOpened()):            # カメラが使える限り、ループ
    ret, frame = cam.read()            # 画像を取得する
    frame_gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)            # グレイスケールに変換する
    ret, frame_binary = cv2.threshold(frame_gray, 177, 255, cv2.THRESH_BINARY)            # 2値化する
    cv2.imshow('cam', frame_binary)            # 画像を表示する; ループするから動画になる; ぱらぱらマンガ

    if cv2.waitKey(1) & 0xFF == ord('q'):            # キー入力を16進数にして、'q'と等しければ( = 'q'と入力されたら)ループ終了
        break

cam.release()
cv2.destroyAllWindows()

2値化した動画. 1回くらいは許せる.

というわけで、とりあえず、長寿と繁栄を。