+class Mat3d : public MatDynMem
+{
+public:
+ Mat3d(uint dim0, cv::Size size) : MatDynMem({{int(dim0), size.height, size.width}}, CV_32F) {}
+
+ cv::Mat plane(uint idx) {
+ assert(dims == 3);
+ assert(int(idx) < size[0]);
+ return cv::Mat(size[1], size[2], cv::Mat::type(), ptr(idx));
+ }
+ const cv::Mat plane(uint idx) const {
+ assert(dims == 3);
+ assert(int(idx) < size[0]);
+ return cv::Mat(size[1], size[2], cv::Mat::type(), const_cast<uchar*>(ptr(idx)));
+ }
+
+};
+
+class MatFeats : public Mat3d
+{
+public:
+ MatFeats(uint num_features, cv::Size size) : Mat3d(num_features, size) {}
+};
+class MatScales : public Mat3d
+{
+public:
+ MatScales(uint num_scales, cv::Size size) : Mat3d(num_scales, size) {}
+};
+
+class MatScaleFeats : public MatDynMem
+{
+public:
+ MatScaleFeats(uint num_scales, uint num_features, cv::Size size)
+ : MatDynMem({{int(num_scales), int(num_features), size.height, size.width}}, CV_32F) {}
+
+ cv::Mat plane(uint scale, uint feature) {
+ assert(dims == 4);
+ assert(int(scale) < size[0]);
+ assert(int(feature) < size[1]);
+ return cv::Mat(size[2], size[3], cv::Mat::type(), ptr(scale, feature));
+ }
+ cv::Mat scale(uint scale) {
+ assert(dims == 4);
+ assert(int(scale) < size[0]);
+ return cv::Mat(3, std::vector<int>({size[1], size[2], size[3]}).data(), cv::Mat::type(), ptr(scale));
+ }
+};
+