본문 바로가기
라즈베리파이(Raspberry Pi)

(4) 라즈베리 파이 카메라 제어 (Flask 서버)

by kingyejin 2023. 12. 3.

<카메라 제어 시스템>

 


1. 라즈베리파이에 카메라 모듈 연결


2. 카메라 장치 설정

raspi-config > 3. Interface Options > Legacy  Camera(I1) > YES 후 재부팅 

sudo raspi-config


3. 카메라 실행

1) raspistill 명령어

raspistill -o img.jpg #카메라 촬영 (img: 파일 이름, 기본 시간은 5초 뒤 촬영)
raspistill -t 2000 -o img.jpg  #-t의 단위는 밀리초, 2초뒤에 촬영
raspistill -vf -hf -o img.jpg #상하 좌우 반전

 

2) raspivid 명령어

raspivid -o vid.h264 #동영상 촬영 (vid: 파일이름)
#확장자 h264->mp4로 바꾸는 법
sudo apt-get install -y gpac
MP4Box -add vid.h264 vid.mp4

4. 카메라 제어

 

1) 5초 뒤에 사진찍고  해당 경로로 사진 저장

*파이 카메라 조도가 설정되는 시간을 기다려주기 위해 사진 찍기 전 최소 2초 정도 여유를 두는 것이 좋음

from picamera import PiCamera
from time import sleep

camera=PiCamera()

camera.start_preview()
sleep(5)
camera.capture('/home/DLETSGO/image1.jpg')
camera.stop_preview()

 

2) PiCamera의 rotation 메서드를 이용해 화면을 180도 돌려서 10초 뒤에 사진 찍고 해당 경로로 사진 저장

from picamera import PiCamera
from time import sleep

camera=PiCamera()

camera.rotation = 180
camera.start_preview()
sleep(10)
camera.capture('/home/DLETSGO/image2.jpg')
camera.stop_preview()

 

3) PiCamera의 start_recording 메서드를 이용해 10초간 영상 찍고 해당 경로로 동영상 저장

from picamera import PiCamera
from time import sleep

camera=PiCamera()

camera.start_preview()
camera.start_recording('/home/DLETSGO/video.h264')
sleep(10)
camera.stop_recording()
camera.stop_preview()

4. 카메라 화면 FLASK  파이썬 서버에 올려서 영상 스트리밍하기

=> 인터넷 브라우저를 통해 실시간 카메라 영상 확인 가능

*단, 인터넷에 접속한 기기는 라즈베리파이와 동일한 wifi에 연결되어있어야 함.

 

1) FLASK 패키지 설치 (+pip 설치)

sudo apt-get install python-pip #Flask 사용하기 위해서는 파이썬 패키지 매니저인 pip 설치해야함
sudo pip install flask

 

 

2) RPiPetFeeder 프로젝트 클론 [github]

git clone https://github.com/neosarchizo/RPiPetFeeder
cd RPiPetFeeder/
nano app.py

 

-해당 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)

 

3) app.py 실행 후, 라즈베리파이 할당 IP 주소를 스마트폰의 인터넷 브라우저를 통해 입력하기

python3 app.py
192.168.217.164:5000