From 6b75f48005c9e4ded84ef43a25ac1f1ae5c88971 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Wed, 4 Jul 2018 20:35:37 +0200 Subject: [PATCH] Factor out the RGB conversion code into a header file. --- flow.cpp | 44 ++++++++++---------------------------------- flow2rgb.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 34 deletions(-) create mode 100644 flow2rgb.h diff --git a/flow.cpp b/flow.cpp index 8e823e7..47cebba 100644 --- a/flow.cpp +++ b/flow.cpp @@ -16,6 +16,8 @@ #include #include +#include "flow2rgb.h" + #include #include @@ -520,40 +522,14 @@ int main(void) float dv = dense_flow[(yy * level_width + x) * 3 + 1]; float w = dense_flow[(yy * level_width + x) * 3 + 2]; - du /= w; - dv /= w; - - float angle = atan2(dv * level_width, du * level_height); - float magnitude = min(hypot(du * level_width, dv * level_height) / 20.0, 1.0); - - // HSV to RGB (from Wikipedia). Saturation is 1. - float c = magnitude; - float h = (angle + M_PI) * 6.0 / (2.0 * M_PI); - float X = c * (1.0 - fabs(fmod(h, 2.0) - 1.0)); - float r = 0.0f, g = 0.0f, b = 0.0f; - if (h < 1.0f) { - r = c; g = X; - } else if (h < 2.0f) { - r = X; g = c; - } else if (h < 3.0f) { - g = c; b = X; - } else if (h < 4.0f) { - g = X; b = c; - } else if (h < 5.0f) { - r = X; b = c; - } else if (h < 6.0f) { - r = c; b = X; - } else { - // h is NaN, so black is fine. - } - float m = magnitude - c; - r += m; g += m; b += m; - r = max(min(r, 1.0f), 0.0f); - g = max(min(g, 1.0f), 0.0f); - b = max(min(b, 1.0f), 0.0f); - putc(lrintf(r * 255.0f), fp); - putc(lrintf(g * 255.0f), fp); - putc(lrintf(b * 255.0f), fp); + du = (du / w) * level_width; + dv = (dv / w) * level_height; + + uint8_t r, g, b; + flow2rgb(du, dv, &r, &g, &b); + putc(r, fp); + putc(g, fp); + putc(b, fp); } } fclose(fp); diff --git a/flow2rgb.h b/flow2rgb.h new file mode 100644 index 0000000..ca17530 --- /dev/null +++ b/flow2rgb.h @@ -0,0 +1,45 @@ +#ifndef _FLOW2RGB_H +#define _FLOW2RGB_H 1 + +#include +#include + +#include + +// du and dv are in pixels. +inline void flow2rgb(float du, float dv, uint8_t *rr, uint8_t *gg, uint8_t *bb) +{ + float angle = atan2(dv, du); + float magnitude = std::min(hypot(du, dv) / 20.0, 1.0); + + // HSV to RGB (from Wikipedia). Saturation is 1. + float c = magnitude; + float h = (angle + M_PI) * 6.0 / (2.0 * M_PI); + float X = c * (1.0 - fabs(fmod(h, 2.0) - 1.0)); + float r = 0.0f, g = 0.0f, b = 0.0f; + if (h < 1.0f) { + r = c; g = X; + } else if (h < 2.0f) { + r = X; g = c; + } else if (h < 3.0f) { + g = c; b = X; + } else if (h < 4.0f) { + g = X; b = c; + } else if (h < 5.0f) { + r = X; b = c; + } else if (h < 6.0f) { + r = c; b = X; + } else { + // h is NaN, so black is fine. + } + float m = magnitude - c; + r += m; g += m; b += m; + r = std::max(std::min(r, 1.0f), 0.0f); + g = std::max(std::min(g, 1.0f), 0.0f); + b = std::max(std::min(b, 1.0f), 0.0f); + *rr = lrintf(r * 255.0f); + *gg = lrintf(g * 255.0f); + *bb = lrintf(b * 255.0f); +} + +#endif // !defined(_FLOW2RGB_H) -- 2.39.2