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 os
|
||||||
import cv2
|
import cv2
|
||||||
import time
|
import time
|
||||||
import argparse
|
|
||||||
|
|
||||||
|
|
||||||
class Marker:
|
class Marker:
|
||||||
def __init__(self):
|
def __init__(self, opts):
|
||||||
self.get_options()
|
self.opts = opts
|
||||||
if not os.path.exists(self.opts.video):
|
if not os.path.exists(self.opts.video):
|
||||||
raise FileNotFoundError("Video file missing!")
|
raise FileNotFoundError("Video file missing!")
|
||||||
|
|
||||||
@@ -157,7 +156,6 @@ class Marker:
|
|||||||
self.shadow_text(frame, row, (left, bottom), 0.6, 1, (255, 255, 255))
|
self.shadow_text(frame, row, (left, bottom), 0.6, 1, (255, 255, 255))
|
||||||
bottom += 18
|
bottom += 18
|
||||||
|
|
||||||
|
|
||||||
def draw_label(self, frame):
|
def draw_label(self, frame):
|
||||||
|
|
||||||
if not self.nr in self.stamps:
|
if not self.nr in self.stamps:
|
||||||
@@ -201,21 +199,6 @@ class Marker:
|
|||||||
q or esc quit
|
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):
|
def mouse_click(self, event, x, y, flags, param):
|
||||||
|
|
||||||
in_bar = all(
|
in_bar = all(
|
||||||
@@ -260,7 +243,11 @@ class Marker:
|
|||||||
def parse_timestamps(self):
|
def parse_timestamps(self):
|
||||||
if self.opts.timestamps:
|
if self.opts.timestamps:
|
||||||
self.stamps = sorted(
|
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.stamps = [x for x in self.stamps if 0 <= x < self.frames]
|
||||||
self.nr = self.stamps[0]
|
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):
|
def shadow_text(self, frame, text, pos, size, thicc, color):
|
||||||
|
|
||||||
cv2.putText(
|
cv2.putText(
|
||||||
@@ -344,7 +339,7 @@ class Marker:
|
|||||||
if self.show_help:
|
if self.show_help:
|
||||||
self.draw_help(frame_visu)
|
self.draw_help(frame_visu)
|
||||||
|
|
||||||
if cv2.getWindowProperty('tsmark', cv2.WND_PROP_VISIBLE) < 1:
|
if cv2.getWindowProperty("tsmark", cv2.WND_PROP_VISIBLE) < 1:
|
||||||
break
|
break
|
||||||
cv2.imshow("tsmark", frame_visu)
|
cv2.imshow("tsmark", frame_visu)
|
||||||
k = cv2.waitKey(draw_wait)
|
k = cv2.waitKey(draw_wait)
|
||||||
@@ -426,7 +421,4 @@ class Marker:
|
|||||||
|
|
||||||
self.video_reader.release()
|
self.video_reader.release()
|
||||||
self.print_timestamps()
|
self.print_timestamps()
|
||||||
|
self.save_timestamps()
|
||||||
|
|
||||||
def main():
|
|
||||||
mark = Marker()
|
|
||||||
|
|||||||
Reference in New Issue
Block a user