output timestamps to a file
This commit is contained in:
28
Makefile
Normal file
28
Makefile
Normal file
@@ -0,0 +1,28 @@
|
||||
.PHONY: help
|
||||
|
||||
help: ## *:・゚✧*:・゚✧ This help *:・゚✧*:・゚✧
|
||||
@printf "\033[36;1m %14s \033[0;32;1m %s\033[0m\n" Target Description
|
||||
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
|
||||
awk ' \
|
||||
BEGIN {FS = ":.*?## "}; \
|
||||
{ if ( $$1 != "-") { \
|
||||
printf "\033[31;1;40m[ \033[36;1;40m%14s \033[31;1;40m]\033[0;32;1m %s\033[0m\n", $$1, $$2 \
|
||||
} else { \
|
||||
printf " \033[0;33;1m=^= %-25s =^=\033[0m\n", $$2 \
|
||||
} \
|
||||
} \
|
||||
'
|
||||
|
||||
-: ## Building
|
||||
###################################
|
||||
|
||||
clean: ## Clean build folders
|
||||
rm -r build tsmark.egg-info
|
||||
|
||||
pip: ## Install with pip
|
||||
pip install .
|
||||
|
||||
pipx: ## Install with pipx
|
||||
pipx install -f .
|
||||
|
||||
|
||||
@@ -1,3 +1,33 @@
|
||||
from tsmark.video_annotator import main
|
||||
from tsmark.video_annotator import Marker
|
||||
import argparse
|
||||
|
||||
VERSION = "0.2"
|
||||
VERSION = "0.3"
|
||||
|
||||
|
||||
def get_options():
|
||||
|
||||
parser = argparse.ArgumentParser(description="Video timestamping tool")
|
||||
parser.add_argument(
|
||||
"--ts",
|
||||
action="store",
|
||||
dest="timestamps",
|
||||
default=None,
|
||||
required=False,
|
||||
help="Comma separated list of predefined timestamps, in frame numbers, or HH:MM:SS.FF. You can use the -o output file as input via --ts $( cut -d, -f1 ts.csv | xargs printf '%%s,' )",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-o",
|
||||
action="store",
|
||||
dest="output",
|
||||
default=None,
|
||||
required=False,
|
||||
help="Save timestamps to a CSV file",
|
||||
)
|
||||
parser.add_argument("--version", action="version", version=VERSION)
|
||||
parser.add_argument(action="store", dest="video")
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def main():
|
||||
opts = get_options()
|
||||
Marker(opts)
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
from tsmark.video_annotator import main
|
||||
|
||||
main()
|
||||
|
||||
@@ -2,12 +2,11 @@ import sys
|
||||
import os
|
||||
import cv2
|
||||
import time
|
||||
import argparse
|
||||
|
||||
|
||||
class Marker:
|
||||
def __init__(self):
|
||||
self.get_options()
|
||||
def __init__(self, opts):
|
||||
self.opts = opts
|
||||
if not os.path.exists(self.opts.video):
|
||||
raise FileNotFoundError("Video file missing!")
|
||||
|
||||
@@ -157,7 +156,6 @@ class Marker:
|
||||
self.shadow_text(frame, row, (left, bottom), 0.6, 1, (255, 255, 255))
|
||||
bottom += 18
|
||||
|
||||
|
||||
def draw_label(self, frame):
|
||||
|
||||
if not self.nr in self.stamps:
|
||||
@@ -201,21 +199,6 @@ class Marker:
|
||||
q or esc quit
|
||||
"""
|
||||
|
||||
|
||||
def get_options(self):
|
||||
|
||||
parser = argparse.ArgumentParser(description="Video timestamping tool")
|
||||
parser.add_argument(
|
||||
"--ts",
|
||||
action="store",
|
||||
dest="timestamps",
|
||||
default=None,
|
||||
required=False,
|
||||
help="Comma separated list of predefined timestamps, in frame numbers, or HH:MM:SS.FF",
|
||||
)
|
||||
parser.add_argument(action="store", dest="video")
|
||||
self.opts = parser.parse_args()
|
||||
|
||||
def mouse_click(self, event, x, y, flags, param):
|
||||
|
||||
in_bar = all(
|
||||
@@ -260,7 +243,11 @@ class Marker:
|
||||
def parse_timestamps(self):
|
||||
if self.opts.timestamps:
|
||||
self.stamps = sorted(
|
||||
[self.parse_time(ts.strip()) for ts in self.opts.timestamps.split(",")]
|
||||
[
|
||||
self.parse_time(ts.strip())
|
||||
for ts in self.opts.timestamps.split(",")
|
||||
if ts.strip() != ""
|
||||
]
|
||||
)
|
||||
self.stamps = [x for x in self.stamps if 0 <= x < self.frames]
|
||||
self.nr = self.stamps[0]
|
||||
@@ -285,6 +272,14 @@ class Marker:
|
||||
)
|
||||
)
|
||||
|
||||
def save_timestamps(self):
|
||||
|
||||
if self.opts.output == None:
|
||||
return
|
||||
with open(self.opts.output, "wt") as fp:
|
||||
for i, ts in enumerate(self.stamps):
|
||||
fp.write("{},{},{}\n".format(self.format_time(ts), i + 1, ts + 1))
|
||||
|
||||
def shadow_text(self, frame, text, pos, size, thicc, color):
|
||||
|
||||
cv2.putText(
|
||||
@@ -344,7 +339,7 @@ class Marker:
|
||||
if self.show_help:
|
||||
self.draw_help(frame_visu)
|
||||
|
||||
if cv2.getWindowProperty('tsmark', cv2.WND_PROP_VISIBLE) < 1:
|
||||
if cv2.getWindowProperty("tsmark", cv2.WND_PROP_VISIBLE) < 1:
|
||||
break
|
||||
cv2.imshow("tsmark", frame_visu)
|
||||
k = cv2.waitKey(draw_wait)
|
||||
@@ -426,7 +421,4 @@ class Marker:
|
||||
|
||||
self.video_reader.release()
|
||||
self.print_timestamps()
|
||||
|
||||
|
||||
def main():
|
||||
mark = Marker()
|
||||
self.save_timestamps()
|
||||
|
||||
Reference in New Issue
Block a user