From 8963cf37105444722f778c52db2d5c29336bf222 Mon Sep 17 00:00:00 2001 From: Riku Silvennoinen Date: Wed, 11 Dec 2024 09:54:57 +0200 Subject: [PATCH] Upload files to "/" --- Dockerfile | 26 ++++++++++++ README.me | 102 +++++++++++++++++++++++++++++++++++++++++++++++ app.py | 39 ++++++++++++++++++ requirements.txt | 3 ++ 4 files changed, 170 insertions(+) create mode 100644 Dockerfile create mode 100644 README.me create mode 100644 app.py create mode 100644 requirements.txt diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c2d5def --- /dev/null +++ b/Dockerfile @@ -0,0 +1,26 @@ +# Perustuu viralliseen Python-kuvaan +FROM python:3.10-slim + +# Työhakemiston asettaminen +WORKDIR /app + +# Asenna tarvittavat riippuvuudet +RUN apt-get update && apt-get install -y \ + libgl1-mesa-glx \ + libglib2.0-0 \ + && apt-get clean + +# Kopioi sovelluksen tiedostot +COPY requirements.txt requirements.txt +COPY app.py app.py + +# Asenna Python-paketit +RUN pip install --no-cache-dir -r requirements.txt + +# Avaa portti 5000 +EXPOSE 5000 + +# Käynnistä Flask-sovellus +CMD ["gunicorn", "-w", "1", "-b", "0.0.0.0:5000", "--timeout", "120", "app:app"] + + diff --git a/README.me b/README.me new file mode 100644 index 0000000..b190dad --- /dev/null +++ b/README.me @@ -0,0 +1,102 @@ +# Live Webcam Stream Flaskilla ja OpenCV:llä + +Tämä projekti tarjoaa yksinkertaisen verkkosovelluksen, joka suoratoistaa reaaliaikaista videota verkkokamerasta käyttäen Flaskia ja OpenCV:tä. Sovellus pitää kameran jatkuvasti päällä ja palvelee videolähetystä yhdistetyille asiakkaille. + +--- + +## Ominaisuudet +- Suoratoistaa reaaliaikaista videota verkkokamerasta verkkoselaimeen. +- Flask-hoitaa HTTP-pyynnöt. +- OpenCV käytetään videon kaappaamiseen ja kehysten käsittelyyn. +- Säikeistys varmistaa, että kamera pysyy päällä riippumatta asiakkaan toiminnasta. + +--- + +## Vaatimukset +- Python 3.8 tai uudempi +- Flask +- OpenCV + +--- + +## Asennus ja käyttöönotto + +### 1. Kloonaa repositorio +Kloonaa tämä repositorio Gitea-palvelimellesi tai paikalliselle koneellesi: +```bash +git clone +cd +``` + +### 2. Asenna riippuvuudet +Suosittelemme käyttämään Python-virtuaaliympäristöä: +```bash +python3 -m venv venv +source venv/bin/activate +pip install flask opencv-python +``` + +### 3. Käynnistä sovellus +Käynnistä Flask-sovellus paikallisesti: +```bash +python app.py +``` + +Avaa sovellus selaimessasi osoitteessa: +``` +http://localhost:5000 +``` + +--- + +## Dockerin käyttö + +### 1. Luo Docker-image +Luo Docker-image mukana toimitetusta `Dockerfile`-tiedostosta: +```bash +sudo docker build -t webcam . +``` + +### 2. Käynnistä Docker-kontti +Käynnistä kontti kameran käyttöoikeudella: +```bash +sudo docker run -it --rm -p 5001:5000 --device /dev/video0 webcam +``` + +Avaa sovellus selaimessasi osoitteessa: +``` +http://:5001 +``` + +--- + +## Tiedostorakenne +``` +. +├── app.py # Pääasiallinen Flask-sovellus +├── Dockerfile # Docker-konfiguraatio +├── README.md # Projektin dokumentaatio +└── requirements.txt # Python-riippuvuudet +``` + +--- + +## Vianetsintä + +### Verkkokameraa ei löydy +Varmista, että verkkokamera on oikein liitetty ja käytettävissä. Jos käytät Dockeria, varmista, että `--device /dev/video0`-lippu on mukana. + +### Suorituskykyongelmat +Jos suoratoisto pätkii, harkitse resoluution alentamista OpenCV:n `VideoCapture`-asetuksista. + +--- + +## Osallistuminen +Voit vapaasti haarauttaa tämän repositorion ja lähettää pull requesteja parantaaksesi projektia. + +--- + +## Lisenssi +Tämä projekti on lisensoitu MIT-lisenssillä. + + diff --git a/app.py b/app.py new file mode 100644 index 0000000..c4a4613 --- /dev/null +++ b/app.py @@ -0,0 +1,39 @@ +import cv2 +from flask import Flask, Response +import threading + +app = Flask(__name__) + +# Kamera ja kehykset globaalina +camera = cv2.VideoCapture(0) +current_frame = None + +def capture_frames(): + global camera, current_frame + while True: + success, frame = camera.read() + if success: + current_frame = cv2.imencode('.jpg', frame)[1].tobytes() + +# Käynnistä taustasäie kameran pitämiseksi päällä +frame_thread = threading.Thread(target=capture_frames, daemon=True) +frame_thread.start() + +def generate_frames(): + global current_frame + while True: + if current_frame is not None: + yield (b'--frame\r\n' + b'Content-Type: image/jpeg\r\n\r\n' + current_frame + b'\r\n') + +@app.route('/video_feed') +def video_feed(): + return Response(generate_frames(), mimetype='multipart/x-mixed-replace; boundary=frame') + +@app.route('/') +def index(): + return "

Live Stream

" + +if __name__ == "__main__": + app.run(host='0.0.0.0', port=5000) + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..e8340ff --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +flask +opencv-python-headless +gunicorn