Das Nachtleben des Himmels oder auf der Suche nach Perseiden - Verarbeitung

Kürzlich wurde auf Habré ein Artikel mit den Dreharbeiten zum Nachthimmel "Das Nachtleben des Himmels oder auf der Suche nach Perseiden" veröffentlicht. Die Autoren selbst konnten die Meteore aufgrund der großen Anzahl von Satelliten, die in diesem Fall falsche Objekte sind, jedoch nicht selbst erkennen. Ich konnte nicht vorbeikommen, ich entschied mich, das Video zu verarbeiten und zu sehen, ob Perseiden darauf sind oder nicht.

Zu Beginn habe ich mit dem Tool BackgroundCubtractorMOG2 von OpenCV ein Video ohne Sternhintergrund erstellt. Um die durch die Videokomprimierung verursachten Rauschreaktionen zu unterdrücken, habe ich auf jeden Frame einen Mittelungsfilter mit einem 3x3-Fenster angewendet und den Öffnungsvorgang auf das Bild von sich bewegenden Objekten angewendet, um kleine Reaktionen zu unterdrücken. Ohne vorläufige Filterung waren „Kontrolleure“ auf der Bewegungskarte deutlich sichtbar. Ich habe die ersten drei Frames aus der Verarbeitung entfernt, weil Der BackgroundSubtractorMOG2-Algorithmus auf ihnen hat noch keine Verkehrsinformationen gesammelt.

Code
int generate_meteor_lines() { cv::VideoCapture cap; cap.open(videoname); if(!cap.isOpened()) { printf("can not open video file\n"); return -1; } cv::namedWindow("foreground image", cv::WINDOW_NORMAL); cv::BackgroundSubtractorMOG2 bg_model; double learning_rate = 0.1; bg_model.setBool("detectShadows", false); bg_model.setDouble("backgroundRatio", 0.95); bg_model.setInt("history", 5); bg_model.setInt("fVarInit", 20); cv::Mat img, fgmask, fgimg; std::cerr << "\n"; for(int frames_count = 0;; ++frames_count) { cap >> img; if(img.empty()) { break; } cv::blur(img, img, cv::Size(3, 3)); if(fgimg.empty()) { fgimg.create(img.size(), img.type()); } bg_model(img, fgmask, learning_rate); fgimg = cv::Scalar::all(0); img.copyTo(fgimg, fgmask); cv::threshold(fgimg, fgimg, 20, 255, cv::THRESH_BINARY); cv::Mat mask(cv::Mat::ones(3, 3, CV_8UC1)); mask.at<char>(0, 0) = 0; mask.at<char>(2, 0) = 0; mask.at<char>(0, 2) = 0; mask.at<char>(2, 2) = 0; cv::erode(fgimg, fgimg, mask); cv::dilate(fgimg, fgimg, mask); if(frames_count > 3) { detect_lines(fgimg); } imshow("foreground image", fgimg); std::cerr << "Frame ##" << frames_count << "\n"; char k = (char)cv::waitKey(30); if(k == 27) { break; } } return 0; } 


Video nach dem Subtrahieren des Hintergrunds


Nach dem Betrachten wurde klar, dass das Video Meteore enthält, aber ihre Geschwindigkeit ist viel höher (laut Wikipedia beträgt die scheinbare Geschwindigkeit des Perseiden-Meteors etwa 59 km / s) als die Geschwindigkeit von Satelliten, und sie erscheinen auf einem oder zwei aufeinanderfolgenden Bildern in Form einer kurzen Linie. Das Auge hat also einfach keine Zeit, vor dem Hintergrund heller Sterne auf sie zu reagieren.

Meteor nach Abzug des Hintergrunds
Meteor


Um die Suche nach Meteoren zu vereinfachen, habe ich einen einfachen Detektor basierend auf der Hough-Transformation erstellt, der Meteore im Originalvideo hervorhebt.

Code
 std::vector<cv::Vec4i> detect_lines(cv::Mat& img) { cv::Mat coi; std::vector<cv::Vec4i> lines; cv::extractChannel(img, coi, 0); double rho_res = 1; double theta_res = CV_PI / 180; double ithreshold = 50; double minLinLength = 50; double maxLineGap = 2; cv::HoughLinesP(coi, lines, rho_res, theta_res, ithreshold, minLinLength, maxLineGap); draw_line_circles(lines, img); return lines; } 



Und selbst bei Hintergrundbeleuchtung ist es schwer zu erkennen, ob es einen Meteor gab oder nicht. Nur im Standbildmodus. Nachdem wir jedoch alle Spuren von Meteoren auf das Hintergrundbild angewendet haben, erhalten wir ein ganzheitlicheres Bild. Es ist zu sehen, dass die meisten Objekte von rechts unten im Bild "fliegen".

Alle erkannten Meteore



Aber gibt es wirklich das Sternbild Perseus?
Ich bin kein starker Kenner des Sternenhimmels, deshalb habe ich einen Screenshot aus dem Stellarium-Programm mit den Perseiden im Zentrum gemacht. Ich habe manuell eine Anzahl von Sternen ausgewählt, die ich mit dem „durchschnittlichen“ Hintergrundbild aus dem Video und einem Screenshot aus dem Stellarium vergleichen kann. Basierend auf den Koordinaten der Verbindungspunkte habe ich ein zweidimensionales Polynom dritten Grades erstellt und die Position der Perseidenquelle vom Referenzbild bis zum Hintergrund des Videos gezählt. Zu meiner Überraschung stellte sich heraus, dass sich die Perseidenquelle in der unteren rechten Ecke befand.

'Referenzhimmel' mit Sternchen



Bild von Perseiden mit Sternetiketten



Die Autoren des Artikels suchten also nicht umsonst. Perseiden waren!

Source: https://habr.com/ru/post/de421463/


All Articles