파이썬 서버와 파이 카메라 연동
Flask라는 파이썬 서버를 이용해 파이 카메라 영상을 스트리밍해본다.
Flask 설치
Flask를 사용하기 위해서는 먼저 파이썬 패키지 매니저인 pip를 설치해줘야 한다. 다음을 입력하면 pip가 설치된다.
sudo apt-get install python-pip
pip가 설치되면 다음을 입력해 Flask를 설치한다.
sudo pip install flask
서버 실행하기
터미널에서 다음을 입력해
nano
에디터를 실행한다.nano app.py
다음을 입력하고 저장(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')
터미널에서 다음을 입력해 서버를 실행한다.
python app.py
같은 네트워크에 연결된 다른 컴퓨터의 웹브라우저에서 [라즈베리 파이 IP주소]:5000으로 접속한다. 다음은 라즈베리 파이 IP주소가 10.0.1.22라고 가정했을때 웹브라우저에서 들어가는 주소이다. 접속해 들어가면
Hello flask!
라고 찍히는 것을 볼 수 있다.http://10.0.1.22:5000
라우팅 설정하기
사용자가 특정 경로를 입력하면 Flask에서 이를 처리하는 것을 해본다.
터미널에서 다음을 입력해 앞서 입력했던
app.py
를 연다.nano app.py
다음과 같이 수정하고 저장한다.
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')
서버를 실행하고 [라즈베리 파이 IP주소]:5000/cakes로 접속하면
Yummy cakes!
라고 뜨는 것을 볼 수 있다.
템플릿 사용하기
HTML 템플릿을 사용해 웹페이지를 표시하는 것을 해본다.
다음을 입력해
templates
라는 하위 폴더를 만들고, 그 폴더로이동한다.mkdir templates cd templates
다음을 입력해
nano
에디터를 실행한다.nano index.html
다음 내용을 입력하고 저장한다.
<html> <body> <h1>Hello flask from a template!</h1> </body> </html>
다음과 같이 입력해 다시
app.py
가 있는 곳으로 이동하고,nano
에디터로app.py
를 연다.cd .. nano app.py
다음과 같이 수정하고 저장한다.
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')
서버를 실행하고 [라즈베리 파이 IP주소]:5000으로 접속하면
Hello flask from a template!
이라고 뜨는 것을 볼 수 있다.
매개변수 사용하기
경로 안에 있는 특정 값을 매개변수롤 사용하는 법을 배운다.
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')
다음과 같이 입력해
index.html
을page.html
으로 복사하고,nano
에디터로 연다.cd templates/ cp index.html page.html nano page.html
다음과 같이 수정하고 저장한다.
<html> <body> <h1>Hello !</h1> </body> </html>
서버를 실행하고 [라즈베리 파이 IP주소]:5000/hello/junhyuk으로 접속하면
Hello junhyuk!
이라고 뜨는 것을 볼 수 있다.
파이 카메라 영상 스트리밍하기
터미널에서 다음을 입력해
RPiPetFeeder
프로젝트를 클론한다.git clone https://github.com/neosarchizo/RPiPetFeeder
다음을 입력해
RPiPetFeeder
폴더로 이동하고,app.py
를nano
에디터로 연다.cd RPiPetFeeder/ nano app.py
다음과 같이 수정한다.
#!/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)
서버를 실행하고 [라즈베리 파이 IP주소]:5000으로 접속하면 파이 카메라의 영상이 스트리밍되는 것을 볼 수 있다.