
最近在哈布雷(Habré)发表了一篇关于拍摄夜空的文章
“天堂的夜生活或寻找英仙座的人” 。 但是由于大量的卫星(在这种情况下是假物体),作者自己无法检测到流星。 我无法通过,我决定处理视频,然后看是否有英仙座。
首先,我使用OpenCV的BackgroundCubtractorMOG2工具制作了没有星空背景的视频。 为了抑制视频压缩引起的“噪点”响应,我对每个帧应用了一个3x3窗口的平均滤波器,并对运动对象的图像应用了
打开操作以抑制较小的响应。 如果不进行初步过滤,则“跳棋”在运动图上清晰可见。 我从处理中删除了前三帧,因为 它们上的BackgroundSubtractorMOG2算法尚未累积交通信息。
代号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; }
观看后很明显视频中有流星,但是它们的速度比卫星的速度高得多(根据
Wikipedia ,英仙座流星的视在速度约为59 km / s),它们以短线的形式出现在一两个连续的帧中。 因此,眼睛根本没有时间在明亮的恒星背景下对它们做出反应。
此外,为了使搜索流星更加方便,我基于霍夫变换制作了一个简单的探测器,该探测器在原始视频中突出显示了流星。
代号 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; }
即使有背光,也很难看是否有流星。 仅在冻结帧模式下查看。 但是在将流星的所有痕迹应用到背景图像之后,我们得到了更全面的图像。 可以看到,大多数对象都是从图像的右下方“飞行”。
但是,真的有英仙座吗?
我不是繁星点点的鉴赏家,所以我以英仙座为中心拍摄了
Stellarium程序的屏幕截图。 我手动选择了一些可以在视频的“平均”背景图像上进行匹配的星星,以及从Stellarium的屏幕截图中进行匹配的星星。 根据联系点的坐标,我建立了一个三次三次的二维多项式,并计算了从参考图像到视频背景的英仙座源的位置。 令我惊讶的是,英仙座的来源竟然在右下角。
因此,本文的作者并没有徒劳地寻找。 英仙座们!