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 
11 namespace Cvb
12 {
13 
14 CVB_BEGIN_INLINE_NS
15 
16 template <>
17 inline HandleGuard<Dnc::Finder>::HandleGuard(void* handle) noexcept
18  : HandleGuard<Dnc::Finder>(handle, [](void* handle) { CVB_CALL_CAPI(ReleaseObject(handle)); })
19 {
20 }
21 
22 namespace Dnc
23 {
24 
26 
28 class 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 
148 CVB_END_INLINE_NS
149 
150 }
void * Handle() const noexcept
Classic API node handle.
Definition: finder.hpp:78
void Save(const String &fileName)
Saves the finder to the given file name.
Definition: finder.hpp:115
static std::unique_ptr< Finder > Load(const String &fileName)
Loads a finder from the given file name.
Definition: finder.hpp:47
STL class.
Definition of search parameters.
Definition: search_parameters.hpp:22
Root namespace for the Image Manager interface.
Definition: version.hpp:11
void * Handle() const noexcept
Returns C-API style handle to Node Object.
Definition: decl_point_cloud.hpp:767
STL class.
STL class.
Parameters for teaching a DNC finder.
Definition: teach_parameters.hpp:17
DNC finder used to perform a search on a point cloud.
Definition: finder.hpp:28
std::tuple< TeachParameters, double, double > GetTeachParameters()
Gets the TeachParameters with which this Finder was trained.
Definition: finder.hpp:125
A dense Cartesian 3D point cloud object.
Definition: decl_dense_point_cloud.hpp:29
static std::unique_ptr< Finder > FromHandle(HandleGuard< Finder > &&guard)
Creates a finder from a classic API handle.
Definition: finder.hpp:63
std::vector< SearchResult > Find(const DensePointCloud &pointCloud, const SearchParameters &parameters)
Search for objects on the given point cloud.
Definition: finder.hpp:90