From 0d43c980af5e3f0ae40340fc970029755aec5534 Mon Sep 17 00:00:00 2001 From: shoofle Date: Mon, 29 Jul 2024 12:29:52 -0400 Subject: [PATCH] cleaning up a bit i don't remember whatever --- Pipfile | 1 - Pipfile.lock | 27 +------------------------- readme.md | 8 +++++++- webcam.py | 55 +++++++++++++++++++++++++++++++--------------------- 4 files changed, 41 insertions(+), 50 deletions(-) diff --git a/Pipfile b/Pipfile index 6718b12..7ce390f 100644 --- a/Pipfile +++ b/Pipfile @@ -5,7 +5,6 @@ name = "pypi" [packages] opencv-python = "*" -python-ffmpeg = "*" [dev-packages] diff --git a/Pipfile.lock b/Pipfile.lock index 0e7e231..f2c2a80 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "96b4a3ab781c5962dc20f7beaae76ca7d30cf6dd4e193b0b04e985235aabc5cb" + "sha256": "9cd65918174126dae7310623cabe06ec6e5ce3f1bb0e255262749a78a55d3839" }, "pipfile-spec": 6, "requires": { @@ -80,31 +80,6 @@ "index": "pypi", "markers": "python_version >= '3.6'", "version": "==4.10.0.84" - }, - "pyee": { - "hashes": [ - "sha256:5d346a7d0f861a4b2e6c47960295bd895f816725b27d656181947346be98d7c1", - "sha256:b53af98f6990c810edd9b56b87791021a8f54fd13db4edd1142438d44ba2263f" - ], - "markers": "python_version >= '3.8'", - "version": "==11.1.0" - }, - "python-ffmpeg": { - "hashes": [ - "sha256:19ac80af5a064a2f53c245af1a909b2d7648ea045500d96d3bcd507b88d43dc7", - "sha256:d86697da8dfb39335183e336d31baf42fb217468adf5ac97fd743898240faae3" - ], - "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==2.0.12" - }, - "typing-extensions": { - "hashes": [ - "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", - "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" - ], - "markers": "python_version >= '3.8'", - "version": "==4.12.2" } }, "develop": {} diff --git a/readme.md b/readme.md index 743241d..3e57cb4 100644 --- a/readme.md +++ b/readme.md @@ -1 +1,7 @@ -run it in python3 after `pipenv install opencv-python` +run it with python3 after `pipenv install opencv-python` + +this progrram opens a fullscreen window showing a feed from camera 0 with a delay. +it will collect a lot of video files in the videos/ folder, and use them for showing a long (multiple minutes) delay +it also holds ontoo a buffer of a couple hundred frames to show shorter delays (like 5 oor 30 seconds) +it doesn't currently do anything to handle missing files, but it would be nice to give it a "default" swirly portal looking video to show +hopefully this'll run on a raspberry pi in the desert. \ No newline at end of file diff --git a/webcam.py b/webcam.py index 4703aa1..1644c4f 100644 --- a/webcam.py +++ b/webcam.py @@ -1,72 +1,83 @@ from datetime import datetime, date, time, timedelta +import os import cv2 - def five_minute_segment_from(the_time): return the_time.replace(minute=(the_time.minute // 1)*1, second=0, microsecond=0) -def video_address_for(time_stamp): +def path_to_video_at(time_stamp): return 'videos/' + str(time_stamp) + '.mkv' +#delay for long delay +long_delay = timedelta(hours=1) + + queue = [(False, None)] * 100 #queue of recent frames last_time_stamp = five_minute_segment_from(datetime.now()) # live webcam feed camera = cv2.VideoCapture(0) -camera.set(cv2.CAP_PROP_FPS, 30.0) if not camera.isOpened(): print("Cannot open camera") exit() # video writer fourcc = cv2.VideoWriter_fourcc(*'H264') -out = cv2.VideoWriter(video_address_for(last_time_stamp), fourcc, camera.get(cv2.CAP_PROP_FPS), (int(camera.get(3)),int(camera.get(4)))) +out = cv2.VideoWriter(path_to_video_at(last_time_stamp), fourcc, camera.get(cv2.CAP_PROP_FPS), (int(camera.get(3)),int(camera.get(4)))) # video feed from previously captured video -old_time = cv2.VideoCapture(video_address_for(last_time_stamp)) +old_time = cv2.VideoCapture(path_to_video_at(last_time_stamp)) + +cv2.namedWindow("mirror", cv2.WINDOW_NORMAL) +cv2.setWindowProperty("mirror", cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) idx = 0 offset = 0 longterm = False while(True): if last_time_stamp != five_minute_segment_from(datetime.now()): + # find file older than our long delay + old_file = path_to_video_at(five_minute_segment_from(datetime.now() - long_delay - timedelta(minutes=5))) + print(f"deleting old file {old_file}") + os.remove(old_file) + out.release() - out = cv2.VideoWriter(video_address_for(last_time_stamp), + out = cv2.VideoWriter(path_to_video_at(last_time_stamp), fourcc, camera.get(cv2.CAP_PROP_FPS), (int(camera.get(3)), int(camera.get(4))) ) if old_time.isOpened(): old_time.release() - old_time = cv2.VideoCapture(video_address_for(five_minute_segment_from(datetime.now() - timedelta(minutes=10)))) + + new_file = path_to_video_at(five_minute_segment_from(datetime.now() - timedelta(minutes=10))) + pint(f"opening the previously recorded file {new_file} to read from for long mirror") + old_time = cv2.VideoCapture(new_file) last_time_stamp = five_minute_segment_from(datetime.now()) ret, frame = camera.read() frame = cv2.flip(frame, 1) - #recod the frame + # record the frame to the appropriate file, and also to the short term buffer out.write(frame) queue[idx] = ret, frame + prev_frame_valid, prev_frame = queue[(idx - offset) % len(queue)] + old_frame_valid, old_frame = old_time.read() + if not longterm and prev_frame_valid: + cv2.imshow('mirror', prev_frame) + elif longterm and old_frame_valid: + cv2.imshow('mirror', old_frame) - showo, fr = queue[(idx - offset) % len(queue)] - if longterm: - ret2, frame2 = old_time.read() - if ret2: - cv2.imshow('vid', frame2) - elif showo: - cv2.imshow('vid', fr) - - # the 'q' button is set as the quitting button you may use any desired button of your choice - key = cv2.waitKey(1) & 0xFF - if key == ord('q'): + key = cv2.waitKey(16) # listen for keyprress for some number of ms + if key & 0xFF == ord('q') or key == 27: # q or esc break - if key == ord('a'): + if key & 0xFF == ord('a'): offset += 1 - if key == ord('d'): + if key & 0xFF == ord('d'): offset -= 1 - if key == ord('z'): + if key & 0xFF == ord('z'): longterm = not longterm idx = (idx + 1) % len(queue)