diff options
| author | Nikita Kostovsky <nikita@kostovsky.me> | 2025-03-01 01:19:51 +0100 |
|---|---|---|
| committer | Nikita Kostovsky <nikita@kostovsky.me> | 2025-03-01 01:19:51 +0100 |
| commit | a9af2d69c0a4d46dc98b6e0adaf13a7f23a24bce (patch) | |
| tree | 5eb50679833feb3a67a39fb4c64a47e8d264c503 | |
| parent | fe81095bf011786ee5303549abc8debb22cddcf8 (diff) | |
got 370 fps with pixels calc (previous was for pixels / 4)
| -rw-r--r-- | src/camera/innomakerov9281.cpp | 6 | ||||
| -rw-r--r-- | src/camera/veyeimx287m.cpp | 13 | ||||
| -rw-r--r-- | src/constants.h | 2 | ||||
| -rw-r--r-- | src/image.cpp | 70 | ||||
| -rw-r--r-- | src/image.h | 5 | ||||
| -rw-r--r-- | src/main.cpp | 2 |
6 files changed, 72 insertions, 26 deletions
diff --git a/src/camera/innomakerov9281.cpp b/src/camera/innomakerov9281.cpp index 01f485d..184601a 100644 --- a/src/camera/innomakerov9281.cpp +++ b/src/camera/innomakerov9281.cpp @@ -33,6 +33,7 @@ extern uint64_t corr_elapsed_ns; extern uint64_t max_elapsed_ns; extern uint64_t value_elapsed_ns; extern uint64_t rot_elapsed_ns; +extern uint64_t pix_elapsed_ns; extern uint64_t dropped_count; // constexpr char videoDevice[] = "/dev/video0"; @@ -426,7 +427,8 @@ bool InnoMakerOV9281::getImage(size_t &imageIndex) if (elapsedTime > 1000.) { fprintf(stderr, - "fps: %d\tdropped: %d\tsec: %d\tdq: %d\tget: %d\trot: %d\tsum: %d,\tcorr: " + "fps: %d\tdropped: %d\tsec: %d\t" + "dq: %d\tget: %d\trot: %d\tpix: %d\tsum: %d,\tcorr: " "%d,\tval: %d\n", counter, dropped_count, @@ -434,6 +436,7 @@ bool InnoMakerOV9281::getImage(size_t &imageIndex) dq_elapsed_ns / 1000 / counter, get_elapsed_ns / 1000 / counter, rot_elapsed_ns / 1000 / counter, + pix_elapsed_ns / 1000 / counter, sum_elapsed_ns / 1000 / counter, corr_elapsed_ns / 1000 / counter, // max_elapsed_ns / 1000 / counter, @@ -446,6 +449,7 @@ bool InnoMakerOV9281::getImage(size_t &imageIndex) max_elapsed_ns = 0; value_elapsed_ns = 0; rot_elapsed_ns = 0; + pix_elapsed_ns = 0; dropped_count = 0; counter = 0; diff --git a/src/camera/veyeimx287m.cpp b/src/camera/veyeimx287m.cpp index c821997..dee3c6a 100644 --- a/src/camera/veyeimx287m.cpp +++ b/src/camera/veyeimx287m.cpp @@ -33,6 +33,7 @@ extern uint64_t corr_elapsed_ns; extern uint64_t max_elapsed_ns; extern uint64_t value_elapsed_ns; extern uint64_t rot_elapsed_ns; +extern uint64_t pix_elapsed_ns; extern uint64_t dropped_count; // constexpr char videoDevice[] = "/dev/video0"; @@ -356,6 +357,8 @@ void VeyeIMX287m::dequeueFrameLoop(std::stop_token stopToken) void VeyeIMX287m::calcFrameLoop(std::stop_token stopToken) { + QElapsedTimer t; + while (!stopToken.stop_requested()) { size_t bufferIdx{}; @@ -368,7 +371,6 @@ void VeyeIMX287m::calcFrameLoop(std::stop_token stopToken) auto &image = m_images[bufferIdx]; { - QElapsedTimer t; t.start(); // std::lock_guard buffer_lock{m_bufferMutexes[bufferIdx]}; memcpy(&image.data, m_videoBuffers[bufferIdx], img_size); @@ -378,7 +380,7 @@ void VeyeIMX287m::calcFrameLoop(std::stop_token stopToken) image.rotate(); image.pixels(); - setCamParam(V4L2_CID_EXPOSURE, 18); + // setCamParam(V4L2_CID_EXPOSURE, 18); } } @@ -396,14 +398,16 @@ bool VeyeIMX287m::dequeueImageBuffer(size_t &imageIndex) if (elapsedTime > 1000.) { fprintf(stderr, - "fps: %d\tdropped: %d\tsec: %d\tdq: %d\tget: %d\trot: %d\tsum: %d,\tcorr: " - "%d,\tval: %d\n", + "fps: %d\tdropped: %d sec: %d " + "dq: %d get: %d rot: %d pix: %d sum: %d corr: " + "%d val: %d\n", counter, dropped_count, curr.tv_sec % 1000, dq_elapsed_ns / 1000 / counter, get_elapsed_ns / 1000 / counter, rot_elapsed_ns / 1000 / counter, + pix_elapsed_ns / 1000 / counter, sum_elapsed_ns / 1000 / counter, corr_elapsed_ns / 1000 / counter, // max_elapsed_ns / 1000 / counter, @@ -416,6 +420,7 @@ bool VeyeIMX287m::dequeueImageBuffer(size_t &imageIndex) max_elapsed_ns = 0; value_elapsed_ns = 0; rot_elapsed_ns = 0; + pix_elapsed_ns = 0; dropped_count = 0; counter = 0; diff --git a/src/constants.h b/src/constants.h index ba17382..303e728 100644 --- a/src/constants.h +++ b/src/constants.h @@ -16,7 +16,7 @@ constexpr size_t img_height = 544; constexpr size_t img_size = img_width * img_height; -constexpr uint32_t patternSize = 10; +constexpr uint32_t patternSize = 16; constexpr float hardcodedZRangeMm{175.f}; constexpr size_t calibrationTableHeight{0x4000}; // 16384 diff --git a/src/image.cpp b/src/image.cpp index e22c9bb..f0c16aa 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -16,12 +16,14 @@ uint64_t corr_elapsed_ns = 0; uint64_t max_elapsed_ns = 0; uint64_t value_elapsed_ns = 0; uint64_t rot_elapsed_ns = 0; +uint64_t pix_elapsed_ns = 0; uint64_t dropped_count = 0; // float process_column(const uint8_t (&column)[]) // float process_column(const Image::row_t &column) float process_column(const Image::column_t &column) { + // Image::column_t c = column; start_timer(process_column); QElapsedTimer t; t.start(); @@ -39,11 +41,50 @@ float process_column(const Image::column_t &column) int32_t y1 = 0; int32_t y2 = 0; + static_assert((img_height % patternSize) == 0, "img_height % patternSize should be 0"); + std::array<uint16_t, img_height / patternSize> sums; + uint16_t maxLALASum{0}; + size_t maxLALAIdx{0}; + // uint16_t sum{0}; + + for (size_t i = 0; i < img_height; i += patternSize) { + // const auto sum = std::accumulate(column.cbegin() + i, + // column.cbegin() + i + patternSize, + // 0, + // std::plus<uint16_t>()); + uint16_t sum{0}; + + for (size_t j = i; j < i + patternSize; ++j) + sum += column[j]; + // if ((i % patternSize) == 0) + // sum = 0; + // sum += column[i]; + + // if (sum > 0xff) + // std::cout << sum << ' '; + + if (sum > maxLALASum) { + maxLALASum = sum; + maxLALAIdx = i; + } + } + + // maxLALAIdx = patternSize * 32 - 14; // crash + // maxLALAIdx = patternSize * 32 - 14; // no crash + + maxLALAIdx = std::clamp(uint32_t(maxLALAIdx), + uint32_t(patternSize), + uint32_t(img_height - patternSize * 2 - 14)); + + // std::cout << maxLALAIdx << ' '; memset(correlation, 0, img_height * sizeof(correlation[0])); // memset(correlation, 0, patternSize / 2); - integralSum[0] = 0; + // integralSum[0] = 0; + // integralSum[maxLALAIdx] = 0; + memset(integralSum, 0, img_height * sizeof(integralSum[0])); - for (uint32_t i = 1; i < img_height; ++i) { + // for (uint32_t i = 1; i < img_height; ++i) { + for (uint32_t i = maxLALAIdx + 1; i < maxLALAIdx + patternSize * 3; ++i) { integralSum[i] = column[i] + integralSum[i - 1]; } @@ -51,7 +92,8 @@ float process_column(const Image::column_t &column) t.restart(); // pixel * <sum of neighbours> - for (uint32_t i = 0; i < correlationSize; ++i) + // for (uint32_t i = 0; i < correlationSize; ++i) + for (uint32_t i = maxLALAIdx; i < maxLALAIdx + patternSize * 2; ++i) correlation[i + patternSize / 2] = column[i + patternSize / 2] * (integralSum[i + patternOffset] - integralSum[i]); // * (integralSum[i + patternSize] - integralSum[i]); @@ -59,7 +101,8 @@ float process_column(const Image::column_t &column) corr_elapsed_ns += t.nsecsElapsed(); t.restart(); - for (uint32_t i = 3; i < img_height - 2; ++i) { + // for (uint32_t i = 3; i < img_height - 2; ++i) { + for (uint32_t i = maxLALAIdx + 3; i < maxLALAIdx + patternSize * 3 - 2; ++i) { // p - pixel, n - neighbour // P - pixel used in sum, N - neighbour used in sum // [N P N] @@ -109,7 +152,6 @@ float process_column(const Image::column_t &column) void Image::rotate() { - QElapsedTimer t; t.start(); for (size_t j = 0; j < img_width; ++j) { @@ -121,24 +163,16 @@ void Image::rotate() rot_elapsed_ns += t.nsecsElapsed(); } -Pixels Image::pixels() const +Pixels Image::pixels() { - // auto result = std::make_shared<Pixels>(); + t.start(); + Pixels result; result.counters = counters; - start_timer(process_columns); - // std::transform(std::execution::par_unseq, - // rotated_cw.cbegin(), - // rotated_cw.cend(), - // result->pixels.begin(), - // [](const auto &column) -> float { return process_column(column); }); + std::transform(rotated_cw.cbegin(), rotated_cw.cend(), result.pixels.begin(), process_column); - // #pragma omp chunk - // #pragma omp parallel for - for (size_t i = 0; i < img_width / 4; i++) { - result.pixels[i] = process_column(rotated_cw[i]); - } + pix_elapsed_ns += t.nsecsElapsed(); return result; } diff --git a/src/image.h b/src/image.h index 15b5daa..739c3fb 100644 --- a/src/image.h +++ b/src/image.h @@ -1,5 +1,7 @@ #pragma once +#include <QElapsedTimer> + #include "constants.h" #include "typedefs.h" @@ -36,9 +38,10 @@ struct Image libcamera::PixelFormat pixelFormat{0}; Counters counters{}; bool hasInputData{false}; + QElapsedTimer t; void rotate(); - Pixels pixels() const; + Pixels pixels(); void copyFromData(const void* src, size_t size); private: diff --git a/src/main.cpp b/src/main.cpp index e05262a..9548757 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -470,7 +470,7 @@ int main(int argc, char* argv[]) return QHttpServerResponse::StatusCode::ServiceUnavailable; } - ::pixels = img.pixels(); + ::pixels = std::move(img.pixels()); std::lock_guard<std::mutex> lg(pgm_image_mtx); |
