blob: 98b1f34c24e8acc8118ebd512fc6ba8433a39a1e [file] [log] [blame]
Austin Schuh99f7c6a2024-06-25 22:07:44 -07001#include "absl/flags/flag.h"
James Kuszmaul8ae931a2020-03-06 19:45:02 -08002#include <opencv2/calib3d.hpp>
3#include <opencv2/features2d.hpp>
4#include <opencv2/highgui/highgui.hpp>
5#include <opencv2/imgproc.hpp>
6
Austin Schuhb06f03b2021-02-17 22:00:37 -08007#include "aos/events/logging/log_reader.h"
James Kuszmaul8ae931a2020-03-06 19:45:02 -08008#include "aos/events/simulated_event_loop.h"
9#include "aos/init.h"
Jim Ostrowski977850f2022-01-22 21:04:22 -080010#include "frc971/vision/vision_generated.h"
James Kuszmaul8ae931a2020-03-06 19:45:02 -080011
Austin Schuh99f7c6a2024-06-25 22:07:44 -070012ABSL_FLAG(std::string, node, "pi1", "Node name to replay.");
13ABSL_FLAG(std::string, image_save_prefix, "/tmp/img",
14 "Prefix to use for saving images from the logfile.");
James Kuszmaul8ae931a2020-03-06 19:45:02 -080015
Stephan Pleinesf63bde82024-01-13 15:59:33 -080016namespace frc971::vision {
James Kuszmaul8ae931a2020-03-06 19:45:02 -080017namespace {
18
James Kuszmaul45671272021-08-01 20:42:53 -070019void ViewerMain(int argc, char *argv[]) {
James Kuszmaul45671272021-08-01 20:42:53 -070020 // open logfiles
Austin Schuhc1609732023-06-26 11:51:28 -070021 aos::logger::LogReader reader(
22 aos::logger::SortParts(aos::logger::FindLogs(argc, argv)));
James Kuszmaul8ae931a2020-03-06 19:45:02 -080023 reader.Register();
24 const aos::Node *node = nullptr;
25 if (aos::configuration::MultiNode(reader.configuration())) {
Austin Schuh99f7c6a2024-06-25 22:07:44 -070026 node = aos::configuration::GetNode(reader.configuration(),
27 absl::GetFlag(FLAGS_node));
James Kuszmaul8ae931a2020-03-06 19:45:02 -080028 }
29 std::unique_ptr<aos::EventLoop> event_loop =
30 reader.event_loop_factory()->MakeEventLoop("player", node);
31
James Kuszmaul3a49a532020-03-06 21:06:38 -080032 int image_count = 0;
33 event_loop->MakeWatcher("/camera", [&image_count](const CameraImage &image) {
James Kuszmaul8ae931a2020-03-06 19:45:02 -080034 cv::Mat image_mat(image.rows(), image.cols(), CV_8U);
35 CHECK(image_mat.isContinuous());
36 const int number_pixels = image.rows() * image.cols();
37 for (int i = 0; i < number_pixels; ++i) {
38 reinterpret_cast<uint8_t *>(image_mat.data)[i] =
39 image.data()->data()[i * 2];
40 }
41
42 cv::imshow("Display", image_mat);
Austin Schuh99f7c6a2024-06-25 22:07:44 -070043 if (!absl::GetFlag(FLAGS_image_save_prefix).empty()) {
James Kuszmaul3a49a532020-03-06 21:06:38 -080044 cv::imwrite("/tmp/img" + std::to_string(image_count++) + ".png",
45 image_mat);
46 }
James Kuszmaul8ae931a2020-03-06 19:45:02 -080047 cv::waitKey(1);
48 });
49
50 reader.event_loop_factory()->Run();
51}
52
53} // namespace
Stephan Pleinesf63bde82024-01-13 15:59:33 -080054} // namespace frc971::vision
James Kuszmaul8ae931a2020-03-06 19:45:02 -080055
56// Quick and lightweight grayscale viewer for images
57int main(int argc, char **argv) {
58 aos::InitGoogle(&argc, &argv);
James Kuszmaul45671272021-08-01 20:42:53 -070059 frc971::vision::ViewerMain(argc, argv);
James Kuszmaul8ae931a2020-03-06 19:45:02 -080060}