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