5#include "../global.hpp"
7#include "../local_maximum.hpp"
8#include "../matrix_2d.hpp"
22 inline HandleGuard<Internal::PixelList>::HandleGuard(
void *handle) noexcept
23 : HandleGuard<Internal::PixelList>(handle, [](
void *handle) { CVB_CALL_CAPI(
ReleaseObject(handle)); })
34 static std::unique_ptr<PixelList> FromHandle(HandleGuard<PixelList> &&guard)
36 auto pixelList = std::unique_ptr<PixelList>(
new PixelList(std::move(guard)));
40 template <
class RANGE>
41 static typename TypedRange<std::unique_ptr<PixelList>, Point2D<double>, RANGE>::type
42 FromPoints(
const RANGE &points)
44 auto handle = CExports::CreatePixelList(2);
46 throw std::runtime_error(
"failed to create pixel list");
48 auto pixelList = FromHandle(HandleGuard<PixelList>(handle));
50 for (
const auto &point : points)
52 if (!CVB_CALL_CAPI(
AddPixel(pixelList->Handle(),
reinterpret_cast<const double *
>(&point))))
53 Utilities::SystemInfo::ThrowLastError();
58 void *Handle() const noexcept
60 return handle_.Handle();
63 int Dimension() const noexcept
65 return static_cast<int>(CExports::PixelListDimension(Handle()));
68 int Count() const noexcept
70 return static_cast<int>(CExports::PixelListCount(Handle()));
73 void Transform(Matrix2D matrix, Point2D<double> offset)
noexcept
75 Transform(matrix, offset.X(), offset.Y());
78 void Transform(Matrix2D matrix,
double offsetX,
double offsetY)
noexcept
80 CExports::TransformPixelListMatrix(Handle(), *
reinterpret_cast<CExports::TMatrix *
>(&matrix), offsetX, offsetY);
83 std::vector<LocalMaximum> ToLocalMaximum()
const
85 auto dim = Dimension();
87 throw std::runtime_error(
"not enough data to convert to local maxima");
90 std::vector<LocalMaximum> retval(
static_cast<std::size_t
>(count));
91 std::vector<double> tmpData(
static_cast<std::size_t
>(dim));
92 for (
int i = 0; i <
count; ++i)
94 CVB_CALL_CAPI(
ListPixelEx(Handle(),
static_cast<CExports::cvbval_t
>(i), tmpData.data()));
95 retval[
static_cast<std::size_t
>(i)] = LocalMaximum(tmpData.data());
100 std::vector<Point2D<double>> ToPoints()
const
102 auto dim = Dimension();
103 auto count = Count();
104 std::vector<Point2D<double>> retval(
static_cast<std::size_t
>(count));
105 std::vector<double> tmpData(
static_cast<std::size_t
>(dim));
106 for (
int i = 0; i <
count; ++i)
108 CVB_CALL_CAPI(
ListPixelEx(Handle(),
static_cast<CExports::cvbval_t
>(i), tmpData.data()));
109 retval[
static_cast<std::size_t
>(i)] = Point2D<double>(tmpData[0], tmpData[1]);
114 std::vector<double> ToValues(
int index)
const
116 auto dim = Dimension();
117 auto count = Count();
118 std::vector<double> retval(
static_cast<std::size_t
>(dim));
121 for (
int i = 0; i <
count; ++i)
125 CVB_CALL_CAPI(
ListPixelEx(Handle(),
static_cast<CExports::cvbval_t
>(i), retval.data()));
134 explicit PixelList(HandleGuard<PixelList> &&guard) noexcept
135 : handle_(std::move(guard))
139 HandleGuard<PixelList> handle_;
cvbbool_t AddPixel(PIXELLIST PixelList, const double *Components)
cvbbool_t ListPixelEx(PIXELLIST PixelList, cvbval_t Index, double *Components)
cvbbool_t ReleaseObject(OBJ &Object)
Root namespace for the Image Manager interface.
Definition c_bayer_to_rgb.h:17