フラスコを使用して Raspberry Pi カメラの監視ビデオを取得する

目次

1.フラスコライブラリをインストールする

2. フラスコを使用してウェブページを開き、ビデオを送信します

2.1 Raspberry Pi ターミナルのデスクトップで、新しい flask フォルダーを作成します。

2.2 flask フォルダーに新しいテンプレート フォルダーと app.py ファイルを作成します

2.3 テンプレートフォルダーに新しいindex.htmlファイルを作成します。

2.4 フラスコを使用してコードを実行し、監視ビデオをアップロードする

3. ajax フォームを使用してキーストロークをシミュレートし、フラスコからラズベリーパイにデータを転送します。


1.フラスコライブラリをインストールする

sudo install apt-get flask

2. フラスコを使用してウェブページを開き、ビデオを送信します

2.1 Raspberry Pi ターミナルのデスクトップで、新しい flask フォルダーを作成します。

mkdir flask

2.2 flask フォルダーに新しいテンプレート フォルダーと app.py ファイルを作成します

mkdir template
touch app.py

2.3 テンプレートフォルダーに新しいindex.htmlファイルを作成します。

touch index.html

 

 作成後、コマンド ls を入力して現在のフォルダーの内容を表示し、cd + フォルダー名を入力して次のフォルダーに移動できます。

2.4 フラスコを使用してコードを実行し、監視ビデオをアップロードする

2 つのファイルを編集する必要があります。1 つは、index.html で、もう 1 つは、app.py です。

最初のindex.htmlは単にWebページを記述するだけで、コードは次のとおりです。

<!DOCTYPE html>
<html>
  <head>  
    <title>HHH</title>
  </head>
  <body>
    <div class="header" id="demo">
      <div class="title"><h2>CTRL</h2></div>
      
       <form action="/video" method="post" enctype="multipart/form-data">
        <img src="{
   
   {videourl}}"> 
        <br>                                   
       </form>
            
      </div>
    
  </body>
</html>

flask に付属のビデオ ストリーミング Motion JPEG であるビデオ エンコーディングを取得する簡単な操作です。

2 番目は app.py ファイルです

コードは以下のように表示されます:

# coding: utf-8
from flask import Flask,render_template,Response,request,url_for
import cv2
import numpy as np
import time
import os


app = Flask(__name__)      

    
@app.route('/video', methods=['GET', 'POST'])
def videoshow():                
        return render_template('index.html',videourl=url_for('video_feed'))
           

@app.route('/video_feed',methods=['GET', 'POST'])
def video_feed():
    return Response(gen(),mimetype='multipart/x-mixed-replace; boundary=frame')



     
def gen():
    cap = cv2.VideoCapture(0)
    cap.set(3,600)
    cap.set(4,480)
    cap.set(5,40) 
    
    while True:
        ret, img  = cap.read()                             
        ret, jpeg = cv2.imencode('.jpg',img)  # 对图像进行编码输出 jpeg     
        yield(b'--frame\r\n'+b'Content-Type: image/jpeg\r\n\r\n' + jpeg.tobytes() + b'\r\n\r\n')
  
                  
if __name__ == '__main__':
    app.run(host='192.168.137.99', port=5008, debug=True)

 簡単に説明すると、

@app.route('A',methods=['B']) このフォームはルーティングであり、Web ページのアドレスから Web ページにジャンプしたり、Web ページのアドレスからジャンプしたりする、フラスコと Raspberry Pi 間の対話型ツールと考えることができます。 Webページ 機能へジャンプするデータです。

A は Web ページ アドレスのサフィックス、B は GET または POST リクエストです。Web ページがビデオを取得すると GET リクエストとなり、フォームが押されると POST リクエストになります (Raspberry Pi は Web ページ ボタンを受け取ります)データ)

(1) ラズベリーパイターミナルフラスコフォルダーに python3 app.py と入力してコードを実行します

python3 app.py

図に示すように、Web ページのアドレスを取得するために戻ります: http://192.168.137.100:5008/

 (2) Webページを開き、http://192.168.137.100:5008/videoと入力します。 

        ビデオは前の A、つまりルートの名前です

(3) 入力後、監視中のWebページをリアルタイムに取得できます。

 これだけでビデオ監視機能が完了します。

コードを実行するプロセスについて簡単に説明します

app.run は現在の IP アドレスとポートを実行します → 最初のルートのビデオを実行し、Web ページのindex.html を返します → videourl を実行し、ビデオをエンコードして送信するための関数 gen() を返します。

3. ajax フォームを使用してキーストロークをシミュレートし、フラスコからラズベリーパイにデータを転送します。

ajax はどのような問題を解決するために使用されますか?

フォームが押されると、現在のページのビデオが消えるか、エンコード エラーにより監視ビデオが正常に再生できなくなります。または、現在のページが繰り返し更新されてカメラが再度開かれ、次のようなエラーが報告されます。カメラはすでに占有されています。Ajax は、カメラ監視ビデオを更新せずに、フォーム ページのみを更新できます。

以下は私のフルバージョンのindex.htmlとapp.pyコードです。

パソコンに保存するのを忘れてしまいました。研究室にいないので、今度作ります。

おすすめ

転載: blog.csdn.net/qq_51679917/article/details/130676848