CVB++ 14.0
finder.hpp
1#pragma once
2
3#include "../_cexports/c_dnc_find.h"
4#include "../string.hpp"
5#include "../dense_point_cloud.hpp"
6#include "dnc.hpp"
7#include "search_parameters.hpp"
8#include "search_result.hpp"
9#include "teach_parameters.hpp"
10
11namespace Cvb
12{
13
14CVB_BEGIN_INLINE_NS
15
16template <>
17inline HandleGuard<Dnc::Finder>::HandleGuard(void* handle) noexcept
18 : HandleGuard<Dnc::Finder>(handle, [](void* handle) { CVB_CALL_CAPI(ReleaseObject(handle)); })
19{
20}
21
22namespace Dnc
23{
24
26
28class Finder final
29{
30 private:
31
32 struct PrivateTag {};
33
34 public:
35
36 Finder(HandleGuard<Finder>&& guard, PrivateTag) noexcept
37 : handle_(std::move(guard))
38 {
39 }
40
42
47 static std::unique_ptr<Finder> Load(const String& fileName)
48 {
49 return Internal::DoResCallObjectOut<Finder>([&](void*& handle)
50 {
51 return CVB_CALL_CAPI(CVDNCCreateFromFileTyped(fileName.c_str(), handle));
52 });
53 }
54
56
63 static std::unique_ptr<Finder> FromHandle(HandleGuard<Finder>&& guard)
64 {
65 if (!guard.Handle())
66 throw std::runtime_error("handle must not be null");
67
68 return std::make_unique<Finder>(std::move(guard), PrivateTag{});
69 }
70
72
78 void* Handle() const noexcept
79 {
80 return handle_.Handle();
81 }
82
84
90 std::vector<SearchResult> Find(const DensePointCloud& pointCloud, const SearchParameters& parameters)
91 {
92 CVB_CALL_CAPI_CHECKED(CVDNCSetSearchParams(Handle(), *reinterpret_cast<const CExports::CVDNCSearchParams*>(&parameters)));
93
94 CExports::CVDNCRESULTS resultsHandle = nullptr;
95 CVB_CALL_CAPI_CHECKED(CVDNCFind(Handle(), pointCloud.Handle(), resultsHandle));
96 ReleaseObjectGuard guard(resultsHandle);
97
98 auto numResults = CExports::CVDNCGetNumResults(resultsHandle);
99 std::vector<SearchResult> results(numResults);
100
101 for (auto& result : results)
102 {
103 int index = static_cast<int>(std::distance(&results.front(), &result));
104 CVB_CALL_CAPI_CHECKED(CVDNCGetResult(resultsHandle, index, *reinterpret_cast<CExports::CVDNCResult*>(&result)));
105 }
106
107 return results;
108 }
109
111
115 void Save(const String& fileName)
116 {
117 CVB_CALL_CAPI_CHECKED(CVDNCSaveClassifierTyped(Handle(), fileName.c_str()));
118 }
119
121
126 {
127 double resolution = 0.0;
128 double fringe = 0.0;
129 TeachParameters teachParams;
130 Internal::DoResCall([this, &teachParams , &resolution, &fringe]() {
131
132 return CVB_CALL_CAPI(CVDNCGetTeachParams(
133 Handle(),
134 resolution,
135 fringe,
136 *reinterpret_cast<CExports::CVDNCTeachParams*>(&teachParams)));
137 });
138 return std::make_tuple(teachParams, resolution, fringe);
139 }
140
141 private:
142
143 HandleGuard<Finder> handle_;
144};
145
146}
147
148CVB_END_INLINE_NS
149
150}
A dense Cartesian 3D point cloud object.
Definition: decl_dense_point_cloud.hpp:31
DNC finder used to perform a search on a point cloud.
Definition: finder.hpp:29
std::vector< SearchResult > Find(const DensePointCloud &pointCloud, const SearchParameters &parameters)
Search for objects on the given point cloud.
Definition: finder.hpp:90
void Save(const String &fileName)
Saves the finder to the given file name.
Definition: finder.hpp:115
std::tuple< TeachParameters, double, double > GetTeachParameters()
Gets the TeachParameters with which this Finder was trained.
Definition: finder.hpp:125
static std::unique_ptr< Finder > FromHandle(HandleGuard< Finder > &&guard)
Creates a finder from a classic API handle.
Definition: finder.hpp:63
void * Handle() const noexcept
Classic API node handle.
Definition: finder.hpp:78
static std::unique_ptr< Finder > Load(const String &fileName)
Loads a finder from the given file name.
Definition: finder.hpp:47
Definition of search parameters.
Definition: search_parameters.hpp:23
Parameters for teaching a DNC finder.
Definition: teach_parameters.hpp:18
void * Handle() const noexcept
Returns C-API style handle to Node Object.
Definition: decl_point_cloud.hpp:767
Root namespace for the Image Manager interface.
Definition: c_barcode.h:24