beilage zu: check­ins

wie ich’s ge­macht habe:

alle bil­der in ei­nen ord­ner si­chern (1.jpg, 2.jpg, etc).

brew install ffmpeg

python3 -m venv baumenv

source baumenv/bin/activate

install opencv-python numpy

chmod +x align_tree.py

python3 align_tree.py

ffmpeg -framerate 3 -i aligned/frame_%04d.jpg -vf "crop=1300:1300:250:50" -c:v libx264 -pix_fmt yuv420p baum_square1.mp4

ali­gn_tree.py

import cv2
import numpy as np
from pathlib import Path

input_dir = Path(".")
output_dir = Path("aligned")
output_dir.mkdir(exist_ok=True)

# JPGs numerisch sortieren: 1.jpg, 5.jpg, 10.jpg, ...
files = sorted(
    input_dir.glob("*.jpg"),
    key=lambda p: int(p.stem)
)

if not files:
    raise RuntimeError("Keine JPG-Dateien gefunden.")

# Erstes Bild als Referenz
ref = cv2.imread(str(files[0]))
if ref is None:
    raise RuntimeError(f"Konnte Referenzbild nicht laden: {files[0]}")

h, w = ref.shape[:2]
ref_gray = cv2.cvtColor(ref, cv2.COLOR_BGR2GRAY)
ref_gray = cv2.GaussianBlur(ref_gray, (5, 5), 0)

cv2.imwrite(str(output_dir / "frame_0001.jpg"), ref)

for i, path in enumerate(files[1:], start=2):
    img = cv2.imread(str(path))

    if img is None:
        print(f"Überspringe {path.name}: konnte nicht geladen werden")
        continue

    img = cv2.resize(img, (w, h))
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray, (5, 5), 0)

    # MOTION_EUCLIDEAN = nur Rotation + Verschiebung, keine Verzerrung
    warp = np.eye(2, 3, dtype=np.float32)

    try:
        cc, warp = cv2.findTransformECC(
            ref_gray,
            gray,
            warp,
            cv2.MOTION_EUCLIDEAN,
            (
                cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT,
                3000,
                1e-6
            )
        )

        aligned = cv2.warpAffine(
            img,
            warp,
            (w, h),
            flags=cv2.INTER_LINEAR + cv2.WARP_INVERSE_MAP,
            borderMode=cv2.BORDER_CONSTANT,
            borderValue=(0, 0, 0)
        )

        print(f"{path.name} -> frame_{i:04d}.jpg   cc={cc:.4f}")

    except cv2.error as e:
        print(f"Ausrichtung fehlgeschlagen bei {path.name}; verwende Original.")
        aligned = img

    out = output_dir / f"frame_{i:04d}.jpg"
    cv2.imwrite(str(out), aligned, [cv2.IMWRITE_JPEG_QUALITY, 95])

print("Fertig.")
statistisches

dieser artikel wurde vor 3 wochen und 4 stunden veröffentlicht und zuletzt vor 2 wochen und 6 tagen geändert. er hat 8 reaktionen gesammelt und es wurden bis jetzt 580 aufrufe erfasst.

8 reaktionen

diesen beitrag habe ich auf mastodon und bluesky weiterveröffentlicht und dort kann er auch kommentiert oder gefavt werden. hier gibts ein kommentar-formular. er ist auch in der ATmosphere veröffentlicht und kann zum beispiel im standard-reader gelesen oder gefavt werden. über einen vote auf bubbles würde ich mich freuen. ich freue mich auch über kommentare per e-mail. die likes, kommentare oder erwähnungen sammle ich u.a. aus diesen weiterveröffentlichten beiträgen wieder ein. kommentare per e-mail veröffentliche ich nicht.

1 erwähnung