Blogs / Hoe detecteer ik meteoren?

09-04-2020, auteur: stuntman

Zoals ik had beschreven in de blogpost 'Is het een meteoor?' gebruik ik voor het detecteren van meteoren de Hough-lijn-transformatie techniek die beschreven staat in het 'A new meteor detection algorithm for shuttered photography' white-paper van Berénice Reffet, Jérémie Vaubaillon en François Colas. In onderstaand artikel wat meer informatie over de hele gang van mijn camera tot deze website.

De camera die ik gebruik is een Hikvision 8MP, 2.8mm IP-camera, om precies te zijn de DS-2CD2T85FWD-I5(B) met firmware versie 5.6.4 build 191224. Dit is een relatief goedkope 'beveilingscamera' en dus geen professionele 'sterrenkijker' zoals bijvoorbeeld de gekoelde ZWO ASI series. De reden dat ik deze camera gebruik is gemak en nieuwsgierigheid tot waartoe de 'nieuwere' IP camera's instaat zijn. Beveilingscamera's zijn vaak 'waterdicht', je hoeft je dus niet druk te maken om een extra behuizing met verwarming etc. Ook kun je dit soort beveilingscamera's voeden via 'Power over Ethernet' oftewel PoE waardoor je meer vrij bent met het plaatsen van de camera. Met kwaliteits ethernet-kabels en een goede PoE switch kun je met gemak 100 meter uitrollen en vaak zelfs nog meer, dit is een groot voordeel tegenover USB wat de 'professionele' camera's vaak enkel en alleen ondersteunen. Mijn camera heb ik gemonteerd aan de achterkant van mijn woning in Ulrum, direct boven de keukendeur en wijzend naar het westen onder een hoek van ongeveer 40 graden.

Deze camera ondersteund zoals het hoort het RTSP protocol en heeft de mogelijkheid vanuit de firmware elke seconde een foto naar een SFTP server te uploaden. De minimale sluitertijd van deze camera is ⅓ van een seconde en met de huidige firmware schakelt de camera automatisch naar deze sluitertijd bij te weinig licht, na zonsondergang dus. Overdag is het niet mogelijk deze sluitertijd te gebruiken en staat hij standaard ingesteld op 20 FPS.

Het is mogelijk de videostream te gebruiken voor meteorendetectie echter gebruik ik tot op heden enkel nog de foto's die de camera elke seconde naar mijn FTP server upload. Als ik meer tevreden ben over mijn software implementatie is het relatief eenvoudig om te bouwen naar videostream detectie zodat ik ook bewegende beelden van de gedetecteerde meteoren kan delen. Thuis gebruik ik uitsluitend Linux machines en heb ik een SFTP server draaien naar een ramdisk op een Debian server. Middels Python en de pyinotify bibliotheek krijg ik van de kernel een signaal als er een nieuw bestand in de ramdisk-map is geschreven (IN_CLOSE_WRITE). Dit fotobestand kan nu geanalyseerd worden op mogelijke vuurballen en dat gaat als volgt:

Middels de OpenCV bibliotheek maak ik een kopie en knip ik de datum/tijd van de foto door de bovenste rij van 12 pixels te verwijderen, vervolgens word de foto omgezet naar een zwart/wit foto en word de foto verkleind voor snellere verwerking. Daarna gaat er een 'blur' filter over de foto om mogelijke randen minder scherp te maken en vervolgens gaat er een 'Canny' algoritme over de foto om eventuele randen te detecteren. Hierna is het Hough-lijn-transformatie algoritme aan de beurt om te speuren naar 'strakke' lijnen, om precies te zijn gebruik ik de probabilistic variant van de 'hough-lijn' methode, deze is vele malen sneller maar geeft helaas ook minder informatie over de gevonden lijnen. Hieronder een stukje basis Python code voor je eerste vuurboldetectie:

Bestandsnaam: mijn-eerste-meteoor-detectie.py

#!/usr/bin/env python3
import cv2 as cv,numpy as np

# Het openen van je foto en sla deze op in de variable 'image':
image = cv.imread('./path/naar/je/bestand.jpg')

# Maak een kopie in grijstinten en sla deze op in de variable 'gray':
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)

# Blur de foto een beetje voor betere Canny detectie:
blur = cv.GaussianBlur(gray, (5,5), 0)

# Laat het Canny randen detectie algo los op je geblurde foto:
canny = cv.Canny(blur, 100, 200, 3)

# En nu het Hough-lijn algoritme over de canny bewerking:
meteoren = cv.HoughLinesP(canny, 1, np.pi/180, 25, minLineLength=50, maxLineGap=5)

if meteoren is not None:
  print('Ik heb mogelijk een meteoor gevonden!')
else:
  print('Helaas, volgende keer beter ;)')

Sla de foto op in dezelfde directory als bovenstaand script en maak het script-bestand 'executable' met het commando: chmod +x ./mijn-eerste-meteoor-detectie.py

Vaak vindt de hough-lijn methode meerdere lijnen voor 1 meteoor en dit is een probleem. Je kunt dan namelijk niet betrouwbaar de lijn lengte uitrekenen van gedetecteerde meteoren. Door het samenvoegen van dichtbij elkaar staande en in dezelfde hoek wijzende lijnen krijg je een betrouwbaarder beeld en kun je de lijn-lengte extraheren. Op deze manier is het ook mogelijk om meer dan 1 meteoor in dezelfde foto te ontdekken, helaas heb ik dat geluk nog niet gehad :) Foto's met gedetecteerde meteoren sla ik vervolgens op in een aparte directory onderverdeeld in dag, maand, jaar. Tot zover de real-time detectie. Hierna gebruik ik verschillende Python en Bash scripts voor nadere analyse, experimenten en het vullen van een SQLite database met de gevonden informatie zoals datum, tijd, lijn-lengte en aantal detecties. Deze database word gebruikt op deze website om snel het meteorenarchief te kunnen opbouwen. SQLite kan bij juist gebruik makkelijk met miljoenen regels werken, een aparte database-server is dus voor huis-tuin-en-keuken detectie niet nodig.

De website zelf is gemaakt middels HTML5, W3-CSS, JavaScript, PHP en draait op Debian in een Docker omgeving op NGINX en een PHP-FPM container. Ik probeer alles zo modulair mogelijk op te zetten zodat ik later gemakkelijk meerdere camera's kan toevoegen. Mocht je bovenstaand artikel leuk of interessant vinden bookmark deze website dan en kom regelmatig terug voor ontwikkelingen en de laatste meteoordetecties.