SnapShot / app.py
hillol7's picture
Create app.py
6e84592 verified
raw
history blame
2.09 kB
import streamlit as st
import cv2
import numpy as np
st.title("Object Tracking in Video using SIFT")
# Upload files
uploaded_image = st.file_uploader("Upload an image", type=['png', 'jpg'])
uploaded_video = st.file_uploader("Upload a video", type=['mp4'])
if uploaded_image and uploaded_video:
# Convert uploaded files to OpenCV-compatible formats
image_bytes = np.asarray(bytearray(uploaded_image.read()), dtype=np.uint8)
input_image = cv2.imdecode(image_bytes, cv2.IMREAD_GRAYSCALE)
video_bytes = np.asarray(bytearray(uploaded_video.read()), dtype=np.uint8)
cap = cv2.VideoCapture()
cap.open(uploaded_video.name)
# Initialize SIFT
sift = cv2.SIFT_create()
bf = cv2.BFMatcher()
# Detect keypoints and descriptors for the input image
keypoints_input, descriptors_input = sift.detectAndCompute(input_image, None)
occurrences = 0
occurrence_start = 0
occurrence_duration = 0
prev_matches = []
while cap.isOpened():
ret, frame = cap.read()
if not ret:
st.write("End of video reached.")
break
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Detect keypoints and descriptors for the video frame
keypoints_frame, descriptors_frame = sift.detectAndCompute(frame_gray, None)
# Match descriptors
matches = bf.knnMatch(descriptors_input, descriptors_frame, k=2)
good_matches = []
for m, n in matches:
if m.distance < 0.75 * n.distance:
good_matches.append(m)
if len(good_matches) >= 6:
if not prev_matches:
occurrence_start = cap.get(cv2.CAP_PROP_POS_MSEC) / 1000
occurrences += 1
prev_matches = good_matches
occurrence_duration = (cap.get(cv2.CAP_PROP_POS_MSEC) / 1000) - occurrence_start
else:
if prev_matches:
st.write(f"Occurrence {occurrences}: Start time: {occurrence_start:.2f}s, Duration: {occurrence_duration:.2f}s")
prev_matches = []
cap.release()