blob: 2a5c7292cfde1a379fd8cd1bc8b8468da3f7aa82 [file] [log] [blame]
Jim Ostrowskiff7b3de2022-01-22 22:20:26 -08001#ifndef Y2022_VISION_CAMERA_READER_H_
2#define Y2022_VISION_CAMERA_READER_H_
3
4#include <math.h>
5
6#include <opencv2/calib3d.hpp>
7#include <opencv2/features2d.hpp>
Henry Speiser1f34eea2022-01-30 14:35:21 -08008#include <opencv2/imgcodecs.hpp>
Jim Ostrowskiff7b3de2022-01-22 22:20:26 -08009#include <opencv2/imgproc.hpp>
10
Henry Speiser1f34eea2022-01-30 14:35:21 -080011#include "aos/events/shm_event_loop.h"
Jim Ostrowskiff7b3de2022-01-22 22:20:26 -080012#include "aos/flatbuffer_merge.h"
13#include "aos/network/team_number.h"
14#include "frc971/vision/v4l2_reader.h"
15#include "frc971/vision/vision_generated.h"
Jim Ostrowski007e2ea2022-01-30 13:13:26 -080016#include "y2022/vision/calibration_data.h"
17#include "y2022/vision/calibration_generated.h"
milind-u92195982022-01-22 20:29:31 -080018#include "y2022/vision/target_estimate_generated.h"
Jim Ostrowskiff7b3de2022-01-22 22:20:26 -080019
20namespace y2022 {
21namespace vision {
22
23using namespace frc971::vision;
24
25// TODO<Jim/Milind>: Need to add in senders to send out the blob data/stats
26
27class CameraReader {
28 public:
Henry Speiser1f34eea2022-01-30 14:35:21 -080029 CameraReader(aos::ShmEventLoop *event_loop,
Jim Ostrowski007e2ea2022-01-30 13:13:26 -080030 const calibration::CalibrationData *calibration_data,
31 V4L2Reader *reader)
Jim Ostrowskiff7b3de2022-01-22 22:20:26 -080032 : event_loop_(event_loop),
Jim Ostrowski007e2ea2022-01-30 13:13:26 -080033 calibration_data_(calibration_data),
Jim Ostrowskiff7b3de2022-01-22 22:20:26 -080034 camera_calibration_(FindCameraCalibration()),
35 reader_(reader),
36 image_sender_(event_loop->MakeSender<CameraImage>("/camera")),
milind-u92195982022-01-22 20:29:31 -080037 target_estimate_sender_(
38 event_loop->MakeSender<TargetEstimate>("/camera")),
Jim Ostrowskiff7b3de2022-01-22 22:20:26 -080039 read_image_timer_(event_loop->AddTimer([this]() { ReadImage(); })) {
40 event_loop->OnRun(
41 [this]() { read_image_timer_->Setup(event_loop_->monotonic_now()); });
42 }
43
44 private:
Jim Ostrowski007e2ea2022-01-30 13:13:26 -080045 const calibration::CameraCalibration *FindCameraCalibration() const;
Jim Ostrowskiff7b3de2022-01-22 22:20:26 -080046
47 // Processes an image (including sending the results).
Henry Speiser1f34eea2022-01-30 14:35:21 -080048 void ProcessImage(const cv::Mat &image);
Jim Ostrowskiff7b3de2022-01-22 22:20:26 -080049
50 // Reads an image, and then performs all of our processing on it.
51 void ReadImage();
52
53 cv::Mat CameraIntrinsics() const {
54 const cv::Mat result(3, 3, CV_32F,
55 const_cast<void *>(static_cast<const void *>(
56 camera_calibration_->intrinsics()->data())));
57 CHECK_EQ(result.total(), camera_calibration_->intrinsics()->size());
58 return result;
59 }
60
milind-u92195982022-01-22 20:29:31 -080061 cv::Mat CameraExtrinsics() const {
62 const cv::Mat result(
63 4, 4, CV_32F,
64 const_cast<void *>(static_cast<const void *>(
65 camera_calibration_->fixed_extrinsics()->data()->data())));
66 CHECK_EQ(result.total(),
67 camera_calibration_->fixed_extrinsics()->data()->size());
68 return result;
69 }
70
Jim Ostrowskiff7b3de2022-01-22 22:20:26 -080071 cv::Mat CameraDistCoeffs() const {
72 const cv::Mat result(5, 1, CV_32F,
73 const_cast<void *>(static_cast<const void *>(
74 camera_calibration_->dist_coeffs()->data())));
75 CHECK_EQ(result.total(), camera_calibration_->dist_coeffs()->size());
76 return result;
77 }
78
Henry Speiser1f34eea2022-01-30 14:35:21 -080079 aos::ShmEventLoop *const event_loop_;
Jim Ostrowski007e2ea2022-01-30 13:13:26 -080080 const calibration::CalibrationData *const calibration_data_;
81 const calibration::CameraCalibration *const camera_calibration_;
Jim Ostrowskiff7b3de2022-01-22 22:20:26 -080082 V4L2Reader *const reader_;
83 aos::Sender<CameraImage> image_sender_;
milind-u92195982022-01-22 20:29:31 -080084 aos::Sender<TargetEstimate> target_estimate_sender_;
Jim Ostrowskiff7b3de2022-01-22 22:20:26 -080085
milind-u92195982022-01-22 20:29:31 -080086 // We schedule this immediately to read an image. Having it on a timer
87 // means other things can run on the event loop in between.
Jim Ostrowskiff7b3de2022-01-22 22:20:26 -080088 aos::TimerHandler *const read_image_timer_;
89};
90
91} // namespace vision
92} // namespace y2022
93#endif // Y2022_VISION_CAMERA_READER_H_