ラズパイでOpenCVを使って映像をモニタに表示しよう
webカメラからの映像を
モニタに映してみます。
webカメラの映像を取り込むには
『OpenCV』画像処理ライブラリを
使います。
ライブラリはオープンソースで
公開されており
自由に使う事ができます。
OpenCVとは
OpenCVは、画像処理、画像解析機能
を簡単に使うことができる
オープンソースのライブラリです。
例えば、顔認識、文字認識、
物体の検出など
簡単に使うことができ
プログラミングが簡単になります。
OpenCVは商用利用であっても
無料で利用できます。
オープンソースソフトウェアは、
Open Source Softwareの
頭文字を取ってOSSと略されます。
作成者がソースコードを無償で公開
使用者が自由に使用でき
許可されているソフトウェアのこと
画像処理ライブラリ『OpenCV』を使い
webカメラの映像を取り込み
保存をしていきます。
『OpenCV』をインストールする
OpenCVは、コマンドラインから
インストールを行います。
インターネットに接続された状態で
行ってください。
左上のタスクバーにある黒い四角
これは『コマンドライン端末』
といいます。
コマンドライン端末アイコンを
クリックします。
コマンドライン端末が表示されます。
コマンドライン端末に
①次のコマンドを入力します。
pip3 install opencv-python
②『エンターキー』を押すと
インストールが開始されます。
次の画面が表示されたら
インストール成功です。
これで、
OpenCVをつかう準備ができました。
『OpenCV』を使ってwebカメラ映像をモニタに表示する
コマンドライン端末で
OpenCVをインストールした後
プログラムに組み込んで使います。
『Thonny』エディタを起動します。
以下のPythonコードを書きます。
import cv2
『import cv2』とコードを書くことで
OpenCVがインポートされ
『OpenCV』のコマンドが
使えるようになります。
実行してエラーがでなければ正常に
OpenCVを使うことができます。
ここでエラーが出た場合
インストールが正常に
行われていないため
再度、インストールを行います
webカメラ映像をモニタ画面に表示しよう
OpenCVをインストールが終わりましたので
ここからは、webカメラから映像を取得する
プログラミングを始めていきます。
webカメラ映像表示プログラム
webカメラ映像をモニタに
示するプログラムを作成しました。
import cv2
#VideoCaptureオブジェクト取得
cap = cv2.VideoCapture(0)
while(True):
#フレームを取得
ret, frame = cap.read()
if not ret:
print("not capture")
break
#画面サイズを指定
print(frame.shape)
frame = cv2.resize(frame, (640, 480))
#取得したフレームをモニタウインドウに表示
cv2.imshow("frame", frame)
#キーボード入力処理
key = cv2.waitKey(1)
if key == 13: #enter key を押すと終了
break
#終了処理
cap.release() #カメラデバイスクローズ
cv2.destroyAllWindows() #ウィンドウクローズ
webカメラ映像がモニタに
表示されています。
簡単なプログラムでwebカメラからの
映像をモニタ画面に表示することが
できます。
サンプルプログラムを
解説していきます。
カメラから画像取得
プログラムの先頭から
解説をしていきます。
#VideoCaptureオブジェクト取得
cap = cv2.VideoCapture(0)
ここでは、
USB接続したwebカメラから
画像取得をしています。
カメラのオブジェクト名:cap
カメラを1台接続しているので
カメラのデバイスIDは『0』
になります。
cap = cv2.VideoCapture(0)
このプログラム(コード)で
webカメラから画像取得しています。
2台のwebカメラを接続する場合
cap1 = cv2.VideoCapture(0)
cap2 = cv2.VideoCapture(1)
IDを指定します
繰り返し処理:while文
while文は、繰り返し処理を行う時に
使用します。
ここでは、映像を繰り返し
映像取得したいため
while文を使い、
繰り返し処理を行っています。
while(True):
while 文は条件式()の中が真の間、
ブロック内の処理を繰り返します。
サンプルプログラムでは、
while 文は、
step:6~24
を繰り返し処理を行います。
webカメラから画像を取り込んでいるかチェック
cap.read()関数をつかい
webカメラから画像を取得します。
ret, frame = cap.read()
”ret”にwebカメラからの画像が
格納されます。
考え方は、
print(ret)
>True
Trueとなれば、
画像が格納されています。
webカメラから画像が
取得されていない場合
>False
が返されます。
True
正しい(画像が格納されている)
False
正しくない(画像が格納されていない)
ここでの処理は、
正常にwebカメラから
画像が取得されない場合
終了する処理をしています。
この処理の目的は、
Webカメラをつなげていない場合
ラズパイがWebカメラを
認識していない場合
プログラムを終了します。
画像サイズを指定してモニタに表示する
画像サイズの最大の大きさは
webカメラの性能で決まります。
今回使用しているwebカメラ
メーカー:ロジクール
型式:C270
解像度:720p/30fps
を使用しています。
解像度720Pは
画像サイズを表しています。
最大の画面サイズ
720P:1280☓720
になります。
30fs はフレームレートを表しています。
1秒間に最大30枚表示できます。
1秒間に何枚画像を表示できるか
パラパラ漫画を想像してみてください
1秒間に30枚表示されるのと
1秒間に1枚表示されるのとでは
表示される滑らかさが違います。
防犯カメラであれば、
保存する時間を長くしたいため
MicroSDカードの容量は
限られているため
フレーム数を少なくして
撮影時間を長くすることを考えます。
画像サイズ、フレームレートを
大きくすると
保存する容量も大きくなります
解像度と保存容量の関係は
こちらを参考にしてみてください
720P | 1080P | 2K | 4K | |
解像度 | 1280*720 | 1920*1080 | 2560*1440 | 4096*2160 |
画質 | HD画質 | フルHD | WQHD(2K) | 4K(UHD) |
アスペクト比 | 16:09 | 16:09 | 16:09 | 16:9(17:9) |
サイズ | 1GB:約90分 | 10GB:約90分 | 15GB:約90分 | 50GB:約90分間 |
※FPS60の場合
画像サイズを小さくして表示しています。
今回の画像サイズは、
640☓480
と指定します。
#画面サイズを指定
print(frame.shape)
frame = cv2.resize(frame, (640, 480))
次に取得した画像を
モニタに表示するプログラムです。
#取得した画像をモニタ表示
cv2.imshow(“frame”, frame)
cv2.imshow関数を使います。
read() コマンドでwebカメラから
取得した画像をリアルタイムに
モニタ画面に表示しています。
これまでが画面に表示されるまでの
プログラムの流れです。
プログラムの終了処理
最後にプログラムの終了処理を
しています。
while文で繰り返し処理を
行っていますので
プログラムは永久に繰り返す
永久ループになっています。
キーボードの”ENTER”キーを押したら
プログラムを終了するように
しています。
cv2.waitKeyは、
画像を表示するウィンドウから
キーボード入力を待ち受ける関数を
意味しています。
#キーボード入力処理
key = cv2.waitKey(1)
キーボードを押したコードが
”key” に代入されます。
次にどのキーボードが押されたかを
判別します。
アスキーコード表から探します。
エンター(CR):10進→13
”13”がENTERキーになります。
if key == 13
break
これで、キーボードからENTERキーが
押されたら
break
でループを抜け出し
終了するようにしています。
break 文を実行すると、ループを抜け出します
まとめ
サンプルプログラムは、
OpenCVを使い映像をモニタ表示する
プログラムを簡単に書いています。
OpenCVを使うことで
簡単な関数を使い映像処理ができます。
いかがでしたでしょうか
難しかったところもあると思いますが
プログラミングは
挫折することも多いです
ゆっくりと続けていきましょう。
アスキーコード表
10進 | 16進 | ASCII | 10進 | 16進 | ASCII | 10進 | 16進 | ASCII | 10進 | 16進 | ASCII |
0 | 0 | NULL | 32 | 20 | SP | 64 | 40 | @ | 96 | 60 | ` |
1 | 1 | SOH | 33 | 21 | ! | 65 | 41 | A | 97 | 61 | a |
2 | 2 | STX | 34 | 22 | “ | 66 | 42 | B | 98 | 62 | b |
3 | 3 | ETX | 35 | 23 | # | 67 | 43 | C | 99 | 63 | c |
4 | 4 | EOT | 36 | 24 | $ | 68 | 44 | D | 100 | 64 | d |
5 | 5 | ENG | 37 | 25 | % | 69 | 45 | E | 101 | 65 | e |
6 | 6 | ACK | 38 | 26 | & | 70 | 46 | F | 102 | 66 | f |
7 | 7 | BEL | 39 | 27 | ‘ | 71 | 47 | G | 103 | 67 | g |
8 | 8 | BS | 40 | 28 | ( | 72 | 48 | H | 104 | 68 | h |
9 | 9 | HT | 41 | 29 | ) | 73 | 49 | I | 105 | 69 | i |
10 | A | LF | 42 | 2A | * | 74 | 4A | J | 106 | 6A | j |
11 | B | VT | 43 | 2B | + | 75 | 4B | K | 107 | 6B | k |
12 | C | FF | 44 | 2C | , | 76 | 4C | L | 108 | 6C | l |
13 | D | CR | 45 | 2D | – | 77 | 4D | M | 109 | 6D | m |
14 | E | SO | 46 | 2E | . | 78 | 4E | N | 110 | 6E | n |
15 | F | SI | 47 | 2F | / | 79 | 4F | O | 111 | 6F | o |
16 | 10 | DLE | 48 | 30 | 0 | 80 | 50 | P | 112 | 70 | p |
17 | 11 | DC1 | 49 | 31 | 1 | 81 | 51 | Q | 113 | 71 | q |
18 | 12 | DC2 | 50 | 32 | 2 | 82 | 52 | R | 114 | 72 | r |
19 | 13 | DC3 | 51 | 33 | 3 | 83 | 53 | S | 115 | 73 | s |
20 | 14 | DC4 | 52 | 34 | 4 | 84 | 54 | T | 116 | 74 | t |
21 | 15 | NAK | 53 | 35 | 5 | 85 | 55 | U | 117 | 75 | u |
22 | 16 | SYN | 54 | 36 | 6 | 86 | 56 | V | 118 | 76 | v |
23 | 17 | ETB | 55 | 37 | 7 | 87 | 57 | W | 119 | 77 | w |
24 | 18 | CAN | 56 | 38 | 8 | 88 | 58 | X | 120 | 78 | x |
25 | 19 | EM | 57 | 39 | 9 | 89 | 59 | Y | 121 | 79 | y |
26 | 1A | SUB | 58 | 3A | : | 90 | 5A | Z | 122 | 7A | z |
27 | 1B | ESC | 59 | 3B | ; | 91 | 5B | [ | 123 | 7B | { |
28 | 1C | FS | 60 | 3C | < | 92 | 5C | \ | 124 | 7C | | |
29 | 1D | GS | 61 | 3D | = | 93 | 5D | ] | 125 | 7D | } |
30 | 1E | RS | 62 | 3E | > | 94 | 5E | ^ | 126 | 7E | ~ |
31 | 1F | US | 63 | 3F | ? | 95 | 5F | _ | 127 | 7F | DEL |