Stap 3: automatische synchronisatie – poging 1

Eerste poging: automatische detectie van beeldverandering, gebaseerd op beeldanalyse in software.

Ik had nog geen ervaring met software-ontwikkeling voor realtime beeldprocessing.  Hiervoor waren er 2 mogelijke benaderingen: gebruik maken van het GStreamer framework onder Linux, of gebruik maken van de Windows DirectShow SDK.  Met de eerste is er heel wat ervaring in Barco.  DirectShow aan de andere kant, leek ook goed gedocumenteerd in forums op internet, met een aantal voorbeeld applicaties...  Bovendien ben ik het beste thuis in videobewerking op een Windows PC.  Vandaar mijn keuze voor de Windows DirectShow SDK.

Vandaag is Microsoft Visual Studio 2012 Express gratis beschikbaar; kan rechtstreeks van Microsoft gedownload worden.  Ook de Microsoft Windows SDK v7.1, waarin de DirectShow library zit, kan vrij van bij Microsoft gedownload worden.

In de online MSDN library is heel veel gedocumenteerd over DirectShow en COM programming.  Bovendien zijn er een aantal mooie voorbeeldjes beschikbaar, waarop we kunnen verderwerken.

Mijn eerste poging was het aanpassen van de EZRGB24 DirectShow filter (die tussen de SDK voorbeelden zat), om automatisch beeldveranderingen te detecteren.

Eerste algoritme voor het detecteren van beeldverandering = het berekenen van de gemiddelde waarde van alle pixels.  Als deze gemiddelde waarde verandert, is het beeld veranderd.

Deze methode is niet waterdicht, maar is misschien voldoende om een “fuzzy logic” software-PLL aan te sturen, die moet locken op de beeldveranderingen, en de tijdstippen aanduiden welke beelden wel stabiel zijn – zodat we die frames kunnen wegschrijven.

Om de frames weg te schrijven, maak ik gebruik van een open source JPEG compressie bibliotheek: jpge.cpp - C++ class for JPEG compression, Public domain, by Rich Geldreich. (zie: https://code.google.com/p/jpeg-compressor/ )

Elk beeldje wordt weggeschreven naar een JPG file, met automatische nummering.

 

Dankzij deze oefening heb ik veel ervaring opgedaan met het programmeren onder Windows, gebruik makend van COM en DirectShow, en multithreading.

Helaas werd het duidelijk dat het uitgangspunt om me enkel op video-veranderingen te baseren, te optimistisch was.  Het is te complex, en wellicht niet realistisch, om een fuzzy logic – software PLL te ontwikkelen, die daarenboven al na een paar beeldwisselingen perfect gelockt en in fase moet zijn, en slechts een onrealistisch lage jitter mag vertonen...  Die synchronisatie kreeg ik niet stabiel.

 

Een andere approach is dus nodig voor de synchronisatie.