blob: 073f8e5b23c1ed85b32e0b9057f2ed76db9f8578 [file] [log] [blame]
Parker Schuh9ef66132017-03-05 16:18:36 -08001#include <iostream>
2
Philipp Schrader790cb542023-07-05 21:06:52 -07003#include <Eigen/Dense>
Parker Schuh9ef66132017-03-05 16:18:36 -08004
5#include "aos/vision/blob/move_scale.h"
6#include "aos/vision/blob/stream_view.h"
7#include "aos/vision/blob/transpose.h"
8#include "aos/vision/debug/debug_framework.h"
9#include "aos/vision/math/vector.h"
Philipp Schrader790cb542023-07-05 21:06:52 -070010#include "y2017/vision/target_finder.h"
Parker Schuh9ef66132017-03-05 16:18:36 -080011
Parker Schuh9ef66132017-03-05 16:18:36 -080012using aos::vision::BlobList;
Philipp Schrader790cb542023-07-05 21:06:52 -070013using aos::vision::ImageFormat;
14using aos::vision::ImageRange;
15using aos::vision::RangeImage;
Parker Schuh9ef66132017-03-05 16:18:36 -080016
Stephan Pleinesf63bde82024-01-13 15:59:33 -080017namespace y2017::vision {
Parker Schuh9ef66132017-03-05 16:18:36 -080018
19BlobList RenderTargetListShifted(const std::vector<TargetComponent> &list) {
20 BlobList out;
21 for (const auto &entity : list) {
22 out.emplace_back(entity.RenderShifted());
23 }
24 return out;
25}
26
27RangeImage TargetComponent::RenderShifted() const {
28 std::vector<std::vector<ImageRange>> out_range_list;
29 int y = 0;
30 double max_y = -b / (2 * a);
31 double parab_off = max_y * max_y * a + max_y * b;
32 RangeImage t_img = Transpose(*img);
33 for (const auto &row : t_img) {
34 int off = -(y * y * a + y * b - parab_off);
35 // int off = 0;
36 // fprintf(stderr, "off: %d %d\n", off, y);
37 std::vector<ImageRange> row_out;
38 for (const ImageRange &range : row) {
39 row_out.emplace_back(ImageRange{off + range.st, off + range.ed});
40 }
41 ++y;
42 out_range_list.emplace_back(std::move(row_out));
43 }
44 return RangeImage(t_img.min_y(), std::move(out_range_list));
45}
46
47class FilterHarnessExample : public aos::vision::FilterHarness {
48 public:
49 aos::vision::RangeImage Threshold(aos::vision::ImagePtr image) override {
50 return finder_.Threshold(image);
51 }
52
53 void InstallViewer(aos::vision::BlobStreamViewer *viewer) override {
54 viewer_ = viewer;
55 viewer_->SetScale(0.5);
56 overlays_.push_back(&overlay_);
57 overlays_.push_back(finder_.GetOverlay());
58 viewer_->view()->SetOverlays(&overlays_);
59 }
60
61 bool HandleBlobs(BlobList imgs, ImageFormat /*fmt*/) override {
62 // reset for next drawing cycle
63 for (auto &overlay : overlays_) {
64 overlay->Reset();
65 }
66
67 // Remove bad blobs.
68 finder_.PreFilter(imgs);
69
70 // calculate each component/
71 std::vector<TargetComponent> target_component_list =
72 finder_.FillTargetComponentList(imgs);
73
74 DrawComponents(target_component_list);
75
76 // Put the compenents together into targets and pick the best.
77 Target final_target;
78 bool found_target =
79 finder_.FindTargetFromComponents(target_component_list, &final_target);
80
81 // BlobList newImg = RenderTargetListShifted(target_component_list);
82 if (viewer_) {
83 viewer_->DrawBlobList(imgs, {0, 0, 255});
84 }
85
86 if (found_target) {
87 BlobList list;
88 list.emplace_back(*(final_target.comp1.img));
89 list.emplace_back(*(final_target.comp2.img));
90 viewer_->DrawBlobList(list, {0, 255, 0});
91 overlay_.DrawCross(final_target.screen_coord, 25, {255, 255, 255});
92 }
93
94 // No targets.
95 return found_target;
96 }
97
98 void DrawComponents(const std::vector<TargetComponent> comp) {
99 for (const TargetComponent &t : comp) {
100 aos::vision::ImageBBox bbox;
101 GetBBox(*(t.img), &bbox);
102 overlay_.DrawBBox(bbox, {255, 0, 0});
103
104 overlay_.StartNewProfile();
105 for (int i = 0; i < bbox.maxx - bbox.minx; i += 10) {
106 double y0 = t.a * i * i + t.b * i + t.c_0;
107 double y1 = t.a * i * i + t.b * i + t.c_1;
108 overlay_.AddPoint(aos::vision::Vector<2>(i + t.mini, y0), {255, 0, 0});
109 overlay_.AddPoint(aos::vision::Vector<2>(i + t.mini, y1), {255, 0, 0});
110 }
111 }
112 }
113
114 private:
115 // implementation of the filter pipeline.
116 TargetFinder finder_;
117 aos::vision::BlobStreamViewer *viewer_ = nullptr;
118 aos::vision::PixelLinesOverlay overlay_;
119 std::vector<aos::vision::OverlayBase *> overlays_;
120};
121
Stephan Pleinesf63bde82024-01-13 15:59:33 -0800122} // namespace y2017::vision
Parker Schuh9ef66132017-03-05 16:18:36 -0800123
124int main(int argc, char **argv) {
125 y2017::vision::FilterHarnessExample filter_harness;
Parker Schuhcd258b82017-04-09 16:28:29 -0700126 aos::vision::DebugFrameworkMain(argc, argv, &filter_harness,
127 aos::vision::CameraParams());
Parker Schuh9ef66132017-03-05 16:18:36 -0800128}