blob: d54dc2d289238e18cd30d5056f14ebbc12e51b47 [file] [log] [blame]
Parker Schuh2a1447c2019-02-17 00:25:29 -08001#ifndef _Y2019_VISION_TARGET_FINDER_H_
2#define _Y2019_VISION_TARGET_FINDER_H_
3
Brian Silverman63236772019-03-23 22:02:44 -07004#include <memory>
5
6#include "aos/vision/blob/contour.h"
Parker Schuh2a1447c2019-02-17 00:25:29 -08007#include "aos/vision/blob/region_alloc.h"
8#include "aos/vision/blob/threshold.h"
9#include "aos/vision/blob/transpose.h"
10#include "aos/vision/debug/overlay.h"
11#include "aos/vision/math/vector.h"
12#include "y2019/vision/target_types.h"
13
Brian Silverman63236772019-03-23 22:02:44 -070014namespace ceres {
15
16class Context;
17
18} // namespace ceres
Parker Schuh2a1447c2019-02-17 00:25:29 -080019namespace y2019 {
20namespace vision {
21
22using aos::vision::ImageRange;
23using aos::vision::RangeImage;
24using aos::vision::BlobList;
25using aos::vision::Vector;
Ben Fredricksonf7b68522019-03-02 21:19:42 -080026using aos::vision::ContourNode;
Parker Schuh2a1447c2019-02-17 00:25:29 -080027
Austin Schuh6e56faf2019-03-10 14:04:57 -070028struct Polygon {
29 ::std::vector<aos::vision::Segment<2>> segments;
30 ::std::vector<::Eigen::Vector2f> contour;
31};
32
Parker Schuh2a1447c2019-02-17 00:25:29 -080033class TargetFinder {
34 public:
35 TargetFinder();
Brian Silverman63236772019-03-23 22:02:44 -070036 ~TargetFinder();
37
Parker Schuh2a1447c2019-02-17 00:25:29 -080038 // Turn a raw image into blob range image.
39 aos::vision::RangeImage Threshold(aos::vision::ImagePtr image);
40
41 // Value against which we threshold.
Austin Schuh2851e7f2019-03-06 20:45:19 -080042 static uint8_t GetThresholdValue() { return 100; }
Parker Schuh2a1447c2019-02-17 00:25:29 -080043
Austin Schuh3b1586a2019-05-02 13:46:52 -070044 int PixelCount(BlobList *imgs);
45
Parker Schuh2a1447c2019-02-17 00:25:29 -080046 // filter out obvious or durranged blobs.
47 void PreFilter(BlobList *imgs);
48
Austin Schuhe5015972019-03-09 17:47:34 -080049 ContourNode *GetContour(const RangeImage &blob);
50 ::std::vector<::Eigen::Vector2f> UnWarpContour(ContourNode *start) const;
Ben Fredricksonf7b68522019-03-02 21:19:42 -080051
Parker Schuh2a1447c2019-02-17 00:25:29 -080052 // Turn a blob into a polgygon.
Austin Schuh6e56faf2019-03-10 14:04:57 -070053 Polygon FindPolygon(::std::vector<::Eigen::Vector2f> &&contour, bool verbose);
Parker Schuh2a1447c2019-02-17 00:25:29 -080054
55 // Turn a bloblist into components of a target.
56 std::vector<TargetComponent> FillTargetComponentList(
Austin Schuh6e56faf2019-03-10 14:04:57 -070057 const ::std::vector<Polygon> &seg_list, bool verbose);
Parker Schuh2a1447c2019-02-17 00:25:29 -080058
59 // Piece the compenents together into a target.
60 std::vector<Target> FindTargetsFromComponents(
61 const std::vector<TargetComponent> component_list, bool verbose);
62
63 // Given a target solve for the transformation of the template target.
Alex Perry24319272019-04-07 12:31:29 -070064 //
65 // This is safe to call concurrently.
Parker Schuh2a1447c2019-02-17 00:25:29 -080066 IntermediateResult ProcessTargetToResult(const Target &target, bool verbose);
67
Austin Schuhe6cfbe32019-03-10 18:05:57 -070068 // Returns true if a target is good, and false otherwise. Picks the 4 vs 8
69 // point solution depending on which one looks right.
70 bool MaybePickAndUpdateResult(IntermediateResult *result, bool verbose);
71
Parker Schuh2a1447c2019-02-17 00:25:29 -080072 std::vector<IntermediateResult> FilterResults(
Alex Perrybac3d3f2019-03-10 14:26:51 -070073 const std::vector<IntermediateResult> &results, uint64_t print_rate,
74 bool verbose);
Parker Schuh2a1447c2019-02-17 00:25:29 -080075
Alex Perry5b1e8e32019-04-07 13:25:31 -070076 bool TestExposure(const std::vector<IntermediateResult> &results,
Austin Schuh3b1586a2019-05-02 13:46:52 -070077 int pixel_count, int *desired_exposure);
Alex Perry5b1e8e32019-04-07 13:25:31 -070078
Parker Schuh2a1447c2019-02-17 00:25:29 -080079 // Get the local overlay for debug if we are doing that.
80 aos::vision::PixelLinesOverlay *GetOverlay() { return &overlay_; }
81
82 // Convert target location into meters and radians.
83 void GetAngleDist(const aos::vision::Vector<2> &target, double down_angle,
84 double *dist, double *angle);
85
86 // Return the template target in a normalized space.
87 const Target &GetTemplateTarget() { return target_template_; }
88
89 const IntrinsicParams &intrinsics() const { return intrinsics_; }
Alex Perry3bf1bee2019-02-23 20:01:15 -080090 IntrinsicParams *mutable_intrinsics() { return &intrinsics_; }
Parker Schuh2a1447c2019-02-17 00:25:29 -080091
92 private:
93 // Find a loosly connected target.
94 double DetectConnectedTarget(const RangeImage &img);
95
96 aos::vision::PixelLinesOverlay overlay_;
97
98 aos::vision::AnalysisAllocator alloc_;
99
100 // The template for the default target in the standard space.
Austin Schuh4d6e9bd2019-03-08 19:54:17 -0800101 const Target target_template_;
Parker Schuh2a1447c2019-02-17 00:25:29 -0800102
103 IntrinsicParams intrinsics_;
104
105 ExtrinsicParams default_extrinsics_;
Ben Fredricksona8c3d552019-03-03 14:14:53 -0800106
Brian Silverman63236772019-03-23 22:02:44 -0700107 const std::unique_ptr<ceres::Context> ceres_context_;
108
Ben Fredricksona8c3d552019-03-03 14:14:53 -0800109 // Counts for logging.
110 size_t frame_count_;
111 size_t valid_result_count_;
Alex Perry5b1e8e32019-04-07 13:25:31 -0700112
Austin Schuh3b1586a2019-05-02 13:46:52 -0700113 int close_bucket_ = 0;
114
Alex Perry5b1e8e32019-04-07 13:25:31 -0700115 int current_exposure_ = 0;
Parker Schuh2a1447c2019-02-17 00:25:29 -0800116};
117
118} // namespace vision
119} // namespace y2019
120
121#endif