#pragma once #include #include #include #include #include #include constexpr size_t img_width = 1280; constexpr size_t img_height = 800; constexpr uint32_t patternSize = 16; struct Counters { uint32_t timestampUs { 0 }; uint32_t measurementCounter { 0 }; int32_t encoderPosition { 0 }; }; struct Image { int width; int height; uint16_t data[img_height][img_width]; uint16_t rotated_cw[img_width][img_height]; size_t dataSize; unsigned int stride; libcamera::PixelFormat pixelFormat; // float pixels[img_width]; Counters counters {}; // unsigned int measurementCounter; // uint32_t timestampUs; // int32_t encoderPosition; }; struct Pixels { Counters counters {}; std::array pixels { 0.f }; Pixels& operator+=(const Pixels& other); Pixels& operator/=(const float divider); }; size_t pgm_save(Image *img, FILE *outfile, bool really_save = false); void unpack_10bit(uint8_t const *src, Image const &image, uint16_t *dest); void unpack_16bit(uint8_t const *src, Image const &image, uint16_t *dest); template T median3(const T& a, const T& b, const T& c) { using namespace std; return max(min(a,b), min(max(a,b),c)); } void rotate(Image & image); Pixels process_columns(Image & image); QList pixelsToLines(const Pixels& rawProfile); QList pointsToLines(const QList& points);