파이썬 서버와 파이 카메라 연동


Flask라는 파이썬 서버를 이용해 파이 카메라 영상을 스트리밍해본다.

Flask 설치

  1. Flask를 사용하기 위해서는 먼저 파이썬 패키지 매니저인 pip를 설치해줘야 한다. 다음을 입력하면 pip가 설치된다.

    sudo apt-get install python-pip
    
  2. pip가 설치되면 다음을 입력해 Flask를 설치한다.

    sudo pip install flask
    

서버 실행하기

  1. 터미널에서 다음을 입력해 nano 에디터를 실행한다.

    nano app.py
    
  2. 다음을 입력하고 저장(Ctrl + o)하고 종료(Ctrl + x)한다.

    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
       return 'Hello flask!'
    
    if __name__ == '__main__':
       app.run(debug=True, host='0.0.0.0')
    
  3. 터미널에서 다음을 입력해 서버를 실행한다.

    python app.py
    
  4. 같은 네트워크에 연결된 다른 컴퓨터의 웹브라우저에서 [라즈베리 파이 IP주소]:5000으로 접속한다. 다음은 라즈베리 파이 IP주소가 10.0.1.22라고 가정했을때 웹브라우저에서 들어가는 주소이다. 접속해 들어가면 Hello flask!라고 찍히는 것을 볼 수 있다.

    http://10.0.1.22:5000
    

라우팅 설정하기

사용자가 특정 경로를 입력하면 Flask에서 이를 처리하는 것을 해본다.

  1. 터미널에서 다음을 입력해 앞서 입력했던 app.py를 연다.

    nano app.py
    
  2. 다음과 같이 수정하고 저장한다.

    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
       return 'Hello flask!'
    
    @app.route('/cakes')
    def cakes():
       return 'Yummy cakes!'
    
    if __name__ == '__main__':
       app.run(debug=True, host='0.0.0.0')
    
  3. 서버를 실행하고 [라즈베리 파이 IP주소]:5000/cakes로 접속하면 Yummy cakes!라고 뜨는 것을 볼 수 있다.

템플릿 사용하기

HTML 템플릿을 사용해 웹페이지를 표시하는 것을 해본다.

  1. 다음을 입력해 templates라는 하위 폴더를 만들고, 그 폴더로이동한다.

    mkdir templates
    cd templates
    
  2. 다음을 입력해 nano 에디터를 실행한다.

    nano index.html
    
  3. 다음 내용을 입력하고 저장한다.

    <html>
     <body>
       <h1>Hello flask from a template!</h1>
     </body>
    </html>
    
  4. 다음과 같이 입력해 다시 app.py가 있는 곳으로 이동하고, nano 에디터로 app.py를 연다.

    cd ..
    nano app.py
    
  5. 다음과 같이 수정하고 저장한다.

    from flask import Flask, render_template
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
       return render_template('index.html')
    
    @app.route('/cakes')
    def cakes():
       return 'Yummy cakes!'
    
    if __name__ == '__main__':
       app.run(debug=True, host='0.0.0.0')
    
  6. 서버를 실행하고 [라즈베리 파이 IP주소]:5000으로 접속하면 Hello flask from a template!이라고 뜨는 것을 볼 수 있다.

매개변수 사용하기

경로 안에 있는 특정 값을 매개변수롤 사용하는 법을 배운다.

  1. app.py를 열고 다음과 수정하고 저장한다.

    from flask import Flask, render_template
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
       return render_template('index.html')
    
    @app.route('/hello/<_name>')
    def hello(_name):
       return render_template('page.html', name=_name)
    
    @app.route('/cakes')
    def cakes():
       return 'Yummy cakes!'
    
    if __name__ == '__main__':
       app.run(debug=True, host='0.0.0.0')
    
  2. 다음과 같이 입력해 index.htmlpage.html으로 복사하고, nano 에디터로 연다.

    cd templates/
    cp index.html page.html
    nano page.html
    
  3. 다음과 같이 수정하고 저장한다.

    <html>
     <body>
       <h1>Hello !</h1>
     </body>
    </html>
    
  4. 서버를 실행하고 [라즈베리 파이 IP주소]:5000/hello/junhyuk으로 접속하면 Hello junhyuk!이라고 뜨는 것을 볼 수 있다.

파이 카메라 영상 스트리밍하기

  1. 터미널에서 다음을 입력해 RPiPetFeeder 프로젝트를 클론한다.

    git clone https://github.com/neosarchizo/RPiPetFeeder
    
  2. 다음을 입력해 RPiPetFeeder 폴더로 이동하고, app.pynano 에디터로 연다.

    cd RPiPetFeeder/
    nano app.py
    
  3. 다음과 같이 수정한다.

    #!/usr/bin/env python
    from flask import Flask, render_template, Response
    from camera import Camera
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
       return render_template('index.html')
    
    def gen(camera):
       while True:
           frame = camera.get_frame()
           yield (b'--frame\r\n'
                  b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
    
    @app.route('/video_feed')
    def video_feed():
       return Response(gen(Camera()),
                       mimetype='multipart/x-mixed-replace; boundary=frame')
    
    if __name__ == '__main__':
       app.run(host='0.0.0.0', debug=True, threaded=True)
    
  4. 서버를 실행하고 [라즈베리 파이 IP주소]:5000으로 접속하면 파이 카메라의 영상이 스트리밍되는 것을 볼 수 있다.

results matching ""

    No results matching ""