Compare commits
5 Commits
3590eaca3d
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| ece2431e83 | |||
| f3e9dbe805 | |||
| b7037ccccf | |||
| 6c0a86e648 | |||
| 6d81532774 |
@@ -1,2 +1,3 @@
|
|||||||
.venv/
|
.venv/
|
||||||
test/
|
test/
|
||||||
|
__pycache__/
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
{pkgs ? import <nixpkgs> {}}:
|
||||||
|
pkgs.mkShell {
|
||||||
|
buildInputs = [
|
||||||
|
pkgs.python313
|
||||||
|
pkgs.python313Packages.pip
|
||||||
|
pkgs.ninja # Add ninja here
|
||||||
|
pkgs.python313Packages.yt-dlp
|
||||||
|
pkgs.python313Packages.numpy
|
||||||
|
pkgs.python313Packages.tqdm
|
||||||
|
pkgs.python313Packages.img2pdf
|
||||||
|
pkgs.python313Packages.opencv-python
|
||||||
|
pkgs.ffmpeg
|
||||||
|
# Add any other development tools you need
|
||||||
|
];
|
||||||
|
|
||||||
|
# If you're managing Python dependencies more explicitly with Nix
|
||||||
|
# python3Env = pkgs.python3.withPackages (p: with p; [
|
||||||
|
# numpy
|
||||||
|
# img2pdf
|
||||||
|
# # ... other python packages
|
||||||
|
# ]);
|
||||||
|
}
|
||||||
@@ -19,8 +19,9 @@ parser.add_argument(
|
|||||||
)
|
)
|
||||||
parser.add_argument("-i","--ignore-temp", action="store_true", help="[requires -a] do not delete alt tmp")
|
parser.add_argument("-i","--ignore-temp", action="store_true", help="[requires -a] do not delete alt tmp")
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-f", "--format", type=str, default="png", help="use output custom img format"
|
"-f", "--img-format", type=str, default="png", help="use output custom img format"
|
||||||
)
|
)
|
||||||
|
parser.add_argument("-p","--paper-size", type=str, default="A4", help="set paper size")
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
src = args.source
|
src = args.source
|
||||||
@@ -28,7 +29,8 @@ dest = args.destination
|
|||||||
verbose = args.verbose
|
verbose = args.verbose
|
||||||
alt_temp = args.alt_temp
|
alt_temp = args.alt_temp
|
||||||
ignore_temp = args.ignore_temp
|
ignore_temp = args.ignore_temp
|
||||||
format = args.format
|
img_format = args.img_format
|
||||||
|
paper_size = args.paper_size
|
||||||
|
|
||||||
if verbose:
|
if verbose:
|
||||||
logging.basicConfig(level=logging.DEBUG, format="[%(levelname)s] - %(message)s")
|
logging.basicConfig(level=logging.DEBUG, format="[%(levelname)s] - %(message)s")
|
||||||
|
|||||||
+37
-15
@@ -1,7 +1,7 @@
|
|||||||
from utils import Download
|
from utils import Download
|
||||||
from utils import Misc
|
from utils import Misc
|
||||||
from utils import log
|
from utils import log
|
||||||
from utils import src, dest, alt_temp, format, ignore_temp, verbose
|
from utils import src, dest, alt_temp, img_format, ignore_temp, verbose, paper_size
|
||||||
|
|
||||||
from tqdm import tqdm
|
from tqdm import tqdm
|
||||||
import tempfile
|
import tempfile
|
||||||
@@ -17,8 +17,11 @@ import shutil
|
|||||||
# src: str = "https://www.youtube.com/watch?v=tyloC0e-Tqk"
|
# src: str = "https://www.youtube.com/watch?v=tyloC0e-Tqk"
|
||||||
# dest: str = "/home/sakamoto/Public/test"
|
# dest: str = "/home/sakamoto/Public/test"
|
||||||
|
|
||||||
|
|
||||||
class Vid2Sheet:
|
class Vid2Sheet:
|
||||||
def __init__(self, src, dest, img_format: str, use_tempfile=True, ignore_temp=False):
|
def __init__(
|
||||||
|
self, src, dest, img_format: str, use_tempfile=True, ignore_temp=False
|
||||||
|
):
|
||||||
self.src = src
|
self.src = src
|
||||||
self.dest = dest
|
self.dest = dest
|
||||||
self.img_format = img_format
|
self.img_format = img_format
|
||||||
@@ -72,7 +75,7 @@ class Vid2Sheet:
|
|||||||
def run(self):
|
def run(self):
|
||||||
self.check()
|
self.check()
|
||||||
self.capture()
|
self.capture()
|
||||||
self.stitch()
|
self.stitch(paper_size)
|
||||||
self.convert()
|
self.convert()
|
||||||
|
|
||||||
def check(self):
|
def check(self):
|
||||||
@@ -145,9 +148,9 @@ class Vid2Sheet:
|
|||||||
diff_sum = np.sum(frame_diff)
|
diff_sum = np.sum(frame_diff)
|
||||||
|
|
||||||
if diff_sum > change_threshold:
|
if diff_sum > change_threshold:
|
||||||
log.debug(
|
# log.debug(
|
||||||
f"Significant change found at frame {frame_count}, saving to {os.path.join(self.raw_dir, f"{img_output}")}"
|
# f"Significant change found at frame {frame_count}, saving to {os.path.join(self.raw_dir, f"{img_output}")}"
|
||||||
)
|
# )
|
||||||
cv2.imwrite(img_output, current_frame)
|
cv2.imwrite(img_output, current_frame)
|
||||||
count += 1
|
count += 1
|
||||||
|
|
||||||
@@ -159,10 +162,25 @@ class Vid2Sheet:
|
|||||||
self.video.release()
|
self.video.release()
|
||||||
log.info("Analysis complete")
|
log.info("Analysis complete")
|
||||||
|
|
||||||
def stitch(self, dpi=300):
|
def stitch(self, paper_size="A4", dpi=300):
|
||||||
log.info("Attempting to stitch by three for every group...")
|
log.info("Attempting to stitch by three for every group...")
|
||||||
letter_width = int(8.5 * dpi)
|
log.info(f"Chosen paper size: {paper_size}")
|
||||||
letter_height = int(11 * dpi)
|
|
||||||
|
paper_sizes = {
|
||||||
|
"letter": (8.5, 11),
|
||||||
|
"A4": (8.27, 11.69),
|
||||||
|
"legal": (8.5, 14),
|
||||||
|
"tabloid": (11, 17),
|
||||||
|
}
|
||||||
|
|
||||||
|
if paper_size in paper_sizes:
|
||||||
|
width_inches, height_inches = paper_sizes[paper_size]
|
||||||
|
else:
|
||||||
|
log.error(f"Unsupported paper size '{paper_size}'. Using default 'A4'.")
|
||||||
|
width_inches, height_inches = paper_sizes["A4"]
|
||||||
|
|
||||||
|
letter_width = int(width_inches * dpi)
|
||||||
|
letter_height = int(height_inches * dpi)
|
||||||
|
|
||||||
image_files = sorted(os.listdir(self.raw_dir))
|
image_files = sorted(os.listdir(self.raw_dir))
|
||||||
|
|
||||||
@@ -185,18 +203,22 @@ class Vid2Sheet:
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
img_height, img_width = img.shape[:2]
|
img_height, img_width = img.shape[:2]
|
||||||
|
|
||||||
scale_factor = min(
|
scale_factor = min(
|
||||||
letter_width / img_width, available_height / img_height
|
letter_width / img_width, available_height / img_height
|
||||||
)
|
)
|
||||||
|
|
||||||
resized_img_width = int(img_width * scale_factor)
|
resized_img_width = int(
|
||||||
resized_img_height = int(img_height * scale_factor)
|
img_width * scale_factor * 0.95
|
||||||
|
)
|
||||||
|
resized_img_height = int(img_height * scale_factor * 0.95)
|
||||||
resized_img = cv2.resize(img, (resized_img_width, resized_img_height))
|
resized_img = cv2.resize(img, (resized_img_width, resized_img_height))
|
||||||
|
|
||||||
x_offset = (letter_width - resized_img_width) // 2
|
x_offset = (letter_width - resized_img_width) // 2
|
||||||
y_offset = (
|
y_offset = int(
|
||||||
available_height - resized_img_height
|
(available_height - resized_img_height) // 2
|
||||||
) // 2 + i * available_height
|
+ i * available_height * 0.9
|
||||||
|
)
|
||||||
|
|
||||||
canvas[
|
canvas[
|
||||||
y_offset : y_offset + resized_img_height,
|
y_offset : y_offset + resized_img_height,
|
||||||
@@ -238,5 +260,5 @@ class Vid2Sheet:
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
vid2sheet = Vid2Sheet(src, dest, format, alt_temp, ignore_temp)
|
vid2sheet = Vid2Sheet(src, dest, img_format, alt_temp, ignore_temp)
|
||||||
vid2sheet.run()
|
vid2sheet.run()
|
||||||
|
|||||||
Reference in New Issue
Block a user