summaryrefslogtreecommitdiff
path: root/src/image.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/image.cpp')
-rw-r--r--src/image.cpp153
1 files changed, 94 insertions, 59 deletions
diff --git a/src/image.cpp b/src/image.cpp
index f0c16aa..9c258c6 100644
--- a/src/image.cpp
+++ b/src/image.cpp
@@ -24,17 +24,19 @@ uint64_t dropped_count = 0;
float process_column(const Image::column_t &column)
{
// Image::column_t c = column;
- start_timer(process_column);
- QElapsedTimer t;
- t.start();
+ // start_timer(process_column);
+ // QElapsedTimer t;
+ // t.start();
float result = std::numeric_limits<float>::quiet_NaN();
constexpr uint32_t signalThreshold = 900; // = SKO * sqrt(patternSize)
static constexpr uint32_t patternOffset = patternSize - ((patternSize % 2 == 1) ? 1 : 0);
- const uint32_t correlationSize = img_height - patternSize + ((patternSize % 2 == 1) ? 1 : 0);
+ constexpr uint32_t correlationSize = img_height - patternSize
+ + ((patternSize % 2 == 1) ? 1 : 0);
// constexpr uint32_t correlationSize = img_height - patternSize;
- uint32_t correlation[img_height];
+ uint32_t correlation[img_height] = {0};
+ // memset(correlation, 0, img_height * sizeof(correlation[0]));
uint32_t integralSum[img_height];
uint32_t maxTripleSum = signalThreshold * 50;
uint32_t x1 = 0;
@@ -42,90 +44,103 @@ float process_column(const Image::column_t &column)
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};
+ // 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 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];
+ // 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 > 0xff)
+ // // std::cout << sum << ' ';
- if (sum > maxLALASum) {
- maxLALASum = sum;
- maxLALAIdx = i;
- }
- }
+ // 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));
+ // 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;
+ // memset(correlation, 0, img_height * sizeof(correlation[0]));
+ // memset(correlation, 0, patternSize);
+ // memset(correlation + correlationSize - 1, 0, patternSize);
+ integralSum[0] = 0;
// integralSum[maxLALAIdx] = 0;
- memset(integralSum, 0, img_height * sizeof(integralSum[0]));
+ // memset(integralSum, 0, img_height * sizeof(integralSum[0]));
- // for (uint32_t i = 1; i < img_height; ++i) {
- for (uint32_t i = maxLALAIdx + 1; i < maxLALAIdx + patternSize * 3; ++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];
}
- sum_elapsed_ns += t.nsecsElapsed();
- t.restart();
+ // sum_elapsed_ns += t.nsecsElapsed();
+ // t.restart();
// pixel * <sum of neighbours>
- // for (uint32_t i = 0; i < correlationSize; ++i)
- for (uint32_t i = maxLALAIdx; i < maxLALAIdx + patternSize * 2; ++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]);
- corr_elapsed_ns += t.nsecsElapsed();
- t.restart();
+ // corr_elapsed_ns += t.nsecsElapsed();
+ // t.restart();
+
+ uint32_t cPPP = correlation[0];
+ uint32_t cPP = correlation[1];
+ uint32_t cP = correlation[2];
+
+ // uint32_t c = correlation[3];
+ // uint32_t cN = correlation[4];
+ // uint32_t cNN = correlation[5];
- // for (uint32_t i = 3; i < img_height - 2; ++i) {
- for (uint32_t i = maxLALAIdx + 3; i < maxLALAIdx + patternSize * 3 - 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]
- const auto sum = correlation[i - 1] + correlation[i] +
- correlation[i + 1];
+ const uint32_t c = correlation[i];
+ const uint32_t cN = correlation[i + 1];
+ const uint32_t cNN = correlation[i + 2];
+ const auto sum = cP + c + cN;
+
+ // const int32_t rioux0 = int32_t(cPPP + cPP) - int32_t(c + cN);
+ // const int32_t rioux1 = int32_t(cPP + cP) - int32_t(cN + cNN);
+
+ // if (sum > maxTripleSum && rioux0 < 0 && rioux1 >= 0) {
+ // x1 = i - 1;
+ // y1 = rioux0;
+ // y2 = rioux1;
+ // maxTripleSum = sum;
+ // }
if (sum > maxTripleSum) {
// [N N n p] - [P N]
- const int32_t rioux0 = int32_t(correlation[i - 2 - 1] +
- correlation[i - 1 - 1]) -
- int32_t(correlation[i + 1 - 1] +
- correlation[i + 2 - 1]);
+ const int32_t rioux0 = int32_t(cPPP + cPP) - int32_t(c + cN);
- if (rioux0 < 0)
- {
+ if (rioux0 < 0) {
// [N N p] - [p N N]
- const int32_t rioux1 = int32_t(correlation[i - 2] +
- correlation[i - 1]) -
- int32_t(correlation[i + 1] +
- correlation[i + 2]);
+ const int32_t rioux1 = int32_t(cPP + cP) - int32_t(cN + cNN);
- if (rioux1 >= 0)
- {
+ if (rioux1 >= 0) {
x1 = i - 1;
y1 = rioux0;
y2 = rioux1;
@@ -133,10 +148,17 @@ float process_column(const Image::column_t &column)
}
}
}
+
+ cPPP = cPP;
+ cPP = cP;
+ cP = c;
+ // c = cN;
+ // cN = cNN;
+ // cNN = correlation[i + 1];
}
- value_elapsed_ns += t.nsecsElapsed();
- t.restart();
+ // value_elapsed_ns += t.nsecsElapsed();
+ // t.restart();
result = (y2 != y1) ? (float(x1) - (float(y1) / (y2 - y1)))
: std::numeric_limits<float>::quiet_NaN();
@@ -177,6 +199,19 @@ Pixels Image::pixels()
return result;
}
+std::shared_ptr<Pixels> Image::sharedPixels()
+{
+ t.start();
+
+ static auto result = std::make_shared<Pixels>();
+ pix_elapsed_ns += t.nsecsElapsed();
+ result->counters = counters;
+
+ std::transform(rotated_cw.cbegin(), rotated_cw.cend(), result->pixels.begin(), process_column);
+
+ return result;
+}
+
void Image::copyFromData(const void *src, size_t size)
{
if (Q_UNLIKELY(size % sizeof(data) != 0 || size < sizeof(data))) {