Allgemeine Beschreibung

Der Code „VideoNoiseDetector“ dient zur Analyse von Videos auf Bildrauschen. Er wurde aus einem ursprünglichen Skript in eine Klassenstruktur überführt. Der Nutzer startet die Analyse, indem er den Pfad zu einem Video eingibt. Das Programm untersucht jedes Bild des Videos und sucht nach Gesichtern. Gefundene Gesichter werden in kleinere Bereiche aufgeteilt, um Rauschen zu prüfen.

Funktionsweise

Das Programm erkennt Bereiche mit starkem Rauschen, also vielen Pixelunterschieden. Diese Stellen werden mit roten Rechtecken im Video markiert. Das bearbeitete Video wird im Ordner „analyse/video“ abgespeichert. Während der Verarbeitung zeigt ein Fenster die aktuellen Bilder live an. Nach der Analyse gibt es eine Zusammenfassung der Rauschmenge. Ein Diagramm zeigt, an welchen Stellen im Video das meiste Rauschen auftrat.

Technische Grundlagen

Der Code verwendet Python und gängige Bibliotheken wie OpenCV, NumPy und Matplotlib. Er ist so gestaltet, dass er effizient arbeitet und wenig Speicher beansprucht. Die Gesichtserkennung basiert auf einer vordefinierten OpenCV-Datei. Die Rauschanalyse erfolgt durch Vergleich der Pixelwerte in den Gesichtsbereichen.

Mögliche Einsatzbereiche

Der Code kann zur Qualitätsprüfung von Überwachungsaufnahmen genutzt werden. Er eignet sich auch, um Veränderungen in Videos zu erkennen, etwa durch Bearbeitung. Für private Anwendungen kann er alte Videos untersuchen. Die Analyse ist auf einfache Szenarien ausgelegt und nicht für komplexe Bearbeitungen optimiert.

Installation und Nutzung

Die Installation erfordert das Herunterladen der Bibliotheken OpenCV, NumPy und Matplotlib über pip. Danach speichert man den Code in eine Datei, z. B. „video_noise_detector.py“. Zum Starten führt man das Skript aus und gibt den Pfad zu einem Video ein. Das Programm erstellt dann das Analysevideo und zeigt die Ergebnisse an.

Einschränkungen

Der Code funktioniert am besten mit Videos, die klare Gesichter enthalten. Ohne Gesichter wird keine Rauschanalyse durchgeführt. Die Genauigkeit hängt von der Videoqualität und den Einstellungen ab. Er ist nicht für Echtzeitverarbeitung oder sehr große Dateien optimiert.

Quellcode

import cv2
import numpy as np
import os
from matplotlib import pyplot as plt
from typing import Tuple, List

class VideoNoiseDetector:
    def __init__(self, video_path: str, threshold: float = 1.5, grid_size: Tuple[int, int] = (50, 50), 
                 top_n_frames: int = 5):
        self.video_path = video_path
        self.threshold = threshold
        self.grid_size = grid_size
        self.top_n_frames = top_n_frames
        self.face_cascade = cv2.CascadeClassifier(
            cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
        )
        self.output_folder = "analyse/video"

    def _process_frame(self, frame: np.ndarray) -> Tuple[List, np.ndarray]:
        """Verarbeitet einen einzelnen Frame und markiert Rauschbereiche."""
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        faces = self.face_cascade.detectMultiScale(gray, 1.3, 5)
        noise_frames = []

        if len(faces) > 0:
            # Nur größtes Gesicht verwenden
            x, y, w, h = max(faces, key=lambda f: f[2] * f[3])
            face_roi = frame[y:y+h, x:x+w]
            
            # Effizientere Regionenaufteilung
            h_step, w_step = h // self.grid_size[0], w // self.grid_size[1]
            std_devs = np.zeros(self.grid_size)
            
            for i in range(self.grid_size[0]):
                for j in range(self.grid_size[1]):
                    region = face_roi[i*h_step:(i+1)*h_step, j*w_step:(j+1)*w_step]
                    std_devs[i, j] = np.std(region)

            face_avg_noise = np.mean(std_devs)
            noisy_regions = np.where(std_devs > self.threshold * face_avg_noise)
            
            for i, j in zip(*noisy_regions):
                noise_frames.append((i, j, (x, y, w, h)))
                x_start = x + j * w_step
                y_start = y + i * h_step
                cv2.rectangle(frame, (x_start, y_start), 
                            (x_start + w_step, y_start + h_step), 
                            (0, 0, 255), 2)

        return noise_frames, frame

    def analyze(self) -> None:
        """Analysiert das Video und speichert die Ergebnisse."""
        os.makedirs(self.output_folder, exist_ok=True)
        
        cap = cv2.VideoCapture(self.video_path)
        if not cap.isOpened():
            raise ValueError("Konnte Video nicht öffnen")
            
        fps = cap.get(cv2.CAP_PROP_FPS)
        frame_size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), 
                     int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
        total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

        # Video Writer Setup
        file_name = os.path.splitext(os.path.basename(self.video_path))[0]
        output_path = os.path.join(self.output_folder, f"{file_name}_analyzed.mp4")
        fourcc = cv2.VideoWriter_fourcc(*'mp4v')
        out = cv2.VideoWriter(output_path, fourcc, fps, frame_size)

        frame_number = 0
        total_noise_frames = 0
        noise_counts = np.zeros(total_frames)
        top_frames = []

        while True:
            ret, frame = cap.read()
            if not ret:
                break

            noise_frames, annotated_frame = self._process_frame(frame.copy())
            noise_count = len(noise_frames)
            
            # Text overlay
            cv2.putText(annotated_frame, f"Pixelrauschen: {noise_count}", 
                       (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
            
            out.write(annotated_frame)
            cv2.imshow("Frame", annotated_frame)
            
            # Statistiken
            total_noise_frames += noise_count
            noise_counts[frame_number] = noise_count
            if noise_count > 0:
                top_frames.append((frame_number, noise_count))
            
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
                
            frame_number += 1

        # Cleanup
        cap.release()
        out.release()
        cv2.destroyAllWindows()

        # Ergebnisse ausgeben
        self._print_results(total_frames, total_noise_frames, fps, output_path, top_frames)
        self._plot_noise_distribution(noise_counts)

    def _print_results(self, total_frames: int, total_noise: int, fps: float, 
                      output_path: str, top_frames: List) -> None:
        """Gibt die Analyseergebnisse aus."""
        print(f"Analysevideo gespeichert unter: {output_path}")
        print(f"Durchschnittliche Rauschframes pro Frame: {total_noise/total_frames:.2f}")
        print(f"Durchschnittliche Rauschframes pro Sekunde: {total_noise/fps:.2f}")
        
        print(f"\nTop {self.top_n_frames} Frames mit meisten Auffälligkeiten:")
        for frame_num, count in sorted(top_frames, key=lambda x: x[1], reverse=True)[:self.top_n_frames]:
            print(f"Frame {frame_num}: {count} Auffälligkeiten")

    def _plot_noise_distribution(self, noise_counts: np.ndarray) -> None:
        """Zeichnet die Rauschverteilung."""
        plt.plot(noise_counts)
        plt.xlabel('Frame Nummer')
        plt.ylabel('Anzahl Auffälligkeiten')
        plt.title('Zeitliche Verteilung der Auffälligkeiten')
        plt.grid(True)
        plt.show()

def main():
    video_path = input("Geben Sie den Pfad zur Videodatei ein: ")
    detector = VideoNoiseDetector(video_path)
    detector.analyze()

if __name__ == "__main__":
    main()

Installationsanleitung für den VideoNoiseDetector

Voraussetzungen

Für die Nutzung des Codes wird Python 3.8 oder höher benötigt. Eine funktionierende Videodatei (z. B. im MP4-Format) muss vorhanden sein. Optional kann ein Texteditor oder eine IDE wie PyCharm oder VS Code verwendet werden. Das Betriebssystem kann Windows, Linux oder macOS sein.

Python überprüfen

Prüfen Sie, ob Python installiert ist, indem Sie in der Kommandozeile oder im Terminal folgendes eingeben:

  • python –version oder python3 –version Falls Python fehlt, laden Sie es von python.org herunter und installieren Sie es gemäß den Anweisungen für Ihr System.

Virtuelle Umgebung erstellen (optional)

Eine virtuelle Umgebung hält Abhängigkeiten isoliert. Erstellen Sie sie mit:

  • python -m venv venv Aktivieren Sie die Umgebung:
  • Unter Windows: venv\Scripts\activate
  • Unter Linux/Mac: source venv/bin/activate Nach der Aktivierung erscheint der Umgebungsname in der Kommandozeile.

Bibliotheken installieren

Die benötigten Bibliotheken werden mit pip installiert. Führen Sie folgenden Befehl aus:

  • pip install opencv-python numpy matplotlib Dies installiert:
  • opencv-python: Für die Video- und Bildverarbeitung
  • numpy: Für numerische Berechnungen
  • matplotlib: Für Diagramme Stellen Sie sicher, dass die Installation ohne Fehler abläuft.

Code vorbereiten

Kopieren Sie den „VideoNoiseDetector“-Code in eine Datei, z. B. video_noise_detector.py. Speichern Sie diese in einem Verzeichnis Ihrer Wahl. Navigieren Sie in der Kommandozeile zu diesem Verzeichnis mit:

  • cd /pfad/zu/ihrem/verzeichnis

OpenCV Haar-Cascade-Datei

Der Code nutzt die Datei haarcascade_frontalface_default.xml, die mit opencv-python geliefert wird. Kein zusätzlicher Download ist nötig, solange die Bibliothek korrekt installiert ist.

Programm starten

Führen Sie das Skript aus mit:

  • python video_noise_detector.py Geben Sie den Pfad zu einer Videodatei ein, wenn Sie dazu aufgefordert werden. Das Programm analysiert das Video und speichert die Ergebnisse.

Betriebssystem-spezifische Hinweise

  • Windows: Keine zusätzlichen Schritte nötig.
  • Linux: Eventuell müssen Systempakete installiert werden, z. B. mit sudo apt-get install libopencv-dev.
  • Mac: Installieren Sie ggf. Abhängigkeiten mit Homebrew: brew install libpng jpeg.

Fehlerbehebung

  • Falls pip install opencv-python fehlschlägt, versuchen Sie pip install opencv-contrib-python.
  • Bei Problemen mit dem Video überprüfen Sie den Dateipfad und das Format (z. B. MP4, AVI).
  • Stellen Sie sicher, dass die Kommandozeile im richtigen Verzeichnis ist.

Testen der Installation

Bereiten Sie eine kurze Videodatei vor. Starten Sie das Skript und geben Sie den Pfad ein. Das Programm erstellt ein Analysevideo, zeigt Statistiken an und öffnet ein Diagramm. Bei Fehlern prüfen Sie die Konsolenausgabe.

Deinstallation (falls nötig)

Entfernen Sie die Bibliotheken mit:

  • pip uninstall opencv-python numpy matplotlib Deaktivieren Sie die virtuelle Umgebung mit deactivate.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert