summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Kostovsky <nikita@kostovsky.me>2025-03-01 01:19:51 +0100
committerNikita Kostovsky <nikita@kostovsky.me>2025-03-01 01:19:51 +0100
commita9af2d69c0a4d46dc98b6e0adaf13a7f23a24bce (patch)
tree5eb50679833feb3a67a39fb4c64a47e8d264c503
parentfe81095bf011786ee5303549abc8debb22cddcf8 (diff)
got 370 fps with pixels calc (previous was for pixels / 4)
-rw-r--r--src/camera/innomakerov9281.cpp6
-rw-r--r--src/camera/veyeimx287m.cpp13
-rw-r--r--src/constants.h2
-rw-r--r--src/image.cpp70
-rw-r--r--src/image.h5
-rw-r--r--src/main.cpp2
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);