]> rtime.felk.cvut.cz Git - eurobot/public.git/commitdiff
camera: added image hue & threshold computation
authorMarek Peca <mp@duch.cz>
Sun, 19 Apr 2009 14:43:35 +0000 (16:43 +0200)
committerMarek Peca <mp@duch.cz>
Sun, 19 Apr 2009 14:43:35 +0000 (16:43 +0200)
src/camera/rozpuk/hue.c [new file with mode: 0644]

diff --git a/src/camera/rozpuk/hue.c b/src/camera/rozpuk/hue.c
new file mode 100644 (file)
index 0000000..902c67e
--- /dev/null
@@ -0,0 +1,65 @@
+#include <inttypes.h>
+#include <stdio.h>
+
+inline int8_t hue_div(unsigned max, unsigned min, unsigned a, unsigned b) {
+  int p, q;
+
+  q = max - min;
+  p = a - b;
+  p *= 85; /* 120 deg. angle (85=255/3) */
+  p += q;
+  q += q;
+  return (int8_t)(p/q);
+}
+
+inline uint8_t rgb2hue(unsigned r, unsigned g, unsigned b) {
+  if ((r == g) && (g == b))
+    return 0;
+  if (r > g) {
+    if (r > b)
+      return (uint8_t)hue_div(r, (g < b) ? g : b, g, b);
+    return (uint8_t)(2*85 + hue_div(b, g, r, g));
+  }
+  if (g > b)
+    return (uint8_t)(85 + hue_div(g, (r < b) ? r : b, b, r));
+  return (uint8_t)(2*85 + hue_div(b, r, r, g));
+}
+
+void image_hue(uint8_t *rgb, uint8_t *hue, unsigned length) {
+  unsigned i, j, k, r, g, b;
+
+  for (i = j = 0, k = 3; i < length; i++, j += 3, k += 3) {
+    r = rgb[j++] + rgb[k++];
+    g = rgb[j++] + rgb[k++];
+    b = rgb[j++] + rgb[k++];
+    hue[i] = rgb2hue(r, g, b);
+  }
+}
+
+void image_threshold(uint8_t *img, char *bitmap, unsigned length,
+                    uint8_t t1, uint8_t t2)
+{
+  unsigned ip, ib;
+  uint8_t b;
+
+  for (ip = ib = 0; ip < length; ib++) {
+    bitmap[ib] = 0;
+    for (b = 1<<7; b; b >>= 1, ip++)
+      if ((img[ip] < t1) || (img[ip] > t2))
+       bitmap[ib] += b;
+  }
+}
+
+#if 0
+int main() {
+  uint8_t rgb[640*480*3], hue[320*480], bitmap[320*480/8];
+
+  fread(rgb, 640*480*3, 1, stdin);
+  image_hue(rgb, hue, 320*480);
+  image_threshold(hue, bitmap, 320*480, 106, 235);
+  printf("P4\n320 480\n");
+  fwrite(bitmap, 320*480, 1, stdout);
+
+  return 0;
+}
+#endif