Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

adding live camera output #64

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions deployment/edge/ansible/files/docker-compose.template.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@ services:
build:
context: edge_streamlit
dockerfile: Dockerfile
# devices:
# - /dev/video0:/dev/video0
# - /dev/video2:/dev/video2
devices:
- /dev/video0:/dev/video0
- /dev/video2:/dev/video2
ports:
- 8502:8501
profiles: [edge]
1 change: 1 addition & 0 deletions edge_streamlit/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ COPY requirements.txt .
RUN pip install -r requirements.txt

COPY app.py .
COPY utils.py .
COPY prediction_boxes.py .

EXPOSE 8501
Expand Down
34 changes: 34 additions & 0 deletions edge_streamlit/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
from prediction_boxes import filtering_items_that_have_predictions, plot_predictions
from PIL import Image
from io import BytesIO
from utils import display_camera_checkboxes, list_cameras
import cv2

# Page configuration
st.set_page_config(page_title="VIO-edge", page_icon="🔦", layout="wide")
Expand All @@ -28,6 +30,8 @@ def main():
st.session_state.trigger = False
if "item_id" not in st.session_state:
st.session_state.item_id = None
if "recording" not in st.session_state:
st.session_state.recording = None

col1, col2, col3 = st.columns(3)

Expand Down Expand Up @@ -105,6 +109,36 @@ def main():
unsafe_allow_html=True,
)

# Sidebar parameters
st.sidebar.title("Configuration")
available_cameras = list_cameras()
selected_cameras = display_camera_checkboxes(available_cameras)
st.session_state.selected_cameras = selected_cameras

if st.sidebar.button("Start/Stop Recording"):
st.session_state.recording = not st.session_state.recording

# Video capture logic
if st.session_state.recording and selected_cameras:
caps = {index: cv2.VideoCapture(index) for index in selected_cameras}
columns = st.columns(len(selected_cameras))
frames_video = {
index: columns[i].empty() for i, index in enumerate(selected_cameras)
}

while st.session_state.recording:
for index in selected_cameras:
ret, frame = caps[index].read()
if st.session_state.trigger:
st.session_state.image = frame

if ret:
frames_video[index].image(frame, channels="BGR")
else:
frames_video[index].text(
f"Camera {index} - Failed to capture video"
)


if __name__ == "__main__":
main()
45 changes: 45 additions & 0 deletions edge_streamlit/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import logging
from typing import List

import cv2
import streamlit as st
import os

logger = logging.getLogger(__name__)
logger.addHandler(logging.StreamHandler())
logger.setLevel(logging.DEBUG)

os.environ["OPENCV_LOG_LEVEL"] = "OFF"
os.environ["OPENCV_FFMPEG_LOGLEVEL"] = "-8"


def list_cameras() -> List[str]:
"""
Liste toutes les caméras disponibles sur le système.
"""
index = 0
available_cameras = []
while True:
cap = cv2.VideoCapture(index)
if not cap.read()[0]:
break
available_cameras.append(f"Cam {index}")
cap.release()
index += 1
return available_cameras


def display_camera_checkboxes(available_cameras: List[str]) -> List[int]:
"""
Affiche les caméras disponibles sous forme de cases à cocher.
Retourne les indices des caméras sélectionnées.
"""
selected_cameras = []
if len(available_cameras) == 0:
st.warning("No camera detected.")
else:
for i, camera_name in enumerate(available_cameras):
if st.sidebar.checkbox(camera_name, key=f"camera_{i}"):
selected_cameras.append(i)
logger.debug(f"Selected cameras are {selected_cameras}")
return selected_cameras