CVB++ 15.0
edge.hpp
1#pragma once
2
3#include "../_cexports/c_edge.h"
4
5#include "../global.hpp"
6#include "../image.hpp"
7#include "../exception.hpp"
8#include "../rect.hpp"
9#include "../area_2d.hpp"
10
11#include <vector>
12#include <string>
13#include <sstream>
14#include <memory>
15#include <utility>
16#include <algorithm>
17
18namespace Cvb
19{
20 CVB_BEGIN_INLINE_NS
21
22 namespace Foundation
23 {
24 namespace Edge
25 {
26 class Projection;
27 }
28 } // namespace Foundation
29
30 template <>
31 inline HandleGuard<Foundation::Edge::Projection>::HandleGuard(void *handle) noexcept
32 : HandleGuard<Foundation::Edge::Projection>(handle, [](void *h) { CVB_CALL_CAPI(ReleaseProjection(h)); })
33 {
34 }
35
36 namespace Foundation
37 {
38
40
44 namespace Edge
45 {
46
68
70 enum class EdgeType
71 {
73 Ignore = CExports::POLARITY_DONT_CARE,
75 Positive = CExports::POLARITY_POSITIVE,
77 Negative = CExports::POLARITY_NEGATIVE
78 };
79
81 enum class ProjectionMode
82 {
87 };
88
90
92 class EdgeResult
93 {
94 public:
95 EdgeResult() noexcept
96 : x_(0.0)
97 , y_(0.0)
98 , quality_(0.0)
99 , type_(EdgeType::Ignore)
100 {
101 }
102
103 EdgeResult(double x, double y, double quality, EdgeType type) noexcept
104 : x_(x)
105 , y_(y)
106 , quality_(quality)
107 , type_(type)
108 {
109 }
110
111 public:
113
117 static EdgeResult Nothing() noexcept
118 {
119 return EdgeResult();
120 }
121
123
127 double X() const noexcept
128 {
129 return x_;
130 }
131
133
137 double Y() const noexcept
138 {
139 return y_;
140 }
141
143
147 double Quality() const noexcept
148 {
149 return quality_;
150 }
151
153
157 EdgeType Type() const noexcept
158 {
159 return type_;
160 }
161
162 private:
163 double x_;
164 double y_;
165 double quality_;
166 EdgeType type_;
167 };
168
170
177 inline bool operator!=(const EdgeResult &lhs, const EdgeResult &rhs) noexcept
178 {
179 return (lhs.X() != rhs.X()) || (lhs.Y() != rhs.Y()) || (lhs.Quality() != rhs.Quality())
180 || (lhs.Type() != rhs.Type());
181 }
182
184
191 inline bool operator==(const EdgeResult &lhs, const EdgeResult &rhs) noexcept
192 {
193 return (!(lhs != rhs));
194 }
195
197
207
208 namespace Private
209 {
210 /* Convert an edge results collection to an edge vector. */
211 inline std::vector<EdgeResult> EdgeResultsToArray(CExports::EDGERESULTS hResults, EdgeType type)
212 {
214
215 size_t resultCount = CVB_CALL_CAPI(EdgeResultsCount(hResults));
216 for (size_t i = 0; i < resultCount; ++i)
217 {
220 CVB_CALL_CAPI_CHECKED(EdgeResult(hResults, i, x, y, q));
221 results.push_back(EdgeResult(x, y, q, type));
222 }
223
224 return results;
225 }
226
227 typedef HandleGuard<void, CVB_CALL_CAPI(ReleaseEdgeResultsVoid)> ReleaseEdgeResultsGuard;
228
229 } /* namespace Private */
230
232
243 inline EdgeResult FindFirstEdge(const ImagePlane &plane, EdgeSearchMode mode, EdgeType type, double threshold,
244 Area2D aoi, double density = 1.0)
245 {
247 {
248 throw std::invalid_argument("invalid combination of EdgeType and EdgeSearchMode requested");
249 }
250
251 CExports::TEdgeResult edgeRes = {0};
252 CExports::cvbbool_t success = false;
253 switch (mode)
254 {
256 success = CVB_CALL_CAPI(CFindFirstEdge(
257 plane.Parent().Handle(), plane.Plane(), static_cast<int>(density * 1000.0),
258 reinterpret_cast<CExports::TArea &>(aoi), threshold, type == EdgeType::Positive, edgeRes));
259 break;
261 success = CVB_CALL_CAPI(CSFindFirstEdge(
262 plane.Parent().Handle(), plane.Plane(), static_cast<int>(density * 1000.0),
263 reinterpret_cast<CExports::TArea &>(aoi), threshold, type == EdgeType::Positive, edgeRes));
264 break;
266 success = CVB_CALL_CAPI(TFindFirstEdge(
267 plane.Parent().Handle(), plane.Plane(), static_cast<int>(density * 1000.0),
268 reinterpret_cast<CExports::TArea &>(aoi), threshold, type == EdgeType::Positive, edgeRes));
269 break;
271 success = CVB_CALL_CAPI(TSFindFirstEdge(
272 plane.Parent().Handle(), plane.Plane(), static_cast<int>(density * 1000.0),
273 reinterpret_cast<CExports::TArea &>(aoi), threshold, type == EdgeType::Positive, edgeRes));
274 break;
276 success = CVB_CALL_CAPI(OSFindFirstEdge(plane.Parent().Handle(), plane.Plane(),
277 static_cast<int>(density * 1000.0),
278 reinterpret_cast<CExports::TArea &>(aoi), threshold,
279 static_cast<CExports::TEdgePolarity>(type), edgeRes));
280 break;
281 default:
282 throw std::invalid_argument("unknown edge search mode requested");
283 }
284
285 if (success)
286 {
287 return EdgeResult(edgeRes.x, edgeRes.y, edgeRes.Quality, type);
288 }
289 else
290 {
291 return EdgeResult::Nothing();
292 }
293 }
294
296
306 inline EdgeResult FindFirstEdge(const ImagePlane &plane, EdgeSearchMode mode, EdgeType type, double threshold,
307 double density = 1.0)
308 {
309 return FindFirstEdge(plane, mode, type, threshold, Area2D(static_cast<Rect<double>>(plane.Parent().Bounds())),
310 density);
311 }
312
314
328 double threshold1, EdgeType type2, double threshold2, Area2D aoi,
329 double density = 1.0)
330 {
332 {
333 throw std::invalid_argument("invalid combination of EdgeType and EdgeSearchMode requested");
334 }
336 {
337 throw std::invalid_argument("invalid combination of EdgeType and EdgeSearchMode requested");
338 }
339
340 CExports::TEdgeResult edgeRes1 = {0};
341 CExports::TEdgeResult edgeRes2 = {0};
342 CExports::cvbbool_t success = false;
343 switch (mode)
344 {
346 success = CVB_CALL_CAPI(
347 CFindEdgePair(plane.Parent().Handle(), plane.Plane(), static_cast<int>(density * 1000.0),
348 reinterpret_cast<CExports::TArea &>(aoi), threshold1, type1 == EdgeType::Positive,
349 edgeRes1, threshold2, type2 == EdgeType::Positive, edgeRes2));
350 break;
352 success = CVB_CALL_CAPI(
353 CSFindEdgePair(plane.Parent().Handle(), plane.Plane(), static_cast<int>(density * 1000.0),
354 reinterpret_cast<CExports::TArea &>(aoi), threshold1, type1 == EdgeType::Positive,
355 edgeRes1, threshold2, type2 == EdgeType::Positive, edgeRes2));
356 break;
358 success = CVB_CALL_CAPI(
359 TFindEdgePair(plane.Parent().Handle(), plane.Plane(), static_cast<int>(density * 1000.0),
360 reinterpret_cast<CExports::TArea &>(aoi), threshold1, type1 == EdgeType::Positive,
361 edgeRes1, threshold2, type2 == EdgeType::Positive, edgeRes2));
362 break;
364 success = CVB_CALL_CAPI(
365 TSFindEdgePair(plane.Parent().Handle(), plane.Plane(), static_cast<int>(density * 1000.0),
366 reinterpret_cast<CExports::TArea &>(aoi), threshold1, type1 == EdgeType::Positive,
367 edgeRes1, threshold2, type2 == EdgeType::Positive, edgeRes2));
368 break;
370 success = CVB_CALL_CAPI(OSFindEdgePair(
371 plane.Parent().Handle(), plane.Plane(), static_cast<int>(density * 1000.0),
372 reinterpret_cast<CExports::TArea &>(aoi), threshold1, static_cast<CExports::TEdgePolarity>(type1),
373 edgeRes1, threshold2, static_cast<CExports::TEdgePolarity>(type2), edgeRes2));
374 break;
375 default:
376 throw std::invalid_argument("unknown edge search mode requested");
377 }
378
379 if (success)
380 {
381 return EdgeResultPair{{edgeRes1.x, edgeRes1.y, edgeRes1.Quality, type1},
382 {edgeRes1.x, edgeRes1.y, edgeRes1.Quality, type1}};
383 }
384 else
385 {
387 }
388 }
389
391
404 double threshold1, EdgeType type2, double threshold2, double density = 1.0)
405 {
406 return FindEdgePair(plane, mode, type1, threshold1, type2, threshold2,
407 Area2D(static_cast<Rect<double>>(plane.Parent().Bounds())), density);
408 }
409
411
423 inline EdgeResultPair FindEdgePair(const ImagePlane &plane, EdgeSearchMode mode, EdgeType type1, EdgeType type2,
424 double threshold, Area2D aoi, double density = 1.0)
425 {
426 return FindEdgePair(plane, mode, type1, threshold, type2, threshold, aoi, density);
427 }
428
430
441 inline EdgeResultPair FindEdgePair(const ImagePlane &plane, EdgeSearchMode mode, EdgeType type1, EdgeType type2,
442 double threshold, double density = 1.0)
443 {
444 return FindEdgePair(plane, mode, type1, threshold, type2, threshold,
445 Area2D(static_cast<Rect<double>>(plane.Parent().Bounds())), density);
446 }
447
449
461 double threshold, Area2D aoi, double density = 1.0)
462 {
464 {
465 throw std::invalid_argument("invalid combination of EdgeType and EdgeSearchMode requested");
466 }
467
468 // second derivation is different to the rest...
470 {
471 CExports::EDGERESULTS hEdgeResults = nullptr;
472 CVB_CALL_CAPI(OSFindAllEdges(plane.Parent().Handle(), plane.Plane(), static_cast<int>(density * 1000.0),
473 reinterpret_cast<CExports::TArea &>(aoi), threshold,
474 static_cast<CExports::TEdgePolarity>(type), hEdgeResults));
475 Private::ReleaseEdgeResultsGuard hEdgeResHolder(hEdgeResults);
476 return Private::EdgeResultsToArray(hEdgeResults, type);
477 }
478
479 std::vector<CExports::TEdgeResult> rawResults(Round(aoi.Size()).Width());
480 size_t maxEdges = rawResults.size();
481 size_t edgeCount = 0;
482 switch (mode)
483 {
485 CVB_CALL_CAPI(CFindAllEdges(plane.Parent().Handle(), plane.Plane(), static_cast<int>(density * 1000.0),
486 reinterpret_cast<CExports::TArea &>(aoi), threshold, type == EdgeType::Positive,
487 maxEdges, rawResults.data(), edgeCount));
488 break;
490 CVB_CALL_CAPI(CSFindAllEdges(plane.Parent().Handle(), plane.Plane(), static_cast<int>(density * 1000.0),
491 reinterpret_cast<CExports::TArea &>(aoi), threshold,
492 type == EdgeType::Positive, maxEdges, rawResults.data(), edgeCount));
493 break;
495 CVB_CALL_CAPI(TFindAllEdges(plane.Parent().Handle(), plane.Plane(), static_cast<int>(density * 1000.0),
496 reinterpret_cast<CExports::TArea &>(aoi), threshold, type == EdgeType::Positive,
497 maxEdges, rawResults.data(), edgeCount));
498 break;
500 CVB_CALL_CAPI(TSFindAllEdges(plane.Parent().Handle(), plane.Plane(), static_cast<int>(density * 1000.0),
501 reinterpret_cast<CExports::TArea &>(aoi), threshold,
502 type == EdgeType::Positive, maxEdges, rawResults.data(), edgeCount));
503 break;
504 default:
505 throw std::invalid_argument("unknown edge search mode requested");
506 }
507
508 std::vector<EdgeResult> fullResults(edgeCount);
509 std::transform(rawResults.begin(), rawResults.begin() + edgeCount, fullResults.begin(), // NOLINT
510 [=](CExports::TEdgeResult raw) { return EdgeResult(raw.x, raw.y, raw.Quality, type); });
511 return fullResults;
512 }
513
515
526 double threshold, double density = 1.0)
527 {
528 return FindAllEdges(plane, mode, type, threshold, Area2D(static_cast<Rect<double>>(plane.Parent().Bounds())),
529 density);
530 }
531
533
543 inline EdgeResult FindBestEdge(const ImagePlane &plane, EdgeType type, Area2D aoi, double density = 1.0)
544 {
545 CExports::TEdgeResult edgeRes = {0};
546 auto success = CVB_CALL_CAPI(OSFindBestEdge(
547 plane.Parent().Handle(), plane.Plane(), static_cast<int>(density * 1000.0),
548 reinterpret_cast<CExports::TArea &>(aoi), static_cast<CExports::TEdgePolarity>(type), edgeRes));
549
550 if (success)
551 {
552 return EdgeResult(edgeRes.x, edgeRes.y, edgeRes.Quality, type);
553 }
554 else
555 {
556 return EdgeResult::Nothing();
557 }
558 }
559
561
570 inline EdgeResult FindBestEdge(const ImagePlane &plane, EdgeType type, double density = 1.0)
571 {
572 return FindBestEdge(plane, type, Area2D(static_cast<Rect<double>>(plane.Parent().Bounds())), density);
573 }
574
577
584 inline void WriteProjection(const ImagePlane &plane, Area2D aoi, double density = 1.0)
585 {
586 CVB_CALL_CAPI(WriteProjection(plane.Parent().Handle(), plane.Plane(), static_cast<int>(density * 1000.0),
587 reinterpret_cast<CExports::TArea &>(aoi)));
588 }
589
591
594 {
596
601
603 double Value = 0.0;
604 };
605
607
614 class Projection
615 {
616 private:
617 // Internal helper constructor version
618 Projection(HandleGuard<Projection> &&guard, ProjectionMode mode) noexcept
619 : handle_(std::move(guard))
620 , mode_(mode)
621 {
622 }
623
624 public:
626
634 Projection(const ImagePlane &plane, Area2D aoi, ProjectionMode mode = ProjectionMode::Sum, double density = 1.0)
635 : Projection(HandleGuard<Projection>(CreateProjectionHandle(plane, aoi, mode, density)), mode)
636 {
637 }
638
639 Projection(const Projection &other) = delete;
640 Projection &operator=(const Projection &other) = delete;
641 Projection(Projection &&other) noexcept = default;
642 Projection &operator=(Projection &&other) noexcept = default;
643 ~Projection() = default;
644
646
651 {
652 if (Length() != values_.size())
653 {
654 std::vector<ProjectionValue> values(Length());
655 Internal::DoBoolCall([&]() {
656 return CVB_CALL_CAPI(
657 CopyDoubleBuffer(Handle(), reinterpret_cast<CExports::pDoubleProjection>(values.data())));
658 });
659 values_.swap(values);
660 }
661 return values_;
662 }
663
664 private:
665 // Helper to create the projection handle.
666 static CExports::PROJECTIONEX CreateProjectionHandle(const ImagePlane &plane, Area2D aoi, ProjectionMode mode,
667 double density)
668 {
669 CExports::PROJECTIONEX projection = nullptr;
670 /* Note: the binary compatibility between Area2D and TArea is guaranteed, therefore the cast below is legal.
671 */
672 switch (mode)
673 {
675 CVB_CALL_CAPI_CHECKED(GetNormProjectionEx(plane.Parent().Handle(), plane.Plane(),
676 static_cast<CExports::cvbdensity_t>(density * 1000.0),
677 reinterpret_cast<CExports::TArea &>(aoi), projection));
678 break;
680 CVB_CALL_CAPI_CHECKED(GetProjectionEx(plane.Parent().Handle(), plane.Plane(),
681 static_cast<CExports::cvbdensity_t>(density * 1000.0),
682 reinterpret_cast<CExports::TArea &>(aoi), projection));
683 break;
684 default:
685 throw std::invalid_argument("unknown projection mode");
686 }
687 return projection;
688 }
689
690 public:
692
702 ProjectionMode mode = ProjectionMode::Sum, double density = 1.0)
703 {
704 return std::make_unique<Projection>(plane, aoi, mode, density);
705 }
706
708
714 void *Handle() const noexcept
715 {
716 return handle_.Handle();
717 }
718
720
728 static std::unique_ptr<Projection> FromHandle(HandleGuard<Projection> &&guard, ProjectionMode mode)
729 {
730 if (!guard.Handle())
731 {
732 throw std::invalid_argument("invalid projection native handle");
733 }
734 return std::unique_ptr<Projection>(new Projection(std::move(guard), mode));
735 }
736
738
744 {
745 CExports::EDGERESULTS hResults = nullptr;
746 CVB_CALL_CAPI_CHECKED(ZeroCrossings(Handle(), Length(), hResults));
747
748 Private::ReleaseEdgeResultsGuard hEdgeResHolder(hResults);
749
750 return Private::EdgeResultsToArray(hResults, EdgeType::Ignore);
751 }
752
754
760 {
761 return Internal::DoBoolCallObjectOut<Projection>(
762 [&](void *&resproj) { return CVB_CALL_CAPI(Derivation(Handle(), resproj)); }, ProjectionMode::Sum);
763 }
764
766
772 template <class RANGE>
773 inline typename TypedRange<std::unique_ptr<Projection>, int, RANGE>::type Filter(const RANGE &kernel)
774 {
775 auto kernelRange = MakeRangeAdapter<int>(kernel, 1);
776
777 return Internal::DoBoolCallObjectOut<Projection>(
778 [&](void *&resproj) {
779 return CVB_CALL_CAPI(Filter(Handle(), reinterpret_cast<CExports::cvbval_t *>(kernelRange.Data()),
780 kernelRange.Size(), resproj));
781 },
783 }
784
786
792 {
793 return Internal::DoBoolCallObjectOut<Projection>(
794 [&](void *&resproj) { return CVB_CALL_CAPI(Normalize(Handle(), resproj)); }, ProjectionMode::Average);
795 }
796
798
802 ProjectionMode Mode() const noexcept
803 {
804 return mode_;
805 }
806
807 private:
808 /* The length (= number of values) of the projection. */
809 size_t Length() const
810 {
811 size_t length = 0;
812 CVB_CALL_CAPI_CHECKED(GetLength(Handle(), length));
813 return length;
814 }
815
816 private:
817 HandleGuard<Projection> handle_;
818 ProjectionMode mode_;
819 mutable std::vector<ProjectionValue> values_;
820 }; /* class Projection */
821
824
825 } /* namespace Edge */
826
828 using Edge::EdgeType;
830
831 using Edge::EdgeResult;
833 using Edge::Projection;
836
837 using Edge::FindAllEdges;
838 using Edge::FindBestEdge;
839 using Edge::FindEdgePair;
842
843 using Edge::Projection;
845
846 } /* namespace Foundation */
847 CVB_END_INLINE_NS
848} /* namespace Cvb */
Structure that represents an area of interest in the image.
Definition area_2d.hpp:21
Edge search result
Definition edge.hpp:93
EdgeType Type() const noexcept
Type of the edge.
Definition edge.hpp:157
double Quality() const noexcept
Quality of detection, depending on the method used.
Definition edge.hpp:147
double Y() const noexcept
Y-position relative to the last line processed.
Definition edge.hpp:137
double X() const noexcept
X-position relative to the last line processed.
Definition edge.hpp:127
static EdgeResult Nothing() noexcept
The edge result returned when nothing has been found.
Definition edge.hpp:117
Projection that the Edge analysis of Common Vision Blox is using.
Definition edge.hpp:615
Projection(const ImagePlane &plane, Area2D aoi, ProjectionMode mode=ProjectionMode::Sum, double density=1.0)
Create a projection object.
Definition edge.hpp:634
static std::unique_ptr< Projection > FromHandle(HandleGuard< Projection > &&guard, ProjectionMode mode)
Creates projection from a classic API handle.
Definition edge.hpp:728
TypedRange< std::unique_ptr< Projection >, int, RANGE >::type Filter(const RANGE &kernel)
Filter this projection using a 1D filter kernel.
Definition edge.hpp:773
std::vector< EdgeResult > CalculateZeroCrossings()
Get all the zero crossings, that are in the projection.
Definition edge.hpp:743
std::unique_ptr< Projection > Derive()
Create derivative of this projection.
Definition edge.hpp:759
ProjectionMode Mode() const noexcept
Gets the mode of the projection.
Definition edge.hpp:802
static std::unique_ptr< Projection > Create(const ImagePlane &plane, Area2D aoi, ProjectionMode mode=ProjectionMode::Sum, double density=1.0)
Create a projection object.
Definition edge.hpp:701
std::unique_ptr< Projection > ToAverageProjection()
Create a new averaged projection from this one.
Definition edge.hpp:791
std::vector< ProjectionValue > Values() const
Retrieve the values of the projection.
Definition edge.hpp:650
void * Handle() const noexcept
Classic API PROJECTIONEX handle.
Definition edge.hpp:714
Rect< int > Bounds() const noexcept
Bounding rectangle of the image in pixels.
Definition decl_image.hpp:433
void * Handle() const noexcept
Classic API image handle.
Definition decl_image.hpp:232
Image plane information container.
Definition decl_image_plane.hpp:29
int Plane() const noexcept
Plane index in the image, to which this plane refers to.
Definition decl_image_plane.hpp:147
const Image & Parent() const noexcept
Image to which this plane descriptor refers to.
Definition detail_image_plane.hpp:87
Multi-purpose 2D vector class.
Definition point_2d.hpp:20
Rectangle object.
Definition rect.hpp:24
T move(T... args)
Collection of functions for edge detection.
Definition edge.hpp:25
std::vector< EdgeResult > FindAllEdges(const ImagePlane &plane, EdgeSearchMode mode, EdgeType type, double threshold, Area2D aoi, double density=1.0)
Find all edges inside the aoi.
Definition edge.hpp:460
EdgeResult FindBestEdge(const ImagePlane &plane, EdgeType type, Area2D aoi, double density=1.0)
Use the 2nd derivative method to find the edge with the highest intensity in the area of interest.
Definition edge.hpp:543
EdgeResultPair FindEdgePair(const ImagePlane &plane, EdgeSearchMode mode, EdgeType type1, double threshold1, EdgeType type2, double threshold2, Area2D aoi, double density=1.0)
Find an edge pair (as specified) in the aoi.
Definition edge.hpp:327
EdgeType
Type of the edges to be searched.
Definition edge.hpp:71
@ Positive
Intensities increase along the scan direction.
Definition edge.hpp:75
@ Ignore
Used for EdgeResult::Nothing and with the 2nd derivative edge detection functions.
Definition edge.hpp:73
@ Negative
Intensities decrease along the scan direction.
Definition edge.hpp:77
ProjectionMode
Options affecting the result of the projection.
Definition edge.hpp:82
@ Sum
Projection value is the sum of all gray values per projection line.
Definition edge.hpp:86
@ Average
Projection value is the average value per projection line.
Definition edge.hpp:84
std::shared_ptr< Projection > ProjectionPtr
Convenience shared pointer for Projection.
Definition edge.hpp:823
bool operator!=(const EdgeResult &lhs, const EdgeResult &rhs) noexcept
Comparison operator for EdgeResult objects.
Definition edge.hpp:177
void WriteProjection(const ImagePlane &plane, Area2D aoi, double density=1.0)
Write the projection that Edge is using internally as the basis for its calculations into an image pl...
Definition edge.hpp:584
bool operator==(const EdgeResult &lhs, const EdgeResult &rhs) noexcept
Comparison operator for EdgeResult objects.
Definition edge.hpp:191
EdgeResult FindFirstEdge(const ImagePlane &plane, EdgeSearchMode mode, EdgeType type, double threshold, Area2D aoi, double density=1.0)
Find the first edge (as specified) in the aoi.
Definition edge.hpp:243
EdgeSearchMode
Determines the algorithm for finding an edge.
Definition edge.hpp:49
@ SecondDerivativeSubPixel
Find edges based on the 2nd derivative of the intensities with sub pixel accuracy.
Definition edge.hpp:66
@ Intensity
Find edges based on absolute intensities in the image.
Definition edge.hpp:55
@ IntensitySubPixel
Like Intensity, but with sub pixel accuracy.
Definition edge.hpp:57
@ Contrast
Find edges based on the contrasts in the image (1st derivative of the gray values).
Definition edge.hpp:59
@ ContrastSubPixel
Like Contrast, but with sub pixel accuracy.
Definition edge.hpp:61
Namespace for the Foundation package.
Definition decl_metric_aqs12_calibration_piece.hpp:11
Root namespace for the Image Manager interface.
Definition c_bayer_to_rgb.h:17
Point2D< int > Round(const Point2D< T > &rhs) noexcept
Round to an integer point.
Definition point_2d.hpp:371
T quiet_NaN(T... args)
A pair of found edges.
Definition edge.hpp:200
EdgeResult Second
Second found edge.
Definition edge.hpp:205
EdgeResult First
First found edge.
Definition edge.hpp:202
Single projection value.
Definition edge.hpp:594
double Value
Projection value as determined by the ProjectionMode.
Definition edge.hpp:603
Point2D< double > Position
Coordinate of the projection.
Definition edge.hpp:600
T transform(T... args)