1b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford/* 2b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford * Copyright (C) 2015 The Android Open Source Project 3b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford * 4b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford * Licensed under the Apache License, Version 2.0 (the "License"); 5b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford * you may not use this file except in compliance with the License. 6b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford * You may obtain a copy of the License at 7b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford * 8b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford * http://www.apache.org/licenses/LICENSE-2.0 9b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford * 10b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford * Unless required by applicable law or agreed to in writing, software 11b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford * distributed under the License is distributed on an "AS IS" BASIS, 12b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford * See the License for the specific language governing permissions and 14b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford * limitations under the License. 15b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford */ 16b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 17b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford#pragma version(1) 18b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford#pragma rs java_package_name(com.android.example.cannylive) 19b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford#pragma rs_fp_relaxed 20b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 21b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehofordrs_allocation gCurrentFrame; // yuv 22b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehofordrs_allocation gCurrentRGBFrame; // RGB 23b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehofordrs_allocation blurImage; // uchar 24b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehofordrs_allocation edgeImage; // uchar 25b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 26b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehofordushort __attribute__((kernel)) black_ushort() { return 0; } 27b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoforduchar __attribute__((kernel)) black_uchar() { return 0; } 28b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoforduchar4 __attribute__((kernel)) black_uchar4() { return 0; } 29b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 30b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoforduchar4 __attribute__((kernel)) toRGB(uint32_t x, uint32_t y) { 31b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford ushort v = rsGetElementAt_uchar(edgeImage, x, y); 32b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 33b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford if (true) { 34b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford uchar charv = clamp(v * 10, 0, 255); 35b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford uchar4 out = {charv, charv, charv, 255}; 36b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return out; 37b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford } 38b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford} 39b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoforduchar4 __attribute__((kernel)) toWhiteRGB(uint32_t x, uint32_t y) { 40b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford ushort v = rsGetElementAt_uchar(edgeImage, x, y); 41b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 42b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford uchar charv = 255 - clamp(v * 10, 0, 255); 43b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford uchar4 out = {charv, charv, charv, 255}; 44b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return out; 45b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford} 46b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoforduchar4 __attribute__((kernel)) toRGBfuzz(uint32_t x, uint32_t y) { 47b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford ushort v = rsGetElementAt_uchar(blurImage, x, y); 48b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 49b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford if (true) { 50b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford uchar charv = clamp(v * 10, 0, 255); 51b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford uchar4 out = {charv, charv, charv, 255}; 52b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return out; 53b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford } 54b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford} 55b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoforduchar4 __attribute__((kernel)) toWhiteRGBfuzz(uint32_t x, uint32_t y) { 56b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford ushort v = rsGetElementAt_uchar(blurImage, x, y); 57b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 58b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford uchar charv = 255 - clamp(v * 10, 0, 255); 59b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford uchar4 out = {charv, charv, charv, 255}; 60b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return out; 61b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford} 62b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 63b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoforduchar4 __attribute__((kernel)) toRGBCartoon(uchar4 in, uint32_t x, uint32_t y) { 64b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford ushort v = rsGetElementAt_uchar(blurImage, x, y); 65b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 66b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return in - (uchar)(v * 10); 67b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford} 68b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 69b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoforduchar4 __attribute__((kernel)) toCartoon(uint32_t x, uint32_t y) { 70b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford ushort v = rsGetElementAt_uchar(blurImage, x, y); 71b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 72b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford uchar4 yuv; 73b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford yuv.r = 74b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford clamp(rsGetElementAtYuv_uchar_Y(gCurrentFrame, x, y) - v * 10, 0, 255); 75b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 76b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford yuv.g = rsGetElementAtYuv_uchar_U(gCurrentFrame, x, y); 77b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford yuv.b = rsGetElementAtYuv_uchar_V(gCurrentFrame, x, y); 78b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford yuv.a = 255; 79b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 80b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int4 rgb; 81b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford rgb.r = yuv.r + yuv.b * 1436 / 1024 - 179; 82b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford rgb.g = yuv.r - yuv.g * 46549 / 131072 + 44 - yuv.b * 93604 / 131072 + 91; 83b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford rgb.b = yuv.r + yuv.g * 1814 / 1024 - 227; 84b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford rgb.a = 255; 85b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 86b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford // Write out merged HDR result 87b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford uchar4 out = convert_uchar4(clamp(rgb, 0, 255)); 88b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return out; 89b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford} 90b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 91b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehofordstatic ushort getY(rs_allocation a, int x, int y) { 92b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford ushort3 v = convert_ushort3(rsGetElementAt_uchar4(a, x, y).xyz); 93b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return v.x + v.y + v.z; 94b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford} 95b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 96b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoforduchar __attribute__((kernel)) getLum(uchar4 in) { 97b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return (in.x + in.y + in.z) / 3; 98b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford} 99b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 100b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoforduchar __attribute__((kernel)) getyuv_y(uint32_t x, uint32_t y) { 101b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return rsGetElementAtYuv_uchar_Y(gCurrentFrame, x, y); 102b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford} 103b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 104b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoforduchar __attribute__((kernel)) blur_uchar(uint32_t x, uint32_t y) { 105b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford ushort sum = 0; 106b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int x1 = x - 2; 107b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int y1 = y - 2; 108b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 2 * rsGetElementAt_uchar(edgeImage, x1++, y1); 109b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * rsGetElementAt_uchar(edgeImage, x1++, y1); 110b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 5 * rsGetElementAt_uchar(edgeImage, x1++, y1); 111b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * rsGetElementAt_uchar(edgeImage, x1++, y1); 112b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 2 * rsGetElementAt_uchar(edgeImage, x1++, y1); 113b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford x1 = x - 2; 114b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford y1++; 115b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * rsGetElementAt_uchar(edgeImage, x1++, y1); 116b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 9 * rsGetElementAt_uchar(edgeImage, x1++, y1); 117b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 12 * rsGetElementAt_uchar(edgeImage, x1++, y1); 118b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 9 * rsGetElementAt_uchar(edgeImage, x1++, y1); 119b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * rsGetElementAt_uchar(edgeImage, x1++, y1); 120b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 121b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford x1 = x - 2; 122b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford y1++; 123b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 5 * rsGetElementAt_uchar(edgeImage, x1++, y1); 124b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 12 * rsGetElementAt_uchar(edgeImage, x1++, y1); 125b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 15 * rsGetElementAt_uchar(edgeImage, x1++, y1); 126b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 12 * rsGetElementAt_uchar(edgeImage, x1++, y1); 127b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 5 * rsGetElementAt_uchar(edgeImage, x1++, y1); 128b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 129b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford x1 = x - 2; 130b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford y1++; 131b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * rsGetElementAt_uchar(edgeImage, x1++, y1); 132b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 9 * rsGetElementAt_uchar(edgeImage, x1++, y1); 133b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 12 * rsGetElementAt_uchar(edgeImage, x1++, y1); 134b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 9 * rsGetElementAt_uchar(edgeImage, x1++, y1); 135b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * rsGetElementAt_uchar(edgeImage, x1++, y1); 136b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 137b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford x1 = x - 2; 138b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford y1++; 139b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 2 * rsGetElementAt_uchar(edgeImage, x1++, y1); 140b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * rsGetElementAt_uchar(edgeImage, x1++, y1); 141b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 5 * rsGetElementAt_uchar(edgeImage, x1++, y1); 142b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * rsGetElementAt_uchar(edgeImage, x1++, y1); 143b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 2 * rsGetElementAt_uchar(edgeImage, x1++, y1); 144b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 145b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return (uchar)(sum / 159); 146b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford} 147b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 148b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehofordushort __attribute__((kernel)) blurRGB(uint32_t x, uint32_t y) { 149b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford ushort sum = 0; 150b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int x1 = x - 2; 151b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int y1 = y - 2; 152b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 2 * getY(gCurrentRGBFrame, x1++, y1); 153b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * getY(gCurrentRGBFrame, x1++, y1); 154b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 5 * getY(gCurrentRGBFrame, x1++, y1); 155b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * getY(gCurrentRGBFrame, x1++, y1); 156b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 2 * getY(gCurrentRGBFrame, x1++, y1); 157b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford x1 = x - 2; 158b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford y1++; 159b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * getY(gCurrentRGBFrame, x1++, y1); 160b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 9 * getY(gCurrentRGBFrame, x1++, y1); 161b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 12 * getY(gCurrentRGBFrame, x1++, y1); 162b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 9 * getY(gCurrentRGBFrame, x1++, y1); 163b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * getY(gCurrentRGBFrame, x1++, y1); 164b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 165b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford x1 = x - 2; 166b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford y1++; 167b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 5 * getY(gCurrentRGBFrame, x1++, y1); 168b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 12 * getY(gCurrentRGBFrame, x1++, y1); 169b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 15 * getY(gCurrentRGBFrame, x1++, y1); 170b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 12 * getY(gCurrentRGBFrame, x1++, y1); 171b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 5 * getY(gCurrentRGBFrame, x1++, y1); 172b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 173b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford x1 = x - 2; 174b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford y1++; 175b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * getY(gCurrentRGBFrame, x1++, y1); 176b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 9 * getY(gCurrentRGBFrame, x1++, y1); 177b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 12 * getY(gCurrentRGBFrame, x1++, y1); 178b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 9 * getY(gCurrentRGBFrame, x1++, y1); 179b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * getY(gCurrentRGBFrame, x1++, y1); 180b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 181b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford x1 = x - 2; 182b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford y1++; 183b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 2 * getY(gCurrentRGBFrame, x1++, y1); 184b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * getY(gCurrentRGBFrame, x1++, y1); 185b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 5 * getY(gCurrentRGBFrame, x1++, y1); 186b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * getY(gCurrentRGBFrame, x1++, y1); 187b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 2 * getY(gCurrentRGBFrame, x1++, y1); 188b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 189b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return sum / 159; 190b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford} 191b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 192b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehofordushort __attribute__((kernel)) blur(uint32_t x, uint32_t y) { 193b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford ushort sum = 0; 194b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int x1 = x - 2; 195b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int y1 = y - 2; 196b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 2 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 197b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 198b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 5 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 199b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 200b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 2 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 201b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford x1 = x - 2; 202b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford y1++; 203b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 204b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 9 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 205b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 12 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 206b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 9 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 207b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 208b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 209b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford x1 = x - 2; 210b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford y1++; 211b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 5 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 212b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 12 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 213b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 15 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 214b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 12 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 215b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 5 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 216b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 217b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford x1 = x - 2; 218b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford y1++; 219b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 220b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 9 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 221b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 12 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 222b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 9 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 223b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 224b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 225b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford x1 = x - 2; 226b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford y1++; 227b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 2 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 228b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 229b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 5 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 230b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 4 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 231b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum += 2 * rsGetElementAtYuv_uchar_Y(gCurrentFrame, x1++, y1); 232b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 233b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return sum / 159; 234b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford} 235b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 236b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoforduchar __attribute__((kernel)) edge(uint32_t x, uint32_t y) { 237b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int sum_h = 0; 238b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int x1 = x - 1; 239b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int y1 = y - 1; 240b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum_h += -rsGetElementAt_uchar(blurImage, x1, y1); 241b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford x += 2; 242b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum_h += rsGetElementAt_uchar(blurImage, x1, y1); 243b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford x1 = x - 1; 244b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford y1++; 245b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 246b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum_h += -2 * rsGetElementAt_uchar(blurImage, x1, y1); 247b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford x1 += 2; 248b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum_h += 2 * rsGetElementAt_uchar(blurImage, x1, y1); 249b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford x1 = x - 1; 250b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford y1++; 251b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 252b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum_h += -rsGetElementAt_uchar(blurImage, x1, y1); 253b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford x1 += 2; 254b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum_h += rsGetElementAt_uchar(blurImage, x1, y1); 255b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int sum_v = 0; 256b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 257b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford x1 = x - 1; 258b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford y1 = y - 1; 259b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum_v += -rsGetElementAt_uchar(blurImage, x1++, y1); 260b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum_v += -2 * rsGetElementAt_uchar(blurImage, x1++, y1); 261b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum_v += -rsGetElementAt_uchar(blurImage, x1++, y1); 262b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 263b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford x1 = x - 1; 264b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford y1 += 2; 265b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum_v += rsGetElementAt_uchar(blurImage, x1++, y1); 266b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum_v += 2 * rsGetElementAt_uchar(blurImage, x1++, y1); 267b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford sum_v += rsGetElementAt_uchar(blurImage, x1++, y1); 268b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int v = (int)native_hypot((float)sum_v, (float)sum_h); 269b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford v = v & (~3); 270b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int dir = (int)(4 * native_atan2pi((float)sum_v, (float)sum_h) + 8.5f); 271b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 272b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return (uchar)(v + (dir & 0x3)); 273b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford} 274b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 275b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoforduchar __attribute__((kernel)) thin(uint32_t x, uint32_t y) { 276b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int value = rsGetElementAt_uchar(edgeImage, x, y); 277b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 278b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int dir = value & 0x3; 279b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int dx[4] = {1, 1, 0, 1}; 280b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int dy[4] = {0, 1, 1, -1}; 281b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford if (value < rsGetElementAt_uchar(edgeImage, x + dx[dir], y + dy[dir])) { 282b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return 0; 283b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford } 284b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford if (value < rsGetElementAt_uchar(edgeImage, x - dx[dir], y - dy[dir])) { 285b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return 0; 286b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford } 287b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return value >> 2; 288b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford} 289b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 290b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehofordstatic const short dark_line = 4; 291b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehofordstatic const short bright_line = 16; 292b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford#define q_add(v) \ 293b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford { \ 294b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford if (q_size < 64) { \ 295b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford queue[q_start & 0x3F] = v; \ 296b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford q_start++; \ 297b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford q_size++; \ 298b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford } \ 299b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford } 300b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford#define q_peak() (queue[q_peek_pos & 0x3F]) 301b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford#define q_pop() (q_size--, q_tmp = queue[q_end], q_end++, q_tmp) 302b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 303b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoforduchar __attribute__((kernel)) hysteresis(uchar in, uint32_t x, uint32_t y) { 304b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford short3 queue[64]; 305b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int q_start = 0; 306b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int q_end = 0; 307b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int q_size = 0; 308b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford short3 q_tmp; 309b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int q_peek_pos = 0; 310b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int dx[] = {-1, 0, 1, -1, 1, -1, 0, 1}; 311b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int dy[] = {-1, -1, -1, 0, 0, 1, 1, 1}; 312b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford if (in < dark_line) { 313b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return 0; 314b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford } 315b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford if (in >= bright_line) { 316b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return in; 317b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford } 318b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford short3 p = {0, 0, 1}; 319b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford q_add(p); 320b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 321b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford while (q_peek_pos != q_start) { 322b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford if (q_size > 60) { 323b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return 0; 324b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford } 325b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford p = q_peak(); 326b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford q_peek_pos++; 327b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford short cdx = p[0]; 328b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford short cdy = p[1]; 329b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 330b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int p_dist = p.z; 331b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford short v; 332b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford while (queue[q_end & 0x3F].z < p_dist - 1) { 333b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford q_pop(); 334b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford } 335b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford for (int i = 0; i < 8; i++) { 336b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int tx = cdx + dx[i]; 337b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int ty = cdy + dy[i]; 338b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford bool skip = false; 339b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford for (int k = q_end; k < q_start; k++) { 340b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford short3 tq = queue[k & 0x3F]; 341b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford if (tq.x == tx && tq.y == ty) { 342b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford skip = true; 343b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford break; 344b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford } 345b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford } 346b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford if (!(tx + x >= -5 && tx <= 5 && ty >= -5 && ty <= 5)) { 347b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford skip = true; 348b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford } 349b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford if (skip) continue; 350b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 351b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford v = rsGetElementAt_uchar(edgeImage, tx + x, ty + y); 352b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford if (v >= bright_line) { 353b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return in; 354b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford } 355b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford if (v >= dark_line) { 356b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford short3 tmp = {tx, ty, p_dist + 1}; 357b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford q_add(tmp); 358b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford } 359b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford q_peek_pos = (q_peek_pos + 1) & 0x3F; 360b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford } 361b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford } 362b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return 0; 363b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford} 364b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 365b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehofordrs_allocation hough_output; // width * height 366b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 367b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehofordstatic inline float2 cos_sin(int n) { 368b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford float2 cs[] = {{1.0f,0.0f}, 369b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.9999619f,0.008726535f},{0.9998477f,0.017452406f},{0.99965733f,0.026176948f}, 370b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.99939084f,0.034899496f},{0.99904823f,0.043619387f},{0.9986295f,0.052335955f}, 371b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.9981348f,0.06104854f},{0.9975641f,0.06975647f},{0.9969173f,0.0784591f}, 372b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.9961947f,0.087155744f},{0.9953962f,0.09584575f},{0.9945219f,0.104528464f}, 373b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.9935719f,0.11320321f},{0.99254614f,0.12186934f},{0.9914449f,0.13052619f}, 374b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.99026805f,0.1391731f},{0.9890159f,0.14780942f},{0.98768836f,0.15643446f}, 375b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.9862856f,0.1650476f},{0.9848077f,0.17364818f},{0.9832549f,0.18223552f}, 376b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.98162717f,0.190809f},{0.9799247f,0.19936794f},{0.9781476f,0.20791169f}, 377b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.976296f,0.21643962f},{0.97437006f,0.22495106f},{0.9723699f,0.23344536f}, 378b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.9702957f,0.2419219f},{0.96814764f,0.25038f},{0.9659258f,0.25881904f}, 379b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.96363044f,0.26723838f},{0.9612617f,0.27563736f},{0.95881975f,0.28401536f}, 380b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.9563047f,0.2923717f},{0.95371693f,0.3007058f},{0.95105654f,0.309017f}, 381b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.94832367f,0.31730467f},{0.94551855f,0.32556817f},{0.9426415f,0.33380687f}, 382b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.9396926f,0.34202015f},{0.9366722f,0.3502074f},{0.9335804f,0.35836795f}, 383b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.9304176f,0.3665012f},{0.92718387f,0.37460658f},{0.9238795f,0.38268343f}, 384b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.92050487f,0.39073113f},{0.9170601f,0.39874908f},{0.9135454f,0.40673664f}, 385b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.9099613f,0.41469324f},{0.9063078f,0.42261827f},{0.90258527f,0.4305111f}, 386b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.89879405f,0.43837115f},{0.89493436f,0.4461978f},{0.8910065f,0.4539905f}, 387b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.8870108f,0.4617486f},{0.88294756f,0.46947157f},{0.87881714f,0.47715876f}, 388b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.8746197f,0.4848096f},{0.8703557f,0.49242356f},{0.8660254f,0.5f}, 389b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.8616292f,0.5075384f},{0.8571673f,0.5150381f},{0.85264015f,0.52249855f}, 390b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.8480481f,0.52991927f},{0.8433914f,0.53729963f},{0.83867055f,0.54463905f}, 391b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.83388585f,0.551937f},{0.82903755f,0.5591929f},{0.8241262f,0.56640625f}, 392b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.81915206f,0.57357645f},{0.8141155f,0.58070296f},{0.809017f,0.58778524f}, 393b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.80385685f,0.59482276f},{0.7986355f,0.60181504f},{0.7933533f,0.6087614f}, 394b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.7880108f,0.6156615f},{0.78260815f,0.62251467f},{0.777146f,0.6293204f}, 395b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.77162457f,0.63607824f},{0.76604444f,0.64278764f},{0.76040596f,0.64944804f}, 396b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.7547096f,0.656059f},{0.7489557f,0.66262007f},{0.7431448f,0.6691306f}, 397b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.7372773f,0.6755902f},{0.7313537f,0.6819984f},{0.7253744f,0.68835455f}, 398b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.7193398f,0.6946584f},{0.71325046f,0.70090926f},{0.70710677f,0.70710677f}, 399b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.70090926f,0.71325046f},{0.6946584f,0.7193398f},{0.68835455f,0.7253744f}, 400b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.6819984f,0.7313537f},{0.6755902f,0.7372773f},{0.6691306f,0.7431448f}, 401b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.66262007f,0.7489557f},{0.656059f,0.7547096f},{0.64944804f,0.76040596f}, 402b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.64278764f,0.76604444f},{0.63607824f,0.77162457f},{0.6293204f,0.777146f}, 403b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.62251467f,0.78260815f},{0.6156615f,0.7880108f},{0.6087614f,0.7933533f}, 404b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.60181504f,0.7986355f},{0.59482276f,0.80385685f},{0.58778524f,0.809017f}, 405b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.58070296f,0.8141155f},{0.57357645f,0.81915206f},{0.56640625f,0.8241262f}, 406b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.5591929f,0.82903755f},{0.551937f,0.83388585f},{0.54463905f,0.83867055f}, 407b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.53729963f,0.8433914f},{0.52991927f,0.8480481f},{0.52249855f,0.85264015f}, 408b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.5150381f,0.8571673f},{0.5075384f,0.8616292f},{0.5f,0.8660254f}, 409b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.49242356f,0.8703557f},{0.4848096f,0.8746197f},{0.47715876f,0.87881714f}, 410b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.46947157f,0.88294756f},{0.4617486f,0.8870108f},{0.4539905f,0.8910065f}, 411b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.4461978f,0.89493436f},{0.43837115f,0.89879405f},{0.4305111f,0.90258527f}, 412b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.42261827f,0.9063078f},{0.41469324f,0.9099613f},{0.40673664f,0.9135454f}, 413b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.39874908f,0.9170601f},{0.39073113f,0.92050487f},{0.38268343f,0.9238795f}, 414b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.37460658f,0.92718387f},{0.3665012f,0.9304176f},{0.35836795f,0.9335804f}, 415b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.3502074f,0.9366722f},{0.34202015f,0.9396926f},{0.33380687f,0.9426415f}, 416b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.32556817f,0.94551855f},{0.31730467f,0.94832367f},{0.309017f,0.95105654f}, 417b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.3007058f,0.95371693f},{0.2923717f,0.9563047f},{0.28401536f,0.95881975f}, 418b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.27563736f,0.9612617f},{0.26723838f,0.96363044f},{0.25881904f,0.9659258f}, 419b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.25038f,0.96814764f},{0.2419219f,0.9702957f},{0.23344536f,0.9723699f}, 420b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.22495106f,0.97437006f},{0.21643962f,0.976296f},{0.20791169f,0.9781476f}, 421b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.19936794f,0.9799247f},{0.190809f,0.98162717f},{0.18223552f,0.9832549f}, 422b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.17364818f,0.9848077f},{0.1650476f,0.9862856f},{0.15643446f,0.98768836f}, 423b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.14780942f,0.9890159f},{0.1391731f,0.99026805f},{0.13052619f,0.9914449f}, 424b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.12186934f,0.99254614f},{0.11320321f,0.9935719f},{0.104528464f,0.9945219f}, 425b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.09584575f,0.9953962f},{0.087155744f,0.9961947f},{0.0784591f,0.9969173f}, 426b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.06975647f,0.9975641f},{0.06104854f,0.9981348f},{0.052335955f,0.9986295f}, 427b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.043619387f,0.99904823f},{0.034899496f,0.99939084f},{0.026176948f,0.99965733f}, 428b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {0.017452406f,0.9998477f},{0.008726535f,0.9999619f},{6.123234E-17f,1.0f}, 429b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.008726535f,0.9999619f},{-0.017452406f,0.9998477f},{-0.026176948f,0.99965733f}, 430b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.034899496f,0.99939084f},{-0.043619387f,0.99904823f},{-0.052335955f,0.9986295f}, 431b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.06104854f,0.9981348f},{-0.06975647f,0.9975641f},{-0.0784591f,0.9969173f}, 432b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.087155744f,0.9961947f},{-0.09584575f,0.9953962f},{-0.104528464f,0.9945219f}, 433b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.11320321f,0.9935719f},{-0.12186934f,0.99254614f},{-0.13052619f,0.9914449f}, 434b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.1391731f,0.99026805f},{-0.14780942f,0.9890159f},{-0.15643446f,0.98768836f}, 435b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.1650476f,0.9862856f},{-0.17364818f,0.9848077f},{-0.18223552f,0.9832549f}, 436b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.190809f,0.98162717f},{-0.19936794f,0.9799247f},{-0.20791169f,0.9781476f}, 437b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.21643962f,0.976296f},{-0.22495106f,0.97437006f},{-0.23344536f,0.9723699f}, 438b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.2419219f,0.9702957f},{-0.25038f,0.96814764f},{-0.25881904f,0.9659258f}, 439b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.26723838f,0.96363044f},{-0.27563736f,0.9612617f},{-0.28401536f,0.95881975f}, 440b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.2923717f,0.9563047f},{-0.3007058f,0.95371693f},{-0.309017f,0.95105654f}, 441b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.31730467f,0.94832367f},{-0.32556817f,0.94551855f},{-0.33380687f,0.9426415f}, 442b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.34202015f,0.9396926f},{-0.3502074f,0.9366722f},{-0.35836795f,0.9335804f}, 443b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.3665012f,0.9304176f},{-0.37460658f,0.92718387f},{-0.38268343f,0.9238795f}, 444b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.39073113f,0.92050487f},{-0.39874908f,0.9170601f},{-0.40673664f,0.9135454f}, 445b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.41469324f,0.9099613f},{-0.42261827f,0.9063078f},{-0.4305111f,0.90258527f}, 446b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.43837115f,0.89879405f},{-0.4461978f,0.89493436f},{-0.4539905f,0.8910065f}, 447b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.4617486f,0.8870108f},{-0.46947157f,0.88294756f},{-0.47715876f,0.87881714f}, 448b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.4848096f,0.8746197f},{-0.49242356f,0.8703557f},{-0.5f,0.8660254f}, 449b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.5075384f,0.8616292f},{-0.5150381f,0.8571673f},{-0.52249855f,0.85264015f}, 450b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.52991927f,0.8480481f},{-0.53729963f,0.8433914f},{-0.54463905f,0.83867055f}, 451b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.551937f,0.83388585f},{-0.5591929f,0.82903755f},{-0.56640625f,0.8241262f}, 452b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.57357645f,0.81915206f},{-0.58070296f,0.8141155f},{-0.58778524f,0.809017f}, 453b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.59482276f,0.80385685f},{-0.60181504f,0.7986355f},{-0.6087614f,0.7933533f}, 454b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.6156615f,0.7880108f},{-0.62251467f,0.78260815f},{-0.6293204f,0.777146f}, 455b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.63607824f,0.77162457f},{-0.64278764f,0.76604444f},{-0.64944804f,0.76040596f}, 456b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.656059f,0.7547096f},{-0.66262007f,0.7489557f},{-0.6691306f,0.7431448f}, 457b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.6755902f,0.7372773f},{-0.6819984f,0.7313537f},{-0.68835455f,0.7253744f}, 458b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.6946584f,0.7193398f},{-0.70090926f,0.71325046f},{-0.70710677f,0.70710677f}, 459b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.71325046f,0.70090926f},{-0.7193398f,0.6946584f},{-0.7253744f,0.68835455f}, 460b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.7313537f,0.6819984f},{-0.7372773f,0.6755902f},{-0.7431448f,0.6691306f}, 461b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.7489557f,0.66262007f},{-0.7547096f,0.656059f},{-0.76040596f,0.64944804f}, 462b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.76604444f,0.64278764f},{-0.77162457f,0.63607824f},{-0.777146f,0.6293204f}, 463b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.78260815f,0.62251467f},{-0.7880108f,0.6156615f},{-0.7933533f,0.6087614f}, 464b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.7986355f,0.60181504f},{-0.80385685f,0.59482276f},{-0.809017f,0.58778524f}, 465b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.8141155f,0.58070296f},{-0.81915206f,0.57357645f},{-0.8241262f,0.56640625f}, 466b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.82903755f,0.5591929f},{-0.83388585f,0.551937f},{-0.83867055f,0.54463905f}, 467b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.8433914f,0.53729963f},{-0.8480481f,0.52991927f},{-0.85264015f,0.52249855f}, 468b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.8571673f,0.5150381f},{-0.8616292f,0.5075384f},{-0.8660254f,0.5f}, 469b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.8703557f,0.49242356f},{-0.8746197f,0.4848096f},{-0.87881714f,0.47715876f}, 470b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.88294756f,0.46947157f},{-0.8870108f,0.4617486f},{-0.8910065f,0.4539905f}, 471b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.89493436f,0.4461978f},{-0.89879405f,0.43837115f},{-0.90258527f,0.4305111f}, 472b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.9063078f,0.42261827f},{-0.9099613f,0.41469324f},{-0.9135454f,0.40673664f}, 473b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.9170601f,0.39874908f},{-0.92050487f,0.39073113f},{-0.9238795f,0.38268343f}, 474b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.92718387f,0.37460658f},{-0.9304176f,0.3665012f},{-0.9335804f,0.35836795f}, 475b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.9366722f,0.3502074f},{-0.9396926f,0.34202015f},{-0.9426415f,0.33380687f}, 476b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.94551855f,0.32556817f},{-0.94832367f,0.31730467f},{-0.95105654f,0.309017f}, 477b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.95371693f,0.3007058f},{-0.9563047f,0.2923717f},{-0.95881975f,0.28401536f}, 478b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.9612617f,0.27563736f},{-0.96363044f,0.26723838f},{-0.9659258f,0.25881904f}, 479b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.96814764f,0.25038f},{-0.9702957f,0.2419219f},{-0.9723699f,0.23344536f}, 480b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.97437006f,0.22495106f},{-0.976296f,0.21643962f},{-0.9781476f,0.20791169f}, 481b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.9799247f,0.19936794f},{-0.98162717f,0.190809f},{-0.9832549f,0.18223552f}, 482b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.9848077f,0.17364818f},{-0.9862856f,0.1650476f},{-0.98768836f,0.15643446f}, 483b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.9890159f,0.14780942f},{-0.99026805f,0.1391731f},{-0.9914449f,0.13052619f}, 484b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.99254614f,0.12186934f},{-0.9935719f,0.11320321f},{-0.9945219f,0.104528464f}, 485b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.9953962f,0.09584575f},{-0.9961947f,0.087155744f},{-0.9969173f,0.0784591f}, 486b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.9975641f,0.06975647f},{-0.9981348f,0.06104854f},{-0.9986295f,0.052335955f}, 487b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.99904823f,0.043619387f},{-0.99939084f,0.034899496f},{-0.99965733f,0.026176948f}, 488b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford {-0.9998477f,0.017452406f},{-0.9999619f,0.008726535f},}; 489b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return cs[n]; 490b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford} 491b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 492b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoforduchar4 __attribute__((kernel)) hough_map(uint32_t x, uint32_t y) { 493b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int w = rsAllocationGetDimX(hough_output); 494b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int h = rsAllocationGetDimY(hough_output); 495b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int ix = clamp((int)x, 0, w - 1); 496b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int iy = clamp((int)y, 0, h - 1); 497b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int v = rsGetElementAt_uchar(hough_output, ix, iy); 498b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford uchar4 out = {clamp(v * 5, 0, 255), clamp(v, 0, 255), clamp(v, 0, 255), 255}; 499b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return out; 500b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford} 501b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 502b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford/* input is the range of angles to cover */ 503b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehofordvoid __attribute__((kernel)) hough(int2 in) { 504b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int max_pos = rsAllocationGetDimX(hough_output); 505b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int pos_shift = max_pos >> 1; 506b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int start = in.x; 507b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int end = in.y; 508b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int width = rsAllocationGetDimX(edgeImage); 509b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int height = rsAllocationGetDimY(edgeImage); 510b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford float half_height = height >> 1; 511b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford float half_width = width >> 1; 512b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford for (int iy = 0; iy < height; iy++) { 513b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford for (int ix = 0; ix < width; ix++) { 514b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford if (rsGetElementAt_uchar(edgeImage, ix, iy) > 20) { 515b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford float2 pos = {ix - half_width, iy - half_height}; 516b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford for (int ang = start; ang < end; ang++) { 517b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford int r = pos_shift + (int)dot(pos, cos_sin(ang)); 518b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford if (r >= 0 && r < max_pos) { 519b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford ushort tmp = rsGetElementAt_uchar(hough_output, r, ang); 520b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford rsSetElementAt_uchar(hough_output, tmp + 1, r, ang); 521b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford } 522b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford } 523b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford } 524b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford } 525b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford } 526b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford} 527b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 528b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoforduchar __attribute__((kernel)) hough_thin(uchar in, int x, int y) { 529b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford short tmp = rsGetElementAt_ushort(hough_output, x - 1, y - 1); 530b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford if (tmp > in) return 0; 531b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford tmp = rsGetElementAt_uchar(hough_output, x + 1, y + 1); 532b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford if (tmp > in) return 0; 533b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 534b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford tmp = rsGetElementAt_uchar(hough_output, x, y - 1); 535b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford if (tmp > in) return 0; 536b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford tmp = rsGetElementAt_uchar(hough_output, x + 1, y - 1); 537b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford if (tmp > in) return 0; 538b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 539b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford tmp = rsGetElementAt_uchar(hough_output, x - 1, y); 540b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford if (tmp > in) return 0; 541b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 542b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford tmp = rsGetElementAt_uchar(hough_output, x + 1, y); 543b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford if (tmp > in) return 0; 544b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford 545b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford tmp = rsGetElementAt_uchar(hough_output, x - 1, y + 1); 546b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford if (tmp > in) return 0; 547b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford tmp = rsGetElementAt_uchar(hough_output, x, y + 1); 548b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford if (tmp > in) return 0; 549b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford return in; 550b7a6edcb8646d1ef4a090769c1ed53f273d89e6ehoford} 551