32 #ifndef META_OCEAN_CV_DETECTOR_FREAK_DESCRIPTOR_H
33 #define META_OCEAN_CV_DETECTOR_FREAK_DESCRIPTOR_H
50 #include <Eigen/Dense>
62 template <
size_t tSize>
63 class FREAKDescriptorT;
82 template <
size_t tSize>
85 static_assert(tSize == 32 || tSize == 64,
"Invalid size!");
286 static constexpr
size_t size();
363 static bool extractHarrisCornersAndComputeDescriptors(
const Frame& yFrame,
const unsigned int maxFrameArea,
const unsigned int minFrameArea,
const unsigned int expectedHarrisCorners640x480,
const Scalar harrisCornersReductionScale,
const unsigned int harrisCornerThreshold,
const float inverseFocalLength,
const CameraDerivativeFunctor& cameraDerivativeFunctor,
HarrisCorners& corners,
Indices32& cornerPyramidLevels, std::vector<
FREAKDescriptorT<tSize>>& descriptors,
const bool removeInvalid =
false,
const Scalar border =
Scalar(20),
const bool determineExactHarrisCornerPositions =
false,
const bool yFrameIsUndistorted =
true,
Worker* worker =
nullptr);
407 template <
bool tEnableBorderChecks>
498 template <
size_t tSize>
501 ocean_assert(pinholeCamera.
isValid());
502 ocean_assert(pyramidLevels != 0u);
505 cameras_.emplace_back(pinholeCamera);
507 unsigned int width = pinholeCamera.
width();
508 unsigned int height = pinholeCamera.
height();
510 for (
unsigned int level = 1u; level < pyramidLevels; ++level)
515 if (width == 0u || height == 0u)
520 cameras_.emplace_back(width, height, pinholeCamera);
526 template <
size_t tSize>
529 ocean_assert(pointPyramidLevel < cameras_.size());
533 template <
size_t tSize>
536 return (
unsigned int)(cameras_.size());
539 template <
size_t tSize>
554 data.unprojectRayIF = Eigen::Vector3f(
float(unprojectRayIF.
x()),
float(unprojectRayIF.
y()),
float(unprojectRayIF.
z()));
557 data.pointJacobianMatrixIF << float(jacobianX[0]), float(jacobianX[1]), float(jacobianX[2]), float(jacobianY[0]), float(jacobianY[1]), float(jacobianY[2]);
558 ocean_assert(
data.pointJacobianMatrixIF.IsRowMajor ==
false);
563 template <
size_t tSize>
566 ocean_assert(camera && camera->isValid());
567 ocean_assert(pyramidLevels != 0u);
569 cameras_.reserve(pyramidLevels);
570 cameras_.emplace_back(camera);
572 unsigned int width = camera->width();
573 unsigned int height = camera->height();
575 for (
unsigned int level = 1u; level < pyramidLevels; ++level)
580 if (width == 0u || height == 0u)
585 cameras_.emplace_back(cameras_.back()->clone(width, height));
589 template <
size_t tSize>
592 ocean_assert(pointPyramidLevel < cameras_.size());
596 template <
size_t tSize>
599 return (
unsigned int)(cameras_.size());
602 template <
size_t tSize>
613 data.unprojectRayIF = Eigen::Vector3f(
float(unprojectRayIF.
x()),
float(unprojectRayIF.
y()),
float(unprojectRayIF.
z()));
616 data.pointJacobianMatrixIF << float(jacobianX[0]), float(jacobianX[1]), float(jacobianX[2]), float(jacobianY[0]), float(jacobianY[1]), float(jacobianY[2]);
617 ocean_assert(
data.pointJacobianMatrixIF.IsRowMajor ==
false);
622 template <
size_t tSize>
628 ocean_assert(levels >= 1u && levels <= 3u);
632 template <
size_t tSize>
639 template <
size_t tSize>
645 template <
size_t tSize>
651 template <
size_t tSize>
658 template <
size_t tSize>
663 unsigned int bestDistance = (
unsigned int)(-1);
665 for (
unsigned int nOuter = 0u; nOuter <
dataLevels_; ++nOuter)
669 for (
unsigned int nInner = 0u; nInner < descriptor.
dataLevels_; ++nInner)
673 const unsigned int distance = Descriptor::calculateHammingDistance<tSize * 8u>(outerData.data(), innerData.data());
682 ocean_assert(bestDistance != (
unsigned int)(-1));
687 template <
size_t tSize>
693 template <
size_t tSize>
699 template <
size_t tSize>
702 ocean_assert(framePyramid.
isValid());
703 ocean_assert(points !=
nullptr && pointsSize != 0u);
704 ocean_assert(pointsPyramidLevel < framePyramid.
layers());
705 ocean_assert(freakDescriptors !=
nullptr);
706 ocean_assert(inverseFocalLength > 0.0f);
710 worker->
executeFunction(
Worker::Function::createStatic(&
FREAKDescriptorT<tSize>::computeDescriptorsSubset, &framePyramid, points, pointsSize, pointsPyramidLevel, freakDescriptors, inverseFocalLength, &projectionDerivativeDataCallback, 0u, 0u), 0u, (
unsigned int)pointsSize);
718 template <
size_t tSize>
722 0.0f, -14.7216f, -14.7216f, 0.0f, 14.7216f, 14.7216f, -6.3745f, -12.749f, -6.3745f, 6.3745f,
723 12.749f, 6.3745f, 0.0f, -7.97392f, -7.97392f, 0.0f, 7.97392f, 7.97392f, -3.18725f, -6.3745f,
724 -3.18725f, 3.18725f, 6.3745f, 3.18725f, 0.0f, -3.67983f, -3.67983f, 0.0f, 3.67983f, 3.67983f,
725 -1.4163f, -2.8326f, -1.4163f, 1.4163f, 2.8326f, 1.4163f, 0.0f, -1.84049f, -1.84049f, 0.0f,
726 1.84049f, 1.84049f, 0.0f
730 template <
size_t tSize>
734 16.9991f, 8.49895f, -8.49895f, -16.9991f, -8.49895f, 8.49895f, 11.0406f, 0.0f, -11.0406f, -11.0406f,
735 0.0f, 11.0406f, 9.2071f, 4.60355f, -4.60355f, -9.2071f, -4.60355f, 4.60355f, 5.52032f, 0.0f,
736 -5.52032f, -5.52032f, 0.0f, 5.52032f, 4.25005f, 2.12445f, -2.12445f, -4.25005f, -2.12445f, 2.12445f,
737 2.4536f, 0.0f, -2.4536f, -2.4536f, 0.0f, 2.4536f, 2.12445f, 1.0628f, -1.0628f, -2.12445f,
738 -1.0628f, 1.0628f, 0.0f
742 template <
size_t tSize>
746 {37, 4}, {38, 4}, {12, 0}, {39,10}, {27, 7}, {37,29}, {20,16}, {33,16}, {14, 0}, {31, 3},
747 {17, 4}, {24,12}, {33,22}, {31, 7}, {35,30}, {25, 6}, {34,31}, {20,19}, {22,17}, {16, 6},
748 {23, 5}, {26,10}, {13, 5}, {31,17}, {17,10}, {31,28}, {22, 4}, {29,11}, {28, 2}, {29,19},
749 {30, 6}, {37,10}, {31, 2}, {41,13}, {14, 7}, {15, 3}, {33, 4}, {18,17}, {23,19}, {33,28},
750 {41,24}, {34,16}, { 7, 1}, {26, 5}, {36,13}, {42, 9}, {20,14}, {27,26}, {41, 6}, {40,19},
751 {26, 3}, {36,29}, {23,13}, {40, 7}, {18, 0}, {28,22}, {22, 9}, {26,16}, {21,16}, {39,20},
752 { 8, 3}, {14, 1}, {12,11}, {31,25}, {29, 4}, {15, 1}, {41,22}, {35, 1}, {26, 2}, {34,14},
753 {25, 1}, {34,17}, {34,29}, {16,14}, {19, 3}, {26,14}, {15, 5}, {25,17}, {25, 5}, {34,25},
754 { 6, 0}, {23,10}, {29,24}, {28,16}, {20, 3}, { 7, 4}, {25,11}, {36,24}, {27, 9}, {11,10},
755 {23, 7}, {32,19}, {32,16}, {37,18}, {25,24}, {19, 1}, {22,20}, {38,14}, {41,31}, {16,10},
756 {19, 6}, {16,11}, {31,20}, { 8, 0}, {14, 2}, {19, 0}, {37,13}, {34, 4}, {31,14}, { 6, 1},
757 {40, 1}, {24,18}, {41, 1}, {41, 7}, {36,23}, {40,20}, {40,27}, {13, 0}, {19,12}, {42,38},
758 {16, 7}, {34, 7}, { 9, 2}, {28, 4}, {11, 5}, {40,38}, {17, 2}, { 5, 0}, {19,14}, {12, 6},
759 {19,17}, {40,22}, {26, 7}, {19, 5}, {19,11}, {28,26}, {12, 1}, {34, 0}, { 5, 1}, {27,16},
760 {21,15}, {29,25}, {19, 8}, {32,26}, {37,17}, {11, 6}, {22, 6}, {39,27}, {41,37}, {21, 5},
761 {14,11}, {31,16}, {38,28}, {16, 0}, {29,10}, {31,26}, {10, 1}, {22,13}, {10, 3}, {17, 3},
762 {42,30}, { 8, 4}, {26, 6}, {22, 8}, {38,27}, {26,22}, {41,10}, {42,13}, {40,34}, {13, 7},
763 {30,11}, {38,22}, {33,27}, {19,15}, {29, 7}, {31,10}, {26,15}, {13,12}, {29, 2}, { 5, 3},
764 {15, 7}, {28,10}, {29,17}, {40,10}, {21, 1}, {15,10}, {37,11}, {40,13}, {26, 1}, {39,21},
765 {34,21}, {40,31}, {19, 7}, {16, 5}, {40,39}, {37, 7}, {30,23}, {10, 9}, {36,30}, {38, 0},
766 {18, 6}, {40,32}, {38,10}, {22, 3}, {26,19}, {18,13}, {39,22}, {35,17}, {31,19}, {18,11},
767 {28,19}, {28, 0}, {37,31}, {30, 7}, {27,20}, {34,10}, {38, 3}, {37,23}, {18, 7}, {38,20},
768 {25,19}, {20, 7}, {22,18}, { 7, 3}, {15, 2}, {23,12}, {26,13}, {38, 7}, {11, 1}, {20, 8},
769 {33,21}, {37,36}, {17,16}, {36,35}, {41, 2}, {37,35}, {37, 2}, {15,14}, {10, 7}, {41,29},
770 { 7, 6}, {32,22}, {34,26}, {33, 2}, {38,26}, {31, 0}, {11, 3}, {24,23}, {13,11}, {41,19},
771 {41,25}, {30,13}, {27,10}, {39,38}, {21, 3}, {31, 4}, {27,14}, {37,24}, {20, 2}, {25,23},
772 {29, 1}, {39,28}, {17, 0}, { 7, 0}, { 9, 5}, {22, 2}, {33,32}, {27,21}, {30,25}, {41,23},
773 {41,30}, {15, 9}, {22,10}, {31,22}, {29, 5}, {34,20}, {24,13}, {31,11}, {36,25}, {21,19},
774 {19,13}, {30,29}, {33, 5}, { 6, 4}, { 5, 2}, { 8, 2}, {10, 2}, {25,13}, {37,19}, {28,14},
775 {15, 4}, {10, 8}, {12, 5}, {14,13}, {24, 1}, {31,12}, {14,10}, {32,27}, {19,18}, {32, 4},
776 {22, 1}, {39,26}, {17,14}, { 2, 1}, { 1, 0}, {35,23}, {34, 2}, {33,19}, {13, 3}, {39,16},
777 {25, 2}, {41, 4}, {28, 7}, {31,21}, {26, 4}, {39,19}, {24,17}, {28,20}, {21, 8}, {25, 7},
778 {34,15}, {41,36}, {16, 3}, {21,20}, {31,15}, {26,20}, {14, 5}, {38,16}, {40, 2}, {18,10},
779 {27, 8}, {29,13}, {41,18}, {18,12}, {40,26}, {36, 0}, {21,14}, {22, 0}, {27, 2}, {11, 0},
780 {21,10}, {20,10}, {23, 6}, {13, 4}, {28,21}, {22,16}, {25,22}, {35,24}, { 4, 0}, {31, 1},
781 {32,21}, {21, 4}, {37, 6}, {15, 8}, { 8, 7}, {29,22}, {28,15}, {25,18}, {41,35}, {39,14},
782 {34,12}, {23,17}, {25,10}, {39, 9}, {34,13}, {22,14}, { 7, 2}, {20, 9}, {28,11}, {10, 4},
783 {40, 0}, {35,13}, {38,32}, {13, 2}, {39, 1}, { 2, 0}, {38,19}, {41,11}, {32,28}, {39,33},
784 {30,17}, {16, 2}, {17, 6}, {13,10}, { 4, 1}, {10, 0}, {22,19}, { 4, 3}, {12, 7}, {26,21},
785 { 9, 0}, {19,16}, {34,28}, {16, 9}, { 9, 8}, {23, 0}, { 7, 5}, {10, 5}, {34,18}, {14, 6},
786 {30, 5}, {31,18}, {20,15}, {34,22}, {35,12}, {23, 1}, {35,10}, { 9, 3}, {27,15}, {17,13},
787 {37,30}, {26, 0}, {28,17}, {38,33}, {38, 5}, {16, 4}, {13, 1}, {28, 3}, { 5, 4}, {12, 2},
788 {17, 9}, {31,29}, {22,11}, {40,17}, {25, 4}, {28,27}, {29, 6}, {34, 1}, {14, 8}, {32,15},
789 {39,32}, { 6, 5}, {19, 4}, {18, 5}, {32,20}, {38,13}, {12,10}, {24, 0}, {22,15}, {36,18},
790 { 6, 3}, {34,23}, {33,15}, {22, 7}, {22,12}, {40,28}, {35,18}, {22, 5}, {29,23}, {37,34},
791 {16,13}, {23,18}, {37,22}, {29,12}, {19, 2}, {14, 9}, {34,19}, {19,10}, {25,12}, {38,21},
792 {28, 1}, {33,20}, {27, 4}, {11, 7}, {31,23}, {17, 7}, {17, 8}, {39, 8}, {40,21}, {16,15},
793 {17, 5}, {30,18}, {39, 7}, {37,25}, {41,34}, {30,24}, {18, 1}, { 3, 1}, { 9, 4}, {22,21},
794 {31, 5}, {40, 3}, {35,25}, {32, 2}, { 4, 2}, {38,31}, {14, 3}, {21, 9}, {17,12}, {16, 1},
795 {35,29}, {23,22}, {20, 1}, {34, 3}, {17, 1}, {13, 6}, {40,14}, {17,11}, {38,17}, {40,16},
796 {20, 4}, {23,11}, {12, 4}, { 3, 2}, {40,33}, {14, 4}, {21, 2}, {33,26}, {38,34}, {29,18},
801 template <
size_t tSize>
804 template <
size_t tSize>
807 template <
size_t tSize>
808 const int FREAKDescriptorT<tSize>::kernelRadius2X[
kernelRadius2Elements] = { 0, -1, 0, 1, -2, -1, 0, 1, 2, -1, 0, 1, 0 };
810 template <
size_t tSize>
811 const int FREAKDescriptorT<tSize>::kernelRadius2Y[
kernelRadius2Elements] = { -2, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 2 };
813 template <
size_t tSize>
817 0, -2, -1, 0, 1, 2, -2, -1, 0, 1,
818 2, -3, -2, -1, 0, 1, 2, 3, -2, -1,
819 0, 1, 2, -2, -1, 0, 1, 2, 0
823 template <
size_t tSize>
827 -3, -2, -2, -2, -2, -2, -1, -1, -1, -1,
828 -1, 0, 0, 0, 0, 0, 0, 0, 1, 1,
829 1, 1, 1, 2, 2, 2, 2, 2, 3
833 template <
size_t tSize>
837 0, -3, -2, -1, 0, 1, 2, 3, -4, -3,
838 -2, -1, 0, 1, 2, 3, 4, -5, -4, -3,
839 -2, -1, 0, 1, 2, 3, 4, 5, -6, -5,
840 -4, -3, -2, -1, 0, 1, 2, 3, 4, 5,
841 6, -6, -5, -4, -3, -2, -1, 0, 1, 2,
842 3, 4, 5, 6, -6, -5, -4, -3, -2, -1,
843 0, 1, 2, 3, 4, 5, 6, -7, -6, -5,
844 -4, -3, -2, -1, 0, 1, 2, 3, 4, 5,
845 6, 7, -6, -5, -4, -3, -2, -1, 0, 1,
846 2, 3, 4, 5, 6, -6, -5, -4, -3, -2,
847 -1, 0, 1, 2, 3, 4, 5, 6, -6, -5,
848 -4, -3, -2, -1, 0, 1, 2, 3, 4, 5,
849 6, -5, -4, -3, -2, -1, 0, 1, 2, 3,
850 4, 5, -4, -3, -2, -1, 0, 1, 2, 3,
851 4, -3, -2, -1, 0, 1, 2, 3, 0
855 template <
size_t tSize>
859 -7, -6, -6, -6, -6, -6, -6, -6, -5, -5,
860 -5, -5, -5, -5, -5, -5, -5, -4, -4, -4,
861 -4, -4, -4, -4, -4, -4, -4, -4, -3, -3,
862 -3, -3, -3, -3, -3, -3, -3, -3, -3, -3,
863 -3, -2, -2, -2, -2, -2, -2, -2, -2, -2,
864 -2, -2, -2, -2, -1, -1, -1, -1, -1, -1,
865 -1, -1, -1, -1, -1, -1, -1, 0, 0, 0,
866 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
867 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
868 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
869 2, 2, 2, 2, 2, 2, 2, 2, 3, 3,
870 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
871 3, 4, 4, 4, 4, 4, 4, 4, 4, 4,
872 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,
873 5, 6, 6, 6, 6, 6, 6, 6, 7
877 template <
size_t tSize>
880 ocean_assert(pointPyramidLevel < pyramid.
layers());
881 ocean_assert(inverseFocalLength > 0.0f);
885 if (pointPyramidLevel + 1u >= pyramid.
layers())
893 ocean_assert(freakDescriptor.
isValid() ==
false);
897 Eigen::Matrix<float, 2, 2> cellDeformationMatrix;
908 for (
size_t i = 0; i < FREAKDescriptorT<tSize>::numberOfCells; ++i)
911 warpedCellX[i] = warpedCell[0];
912 warpedCellY[i] = warpedCell[1];
921 const float scaleFactors[3] = { 1.0f, 1.2599f, 1.5874f };
922 for (
size_t scaleLevel = 0; scaleLevel < 3; ++scaleLevel)
925 bool computationFailed =
false;
937 unsigned int cellId = 0u;
940 for (; cellId < 12u; ++cellId)
942 ocean_assert(pointPyramidLevel + 1u < pyramid.
layers());
943 const Frame& nextFramePyramidLayer = pyramid.
layer(pointPyramidLevel + 1u);
945 const float cellX = point[0] + scaleFactors[scaleLevel] * warpedCellX[cellId];
946 const float cellY = point[1] + scaleFactors[scaleLevel] * warpedCellY[cellId];
952 if (cellXi - 1 < 0 || cellXi + 1 >=
int(nextFramePyramidLayer.
width()) || cellYi - 1 < 0 || cellYi + 1 >=
int(nextFramePyramidLayer.
height()))
954 computationFailed =
true;
958 ocean_assert(cellXi >= 0 && cellXi <
int(nextFramePyramidLayer.
width()) && cellYi >= 0 && cellYi <
int(nextFramePyramidLayer.
height()));
962 computationFailed =
true;
968 const Frame& currentFramePyramidLayer = pyramid.
layer(pointPyramidLevel);
970 ocean_assert(cellId == 12u || computationFailed ==
true);
971 for (; computationFailed ==
false && cellId < 24u; ++cellId)
973 const float cellX = point[0] + scaleFactors[scaleLevel] * warpedCellX[cellId];
974 const float cellY = point[1] + scaleFactors[scaleLevel] * warpedCellY[cellId];
979 ocean_assert(cellXi >= 0 && cellXi <
int(currentFramePyramidLayer.
width()) && cellYi >= 0 && cellYi <
int(currentFramePyramidLayer.
height()));
983 computationFailed =
true;
989 ocean_assert(cellId == 24u || computationFailed ==
true);
990 for (; computationFailed ==
false && cellId < 30u; ++cellId)
992 const float cellX = point[0] + scaleFactors[scaleLevel] * warpedCellX[cellId];
993 const float cellY = point[1] + scaleFactors[scaleLevel] * warpedCellY[cellId];
998 ocean_assert(cellXi >= 0 && cellXi <
int(currentFramePyramidLayer.
width()) && cellYi >= 0 && cellYi <
int(currentFramePyramidLayer.
height()));
1001 computationFailed =
true;
1007 ocean_assert(cellId == 30u || computationFailed ==
true);
1008 for (; computationFailed ==
false && cellId < FREAKDescriptorT<tSize>::numberOfCells; ++cellId)
1010 const float cellX = point[0] + scaleFactors[scaleLevel] * warpedCellX[cellId];
1011 const float cellY = point[1] + scaleFactors[scaleLevel] * warpedCellY[cellId];
1016 ocean_assert(cellXi >= 0 && cellXi <
int(currentFramePyramidLayer.
width()) && cellYi >= 0 && cellYi <
int(currentFramePyramidLayer.
height()));
1020 computationFailed =
true;
1025 if (computationFailed)
1032 for (
size_t i = 0; i < tSize; ++i)
1034 uint8_t partialDescriptor = 0u;
1036 for (
size_t j = 0; j < 8; ++j)
1038 partialDescriptor = uint8_t(partialDescriptor << 1u);
1040 const size_t pair = i * 8 + j;
1047 partialDescriptor = partialDescriptor | 1u;
1050 freakDescriptor.
data_[scaleLevel][i] = partialDescriptor;
1053 freakDescriptor.
dataLevels_ = (
unsigned int)(scaleLevel + 1);
1058 return freakDescriptor.
isValid();
1061 template <
size_t tSize>
1062 template <
bool tEnableBorderChecks>
1065 ocean_assert(framePyramidLayer.
isValid());
1066 ocean_assert(kernelX !=
nullptr && kernelY !=
nullptr && kernelElements != 0u);
1068 const unsigned int width = framePyramidLayer.
width();
1069 const unsigned int height = framePyramidLayer.
height();
1070 const unsigned int frameStrideElements = framePyramidLayer.
strideElements();
1073 if constexpr (tEnableBorderChecks)
1075 unsigned int sum = 0u;
1076 unsigned int sumElements = 0u;
1078 for (
size_t i = 0; i < kernelElements; ++i)
1080 const int x = cellX + kernelX[i];
1081 const int y = cellY + kernelY[i];
1083 if (x >= 0 && x <
int(width) && y >= 0 && y <
int(height))
1085 sum += frame[(
unsigned int)y * frameStrideElements + (
unsigned int)x];
1090 ocean_assert(sumElements != 0u);
1091 ocean_assert(
float(sum) /
float(sumElements) <= 255.0f);
1093 averageIntensity =
PixelType(
float(sum) /
float(sumElements));
1097 unsigned int sum = 0u;
1099 for (
size_t i = 0; i < kernelElements; ++i)
1101 const int x = cellX + kernelX[i];
1102 const int y = cellY + kernelY[i];
1103 ocean_assert_and_suppress_unused(x >= 0 && x <
int(width) && y >= 0 && y <
int(height), height);
1105 sum += frame[(
unsigned int)y * frameStrideElements + (
unsigned int)x];
1108 ocean_assert(
float(sum) /
float(kernelElements) <= 255.0f);
1110 averageIntensity =
PixelType(
float(sum) /
float(kernelElements));
1116 template <
size_t tSize>
1119 ocean_assert(framePyramid !=
nullptr && framePyramid->
isValid());
1120 ocean_assert(points !=
nullptr && pointsSize != 0u);
1121 ocean_assert(pointsPyramidLevel < framePyramid->layers());
1122 ocean_assert(freakDescriptor !=
nullptr);
1123 ocean_assert(inverseFocalLength > 0.0f);
1124 ocean_assert(cameraDerivativeFunctor !=
nullptr);
1125 ocean_assert_and_suppress_unused(firstPoint + numberOfPoints <= pointsSize && numberOfPoints != 0u, pointsSize);
1127 for (
unsigned int i = firstPoint; i < firstPoint + numberOfPoints; ++i)
1129 ocean_assert(i < pointsSize);
1131 computeDescriptor(*framePyramid, points[i], pointsPyramidLevel, freakDescriptor[i],
data.unprojectRayIF, inverseFocalLength,
data.pointJacobianMatrixIF);
1135 template <
size_t tSize>
1138 ocean_assert(pyramid.
isValid());
1139 ocean_assert(pointPyramidLevel < pyramid.
layers());
1142 ocean_assert(inverseFocalLengthX > 0);
1143 ocean_assert(projectionJacobianMatrix.IsRowMajor ==
false);
1147 const Eigen::Vector3f directionY(0, 1, 0);
1148 const Eigen::Vector3f nx = directionY.cross(unprojectRayIF).normalized() * inverseFocalLengthX;
1149 const Eigen::Vector3f ny = unprojectRayIF.cross(nx);
1153 Eigen::Matrix<float, 3, 2> N;
1156 const Eigen::Matrix<float, 2, 2> initialDeformationMatrix = projectionJacobianMatrix * N;
1160 constexpr
float cornerX[4] = {-7.0f, -7.0f, 7.0f, 7.0f};
1161 constexpr
float cornerY[4] = {-7.0f, 7.0f, -7.0f, 7.0f};
1162 const Frame& framePyramidLevel = pyramid.
layer(pointPyramidLevel);
1164 for (
size_t i = 0; i < 4; ++i)
1166 const Eigen::Vector2f warpedCorner = point + initialDeformationMatrix * Eigen::Vector2f(cornerX[i], cornerY[i]);
1171 if (x >= framePyramidLevel.
width() || y >= framePyramidLevel.
height())
1181 const unsigned int strideElements = framePyramidLevel.
strideElements();
1184 for (
size_t i = 0; i < FREAKDescriptorT<tSize>::kernelRadius7Elements; ++i)
1191 ocean_assert(((
unsigned int)(v) * strideElements + (
unsigned int)(u)) < framePyramidLevel.
size());
1192 const int intensity = int(
data[(
unsigned int)(v) * strideElements + (
unsigned int)(u)]);
1199 if (magnitudeX == 0 && magnitudeY == 0)
1206 const Eigen::Vector3f gy = (nx * float(magnitudeX) + ny * float(magnitudeY)).normalized() * inverseFocalLengthX;
1207 const Eigen::Vector3f gx = gy.cross(unprojectRayIF);
1209 Eigen::Matrix<float, 3, 2> G;
1213 deformationMatrix = projectionJacobianMatrix * G;
1217 const Eigen::Vector2f patchY = projectionJacobianMatrix * gy;
1224 template <
size_t tSize>
1228 ocean_assert(kernelWidth != 0u && kernelWidth % 2u == 1u);
1229 ocean_assert(kernelHeight != 0u && kernelHeight % 2u == 1u);
1230 ocean_assert(layers >= 1u);
1232 Frame reusableFrame;
1236 FramePyramid framePyramid(frame, downsamplingFunction, layers,
true , worker);
1238 if (framePyramid.
layers() != layers)
1243 return framePyramid;
1246 template <
size_t tSize>
1249 ocean_assert(finerLayer.
isValid());
1250 ocean_assert(coarserLayer.
isValid());
1252 ocean_assert(kernelWidth >= 1u && kernelWidth % 2u == 1u);
1253 ocean_assert(kernelHeight >= 1u && kernelHeight % 2u == 1u);
1258 if (!reusableFrame.
set(finerLayer.
frameType(),
false ,
true ))
1260 ocean_assert(
false &&
"This should never happen!");
1264 ocean_assert(reusableFrame.
isValid());
1266 const Frame* sourceLayer = &finerLayer;
1268 if (kernelWidth <= finerLayer.
width() && kernelHeight <= finerLayer.
height())
1270 if (!CV::FrameFilterGaussian::filter<uint8_t, uint32_t>(finerLayer.
constdata<uint8_t>(), reusableFrame.
data<uint8_t>(), finerLayer.
width(), finerLayer.
height(), finerLayer.
channels(), finerLayer.
paddingElements(), reusableFrame.
paddingElements(), kernelWidth, kernelHeight, -1.0f, worker))
1275 sourceLayer = &reusableFrame;
1283 template <
size_t tSize>
1284 bool FREAKDescriptorT<tSize>::extractHarrisCornersAndComputeDescriptors(
const Frame& yFrame,
const unsigned int maxFrameArea,
const unsigned int minFrameArea,
const unsigned int expectedHarrisCorners640x480,
const Scalar harrisCornersReductionScale,
const unsigned int harrisCornerThreshold,
const float inverseFocalLength,
const CameraDerivativeFunctor& cameraDerivativeFunctor,
HarrisCorners& corners,
Indices32& cornerPyramidLevels, std::vector<
FREAKDescriptorT<tSize>>& descriptors,
const bool removeInvalid,
const Scalar border,
const bool determineExactHarrisCornerPositions,
const bool yFrameIsUndistorted,
Worker* worker)
1287 ocean_assert(minFrameArea != 0u && minFrameArea <= maxFrameArea);
1288 ocean_assert(expectedHarrisCorners640x480 != 0u);
1289 ocean_assert(harrisCornersReductionScale >
Scalar(0) && harrisCornersReductionScale <
Scalar(1));
1290 ocean_assert(harrisCornerThreshold <= 512u);
1291 ocean_assert(inverseFocalLength > 0.0f);
1295 cornerPyramidLevels.clear();
1296 descriptors.clear();
1300 const unsigned int frameArea = yFrame.
width() * yFrame.
height();
1303 ocean_assert(startLayerIndex <= lastLayerIndex);
1318 const unsigned int startLayerArea = pyramid[startLayerIndex].
width() * pyramid[startLayerIndex].
height();
1323 expectedHarrisCornersOnLevel = (
unsigned int)(
Scalar(expectedHarrisCornersOnLevel) * (
Scalar(1) - harrisCornersReductionScale) / (
Scalar(1) - std::pow(harrisCornersReductionScale,
Scalar(lastLayerIndex - startLayerIndex))));
1325 const Scalar expectedHarrisCornersOnStartLayerF =
Scalar(expectedHarrisCorners640x480) *
Scalar(startLayerArea) /
Scalar(640u * 480u);
1326 unsigned int expectedHarrisCornersOnLevel = (
unsigned int)
Numeric::round32(expectedHarrisCornersOnStartLayerF * (
Scalar(1) - harrisCornersReductionScale) / (
Scalar(1) - std::pow(harrisCornersReductionScale,
Scalar(lastLayerIndex - startLayerIndex))));
1331 for (
unsigned int layer = startLayerIndex; layer <= lastLayerIndex; ++layer)
1333 ocean_assert(layer + 1u < pyramid.
layers());
1334 ocean_assert(corners.size() == descriptors.size());
1335 ocean_assert(corners.size() == cornerPyramidLevels.size());
1337 if (expectedHarrisCornersOnLevel == 0u)
1342 const Frame& pyramidLayer = pyramid[layer];
1355 if (harrisCornersOnLevel.empty())
1362 ocean_assert(corners.size() == descriptors.size());
1363 ocean_assert(corners.size() == cornerPyramidLevels.size());
1364 const size_t firstNewCornerIndex = corners.size();
1366 if (harrisCornersOnLevel.size() > expectedHarrisCornersOnLevel)
1370 std::sort(harrisCornersOnLevel.begin(), harrisCornersOnLevel.end());
1372 unsigned int horizontalBins = 0u;
1373 unsigned int verticalBins = 0u;
1375 ocean_assert(horizontalBins != 0u && verticalBins != 0u);
1377 const HarrisCorners newCorners = Geometry::SpatialDistribution::distributeAndFilter<HarrisCorner, HarrisCorner::corner2imagePoint>(harrisCornersOnLevel.data(), harrisCornersOnLevel.size(), border, border,
Scalar(pyramidLayer.
width()) -
Scalar(2) * border,
Scalar(pyramidLayer.
height()) -
Scalar(2) * border, horizontalBins, verticalBins,
size_t(expectedHarrisCornersOnLevel));
1379 corners.insert(corners.end(), newCorners.begin(), newCorners.end());
1383 for (
const HarrisCorner& corner : harrisCornersOnLevel)
1385 if (corner.observation().x() >= border && corner.observation().x() <
Scalar(pyramidLayer.
width()) - border &&
1386 corner.observation().y() >= border && corner.observation().y() <
Scalar(pyramidLayer.
height()) - border)
1388 corners.emplace_back(corner);
1393 ocean_assert(firstNewCornerIndex <= corners.size());
1394 const size_t newCornersAdded = corners.size() - firstNewCornerIndex;
1396 if (newCornersAdded == 0)
1401 ocean_assert(firstNewCornerIndex + newCornersAdded == corners.size());
1403 #if defined(OCEAN_DEBUG)
1404 for (
size_t i = firstNewCornerIndex; i < corners.size(); ++i)
1406 ocean_assert(corners[i].observation().x() >= border && corners[i].observation().x() <=
Scalar(pyramidLayer.
width()) - border);
1407 ocean_assert(corners[i].observation().y() >= border && corners[i].observation().y() <=
Scalar(pyramidLayer.
height()) - border);
1413 cornerPyramidLevels.insert(cornerPyramidLevels.end(), newCornersAdded, layer);
1417 std::vector<Eigen::Vector2f> observations;
1418 observations.reserve(newCornersAdded);
1420 for (
size_t i = firstNewCornerIndex; i < corners.size(); ++i)
1422 observations.emplace_back(
float(corners[i].observation().x()),
float(corners[i].observation().y()));
1434 const float inverseFocalLengthAtLayer = float(1u << layer) * inverseFocalLength;
1438 ocean_assert(corners.size() > descriptors.size());
1439 descriptors.resize(corners.size());
1441 ocean_assert(descriptors.begin() +
size_t(firstNewCornerIndex) + observations.size() == descriptors.end());
1444 expectedHarrisCornersOnLevel = (
unsigned int)
Numeric::round32(
Scalar(expectedHarrisCornersOnLevel) * harrisCornersReductionScale);
1446 ocean_assert(corners.size() == descriptors.size());
1447 ocean_assert(corners.size() == cornerPyramidLevels.size());
1450 ocean_assert(corners.size() == descriptors.size());
1451 ocean_assert(corners.size() == cornerPyramidLevels.size());
1453 if (removeInvalid && corners.empty() ==
false)
1456 while (i < corners.size())
1464 ocean_assert(corners.empty() ==
false);
1465 corners[i] = corners.back();
1468 cornerPyramidLevels[i] = cornerPyramidLevels.back();
1469 cornerPyramidLevels.pop_back();
1471 descriptors[i] = descriptors.back();
1472 descriptors.pop_back();
1477 ocean_assert(corners.size() == descriptors.size());
1478 ocean_assert(corners.size() == cornerPyramidLevels.size());
This class implements the abstract base class for all AnyCamera objects.
Definition: AnyCamera.h:130
virtual VectorT3< T > vectorIF(const VectorT2< T > &distortedImagePoint, const bool makeUnitVector=true) const =0
Returns a vector starting at the camera's center and intersecting a given 2D point in the image.
virtual void pointJacobian2x3IF(const VectorT3< T > &flippedCameraObjectPoint, T *jx, T *jy) const =0
Calculates the 2x3 jacobian matrix for the 3D object point projection into the camera frame.
Functor that can be used to obtain the 2x3 Jacobian of the camera projection matrix wrt.
Definition: FREAKDescriptor.h:186
SharedAnyCameras cameras_
The camera instance used to compute the Jacobian matrix and unprojection ray at the finest layer of a...
Definition: FREAKDescriptor.h:221
unsigned int supportedPyramidLevels() const override
Returns the maximum number of pyramid levels for which camera derivative data can be computed.
Definition: FREAKDescriptor.h:597
AnyCameraDerivativeFunctor(const SharedAnyCamera &camera, const unsigned int pyramidLevels=1u)
Constructs a valid functor to compute pinhole camera derivative data.
Definition: FREAKDescriptor.h:564
FREAKDescriptorT< tSize >::CameraDerivativeData computeCameraDerivativeData(const Eigen::Vector2f &point, const unsigned int pointPyramidLevel) const override
Computes the point Jacobian of the projection matrix and unprojection ray for a specified point.
Definition: FREAKDescriptor.h:590
Base class to compute the Jacobian of the camera projection matrix wrt.
Definition: FREAKDescriptor.h:117
virtual ~CameraDerivativeFunctor()=default
Default destructor.
virtual FREAKDescriptorT< tSize >::CameraDerivativeData computeCameraDerivativeData(const Eigen::Vector2f &point, const unsigned int pointPyramidLevel=0u) const =0
Purely virtual function to compute the camera derivative data; has to be implemented in any derived c...
virtual unsigned int supportedPyramidLevels() const =0
Returns the maximum number of pyramid levels for which camera derivative data can be computed.
Functor that can be used to obtain the 2x3 Jacobian of the camera projection matrix wrt.
Definition: FREAKDescriptor.h:144
PinholeCameraDerivativeFunctor(const PinholeCamera &pinholeCamera, const unsigned int pyramidLevels=1u)
Constructs a valid functor to compute pinhole camera derivative data.
Definition: FREAKDescriptor.h:499
unsigned int supportedPyramidLevels() const override
Returns the maximum number of pyramid levels for which camera derivative data can be computed.
Definition: FREAKDescriptor.h:534
FREAKDescriptorT< tSize >::CameraDerivativeData computeCameraDerivativeData(const Eigen::Vector2f &point, const unsigned int pointPyramidLevel) const override
Computes the point Jacobian of the projection matrix and unprojection ray for a specified point.
Definition: FREAKDescriptor.h:527
PinholeCameras cameras_
The camera instance used to compute the Jacobian matrix and unprojection ray at the finest layer of a...
Definition: FREAKDescriptor.h:179
Forward-declaration of the descriptor class.
Definition: FREAKDescriptor.h:84
MultilevelDescriptorData data_
The actual FREAK descriptor data.
Definition: FREAKDescriptor.h:492
static const float cellsY[numberOfCells]
The pre-defined vertical coordinates of the cells.
Definition: FREAKDescriptor.h:442
static const std::uint8_t cellPairs[numberOfCellPairs][2]
The pre-defined pairs of cell indices that uare used to compute the actual binary descriptor (pairs h...
Definition: FREAKDescriptor.h:448
static constexpr size_t kernelRadius3Elements
Number of elements in the circular kernel with radius 3.
Definition: FREAKDescriptor.h:469
static const float cellsX[numberOfCells]
The pre-defined horizontal coordinates of the cells.
Definition: FREAKDescriptor.h:439
static bool computeLocalDeformationMatrixAndOrientation(const FramePyramid &framePyramid, const Eigen::Vector2f &point, const unsigned int pointPyramidLevel, const Eigen::Vector3f &unprojectRayIF, const float inverseFocalLength, const PointJacobianMatrix2x3 &pointJacobianMatrix2x3, Eigen::Matrix< float, 2, 2 > &deformationMatrix, float &orientation)
Computes the transformation to deform receptive fields and the orientation of the descriptor.
Definition: FREAKDescriptor.h:1136
static bool extractHarrisCornersAndComputeDescriptors(const Frame &yFrame, const unsigned int maxFrameArea, const unsigned int minFrameArea, const unsigned int expectedHarrisCorners640x480, const Scalar harrisCornersReductionScale, const unsigned int harrisCornerThreshold, const float inverseFocalLength, const CameraDerivativeFunctor &cameraDerivativeFunctor, HarrisCorners &corners, Indices32 &cornerPyramidLevels, std::vector< FREAKDescriptorT< tSize >> &descriptors, const bool removeInvalid=false, const Scalar border=Scalar(20), const bool determineExactHarrisCornerPositions=false, const bool yFrameIsUndistorted=true, Worker *worker=nullptr)
Extract Harris corners from an image pyramid and compute FREAK descriptors.
Definition: FREAKDescriptor.h:1284
static constexpr size_t numberOfCellPairs
The number of pre-defined pairs of cell indices that are used to compute the actual binary descriptor...
Definition: FREAKDescriptor.h:445
FREAKDescriptorT(const FREAKDescriptorT< tSize > &)=default
Creates a new FREAK descriptor object by copying from an existing one.
FREAKDescriptorT()=default
Creates a new and invalid FREAK descriptor object.
static const int kernelRadius1Y[kernelRadius1Elements]
The pre-defined vertical coordinates of the circular kernel with radius 1.
Definition: FREAKDescriptor.h:457
OCEAN_FORCE_INLINE unsigned int distance(const FREAKDescriptorT< tSize > &descriptor) const
Returns the distance between this descriptor and a second descriptor.
Definition: FREAKDescriptor.h:659
static void computeDescriptorsSubset(const FramePyramid *framePyramid, const Eigen::Vector2f *points, const size_t pointsSize, const unsigned int pointPyramidLevel, FREAKDescriptorT< tSize > *freakDescriptors, const float inverseFocalLength, const CameraDerivativeFunctor *cameraDerivativeFunctor, const unsigned int firstPoint, const unsigned int numberOfPoints)
Compute a FREAK descriptor for a single point.
Definition: FREAKDescriptor.h:1117
float orientation() const
Returns the orientation of the descriptor in Radian.
Definition: FREAKDescriptor.h:633
static void computeDescriptors(const FramePyramid &framePyramid, const Eigen::Vector2f *points, const size_t pointsSize, const unsigned int pointsPyramidLevel, FREAKDescriptorT< tSize > *freakDescriptors, const float inverseFocalLength, const CameraDerivativeFunctor &cameraDerivativeFunctor, Worker *worker=nullptr)
Compute a FREAK descriptor for a single point This function requires a callback function which is use...
Definition: FREAKDescriptor.h:700
float orientation_
The orientation of this descriptor in radian, range: [-pi, pi].
Definition: FREAKDescriptor.h:489
unsigned int descriptorLevels() const
Returns the number of levels stored in the multi-level descriptor.
Definition: FREAKDescriptor.h:652
std::array< SinglelevelDescriptorData, 3 > MultilevelDescriptorData
Multi-level FREAK descriptor data; if possible, this implementation computes the descriptor at three ...
Definition: FREAKDescriptor.h:99
static const int kernelRadius7X[kernelRadius7Elements]
The pre-defined horizontal coordinates of the circular kernel with radius 7.
Definition: FREAKDescriptor.h:481
static bool blurAndDownsampleByTwo11(const Frame &finerLayer, Frame &coarserLayer, Worker *worker, const unsigned int kernelWidth, const unsigned int kernelHeight, Frame &reusableFrame)
Downsamples a frame by two applying a 1-1 filter after applying a Gaussian blur to the source layer.
Definition: FREAKDescriptor.h:1247
std::array< PixelType, tSize > SinglelevelDescriptorData
Single-level FREAK descriptor.
Definition: FREAKDescriptor.h:96
std::uint8_t PixelType
Typedef for the selected pixel type. This might be turned into a template parameter at some point.
Definition: FREAKDescriptor.h:90
static const int kernelRadius7Y[kernelRadius7Elements]
The pre-defined vertical coordinates of the circular kernel with radius 7.
Definition: FREAKDescriptor.h:484
static constexpr size_t numberOfCells
The number of cells per keypoint that this implementation is using.
Definition: FREAKDescriptor.h:436
static FramePyramid createFramePyramidWithBlur8BitsPerChannel(const Frame &frame, const unsigned int kernelWidth, const unsigned int kernelHeight, const unsigned int layers, Worker *worker=nullptr)
Creates a new pyramid frame for a specific pixel format (a specific number of channels) and applies a...
Definition: FREAKDescriptor.h:1225
unsigned int dataLevels_
Number of valid levels in the multi-level descriptor data above, range: [0, 3].
Definition: FREAKDescriptor.h:495
MultilevelDescriptorData & data()
Returns the descriptor data (writable)
Definition: FREAKDescriptor.h:640
static const int kernelRadius3X[kernelRadius3Elements]
The pre-defined horizontal coordinates of the circular kernel with radius 3.
Definition: FREAKDescriptor.h:472
static const int kernelRadius3Y[kernelRadius3Elements]
The pre-defined vertical coordinates of the circular kernel with radius 3.
Definition: FREAKDescriptor.h:475
static const int kernelRadius2Y[kernelRadius2Elements]
The pre-defined vertical coordinates of the circular kernel with radius 2.
Definition: FREAKDescriptor.h:466
static const int kernelRadius2X[kernelRadius2Elements]
The pre-defined horizontal coordinates of the circular kernel with radius 2.
Definition: FREAKDescriptor.h:463
static constexpr size_t kernelRadius2Elements
Number of elements in the circular kernel with radius 2.
Definition: FREAKDescriptor.h:460
static bool computeAverageCellIntensity(const Frame &framePyramidLayer, int x, int y, const int *kernelX, const int *kernelY, const size_t kernelElements, PixelType &averageIntensity)
Computes the average intensity of a cell.
Definition: FREAKDescriptor.h:1063
static constexpr size_t size()
Returns the length of this descriptor in bytes.
Definition: FREAKDescriptor.h:694
static bool computeDescriptor(const FramePyramid &framePyramid, const Eigen::Vector2f &point, const unsigned int pointPyramidLevel, FREAKDescriptorT< tSize > &freakDescriptor, const Eigen::Vector3f &unprojectRayIF, const float inverseFocalLength, const PointJacobianMatrix2x3 &pointJacobianMatrix2x3)
Compute a FREAK descriptor for a single point.
Definition: FREAKDescriptor.h:878
static const int kernelRadius1X[kernelRadius1Elements]
The pre-defined horizontal coordinates of the circular kernel with radius 1.
Definition: FREAKDescriptor.h:454
static constexpr size_t kernelRadius1Elements
Number of elements in the circular kernel with radius 1.
Definition: FREAKDescriptor.h:451
bool isValid() const
Returns true if this is a valid descriptor.
Definition: FREAKDescriptor.h:688
Eigen::Matrix< float, 2, 3 > PointJacobianMatrix2x3
The Jacobian of the projection matrix at a specific 3D location (ray from projection center to pixel ...
Definition: FREAKDescriptor.h:93
FREAKDescriptorT & operator=(const FREAKDescriptorT< tSize > &) noexcept=default
Copy assignment operator, needs to be defined since there is a custom copy constructor.
static constexpr size_t kernelRadius7Elements
Number of elements in the circular kernel with radius 7.
Definition: FREAKDescriptor.h:478
static bool detectCorners(const uint8_t *yFrame, const unsigned int width, const unsigned int height, const unsigned int yFramePaddingElements, const unsigned int threshold, const bool frameIsUndistorted, HarrisCorners &corners, const bool determineExactPosition=false, Worker *worker=nullptr)
Detects Harris corners inside a given 8 bit grayscale image.
Definition: HarrisCornerDetector.h:397
This class implements a Harris corner.
Definition: HarrisCorner.h:37
This class implements a frame pyramid.
Definition: FramePyramid.h:37
bool isValid() const
Returns whether this pyramid holds at least one frame layer.
Definition: FramePyramid.h:863
std::function< bool(const Frame &sourceLayer, Frame &targetLayer, Worker *worker)> DownsamplingFunction
Definition of a function allowing to downsample a frame.
Definition: FramePyramid.h:82
unsigned int width(const unsigned int layer) const
Returns the width of a given layer.
Definition: FramePyramid.h:766
unsigned int layers() const
Returns the number of layers this pyramid holds.
Definition: FramePyramid.h:761
const FrameType & frameType() const
Returns the frame type of the finest layer.
Definition: FramePyramid.h:811
unsigned int height(const unsigned int layer) const
Returns the height of a given layer.
Definition: FramePyramid.h:772
const Frame & layer(const unsigned int layer) const
Returns the frame of a specified layer.
Definition: FramePyramid.h:723
static void downsampleByTwo8BitPerChannel11(const uint8_t *source, uint8_t *target, const unsigned int sourceWidth, const unsigned int sourceHeight, const unsigned int channels, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, Worker *worker=nullptr)
Reduces the resolution of a given frame by two, applying a 1-1 downsampling.
Definition: FrameShrinker.h:508
static Caller< void > createStatic(typename StaticFunctionPointerMaker< void, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass >::Type function)
Creates a new caller container for a static function with no function parameter.
Definition: Caller.h:2876
This class implements Ocean's image class.
Definition: Frame.h:1792
unsigned int strideElements(const unsigned int planeIndex=0u) const
Returns the number of elements within one row, including optional padding at the end of a row for a s...
Definition: Frame.h:4058
const T * constdata(const unsigned int planeIndex=0u) const
Returns a pointer to the read-only pixel data of a specific plane.
Definition: Frame.h:4168
const FrameType & frameType() const
Returns the frame type of this frame.
Definition: Frame.h:3775
T * data(const unsigned int planeIndex=0u)
Returns a pointer to the pixel data of a specific plane.
Definition: Frame.h:4159
bool isValid() const
Returns whether this frame is valid.
Definition: Frame.h:4448
bool set(const FrameType &frameType, const bool forceOwner, const bool forceWritable=false, const Indices32 &planePaddingElements=Indices32(), const Timestamp ×tamp=Timestamp(false), bool *reallocated=nullptr)
Sets a new frame type for this frame.
unsigned int size(const unsigned int planeIndex=0u) const
Returns the number of bytes necessary for a specific plane including optional padding at the end of p...
Definition: Frame.h:4034
unsigned int paddingElements(const unsigned int planeIndex=0u) const
Returns the optional number of padding elements at the end of each row for a specific plane.
Definition: Frame.h:4042
@ FORMAT_Y8
Pixel format for grayscale images with byte order Y and 8 bits per pixel.
Definition: Frame.h:594
unsigned int width() const
Returns the width of the frame format in pixel.
Definition: Frame.h:3143
uint32_t numberPlanes() const
Returns the number of planes of the pixel format of this frame.
Definition: Frame.h:3183
static bool arePixelFormatsCompatible(const PixelFormat pixelFormatA, const PixelFormat pixelFormatB)
Returns whether two given pixel formats are compatible.
PixelFormat pixelFormat() const
Returns the pixel format of the frame.
Definition: Frame.h:3153
@ DT_UNSIGNED_INTEGER_8
Unsigned 8 bit integer data type (uint8_t).
Definition: Frame.h:41
unsigned int height() const
Returns the height of the frame in pixel.
Definition: Frame.h:3148
bool isPixelFormatCompatible(const PixelFormat pixelFormat) const
Returns whether the pixel format of this frame type is compatible with a given pixel format.
Definition: Frame.h:3198
unsigned int channels() const
Returns the number of individual channels the frame has.
Definition: Frame.h:3173
DataType dataType() const
Returns the data type of the pixel format of this frame.
Definition: Frame.h:3163
static void calculatePointJacobian2x3(Scalar *jx, Scalar *jy, const PinholeCamera &pinholeCamera, const HomogenousMatrix4 &flippedCamera_P_world, const Vector3 &objectPoint, const bool distortImagePoint)
Calculates the two jacobian rows for a given pose and dynamic object point.
static void idealBins(const unsigned int width, const unsigned int height, const size_t numberBins, unsigned int &horizontalBins, unsigned int &verticalBins, const unsigned int minimalHorizontalBins=2u, const unsigned int minimalVerticalBins=2u)
Calculates the ideal number of horizontal and vertical bins for an array if the overall number of bin...
static constexpr bool isInsideRange(const T lower, const T value, const T upper, const T epsilon=NumericT< T >::eps())
Returns whether a value lies between a given range up to a provided epsilon border.
Definition: Numeric.h:2872
static T atan2(const T y, const T x)
Returns the arctangent of a given value in radian.
Definition: Numeric.h:1632
static constexpr T pi()
Returns PI which is equivalent to 180 degree.
Definition: Numeric.h:926
static T log10(const T value)
Returns the logarithm to base 10 of a given value.
Definition: Numeric.h:1711
static constexpr int32_t round32(const T value)
Returns the rounded 32 bit integer value of a given value.
Definition: Numeric.h:2064
static constexpr bool isEqualEps(const T value)
Returns whether a value is smaller than or equal to a small epsilon.
Definition: Numeric.h:2087
unsigned int width() const
Returns the width of the camera image.
Definition: PinholeCamera.h:1300
T principalPointX() const
Returns the x-value of the principal point of the camera image in the pixel domain.
Definition: PinholeCamera.h:1318
bool isValid() const
Returns whether this camera is valid.
Definition: PinholeCamera.h:1572
bool hasDistortionParameters() const
Returns whether this camera object has specified distortion parameters.
Definition: PinholeCamera.h:1293
VectorT3< T > vectorIF(const VectorT2< T > &position, const bool makeUnitVector=true) const
Returns a normalized vector (with length 1) starting at the camera's center and intersecting a given ...
Definition: PinholeCamera.h:2335
unsigned int height() const
Returns the height of the camera image.
Definition: PinholeCamera.h:1306
T inverseFocalLengthX() const
Returns the inverse horizontal focal length parameter.
Definition: PinholeCamera.h:1342
T principalPointY() const
Returns the y-value of the principal point of the camera image in the pixel domain.
Definition: PinholeCamera.h:1324
T inverseFocalLengthY() const
Returns the inverse vertical focal length parameter.
Definition: PinholeCamera.h:1351
const T & y() const noexcept
Returns the y value.
Definition: Vector3.h:812
const T & x() const noexcept
Returns the x value.
Definition: Vector3.h:800
VectorT3< T > normalized() const
Returns the normalized vector.
Definition: Vector3.h:605
const T & z() const noexcept
Returns the z value.
Definition: Vector3.h:824
This class implements a worker able to distribute function calls over different threads.
Definition: Worker.h:33
bool executeFunction(const Function &function, const unsigned int first, const unsigned int size, const unsigned int firstIndex=(unsigned int)(-1), const unsigned int sizeIndex=(unsigned int)(-1), const unsigned int minimalIterations=1u, const unsigned int threadIndex=(unsigned int)(-1))
Executes a callback function separable by two function parameters.
std::vector< Index32 > Indices32
Definition of a vector holding 32 bit index values.
Definition: Base.h:96
std::vector< HarrisCorner > HarrisCorners
Definition of a vector holding Harris corners.
Definition: HarrisCorner.h:24
float Scalar
Definition of a scalar type.
Definition: Math.h:128
std::shared_ptr< AnyCamera > SharedAnyCamera
Definition of a shared pointer holding an AnyCamera object with Scalar precision.
Definition: AnyCamera.h:60
VectorT3< Scalar > Vector3
Definition of a 3D vector.
Definition: Vector3.h:22
PinholeCamerasT< Scalar > PinholeCameras
Definition of a vector holding pinhole camera objects.
Definition: PinholeCamera.h:68
HomogenousMatrixT4< Scalar > HomogenousMatrix4
Definition of the HomogenousMatrix4 object, depending on the OCEAN_MATH_USE_SINGLE_PRECISION flag eit...
Definition: HomogenousMatrix4.h:37
SharedAnyCamerasT< Scalar > SharedAnyCameras
Definition of a vector holding AnyCamera objects.
Definition: AnyCamera.h:90
VectorT2< Scalar > Vector2
Definition of a 2D vector.
Definition: Vector2.h:21
std::vector< FREAKDescriptor32 > FREAKDescriptors32
Vector of 32-bytes long FREAK descriptors.
Definition: FREAKDescriptor.h:69
FREAKDescriptorT< 32 > FREAKDescriptor32
Typedef for the 32-bytes long FREAK descriptor.
Definition: FREAKDescriptor.h:66
std::vector< FREAKDescriptor64 > FREAKDescriptors64
Vector of 64-bytes long FREAK descriptors.
Definition: FREAKDescriptor.h:75
The namespace covering the entire Ocean framework.
Definition: Accessor.h:15
The camera data that is required to compute the FREAK descriptor of a image point.
Definition: FREAKDescriptor.h:105
Eigen::Vector3f unprojectRayIF
The normalized ray that points from projection center to a 2D pixel location in the image plane of ca...
Definition: FREAKDescriptor.h:107
PointJacobianMatrix2x3 pointJacobianMatrixIF
The 2-by-3 Jacobian matrix of a projection matrix wrt. to the above 2D pixel location in the image pl...
Definition: FREAKDescriptor.h:110