ラズパイ

【初心者向け】ラズパイでOpenCVでwebカメラ映像をモニタ画面に表示するプログラミング

ラズパイで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を使うことで

簡単な関数を使い映像処理ができます。

 

いかがでしたでしょうか

難しかったところもあると思いますが

プログラミングは

挫折することも多いです

ゆっくりと続けていきましょう。



 

【初心者向け】防犯カメラをRaspberry Piで作る!Pythonでプログラミング学習Raspberry Pi(ラズパイ)を使い防犯カメラを作成歩法を紹介しています。手順を追って解説しながら楽しくPython言語を使いプログラムを作成していきます。こkでは楽しく作っていくことを目的としています。...

 

アスキーコード表

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