|
3 | 3 |
|
4 | 4 | void hysteresis_filter(hls::FIFO<unsigned char> &input_fifo, |
5 | 5 | hls::FIFO<unsigned char> &output_fifo) { |
| 6 | + #pragma HLS function pipeline |
6 | 7 |
|
7 | | - hls::LineBuffer<unsigned char, WIDTH, HF_KERNEL_SIZE> line_buffer; |
8 | | - const unsigned center = HF_KERNEL_SIZE / 2; |
9 | | - const unsigned LineBufferFillCount = center * WIDTH + center; |
10 | | - // track the position we are at while processing each input frame |
11 | | - unsigned int x = 0, y = 0; |
12 | | - |
13 | | -#pragma HLS loop pipeline |
14 | | - for (unsigned int i = 0; i < (HEIGHT * WIDTH + LineBufferFillCount); i++) { |
15 | | - unsigned char input_pixel = 0; |
16 | | - if (i < HEIGHT * WIDTH) |
17 | | - input_pixel = input_fifo.read(); |
18 | | - line_buffer.ShiftInPixel(input_pixel); |
19 | | - |
20 | | - // keep track of how many pixels we have shifted into the line_buffer to |
21 | | - // tell when it is filled |
22 | | - if (!is_filled(HF_KERNEL_SIZE, i)) { |
23 | | - continue; |
24 | | - } |
| 8 | + if (input_fifo.empty()) |
| 9 | + return; |
25 | 10 |
|
26 | | - // calculate if the kernel is currently out of bounds, i.e. the kernel |
27 | | - // overlaps with pixels outside of the current input frame |
28 | | - bool out_of_bounds = |
29 | | - is_out_of_bounds(HF_KERNEL_SIZE, y, x); |
| 11 | + unsigned char input_pixel = input_fifo.read(); |
30 | 12 |
|
31 | | - // update x, y for next iteration |
32 | | - update_image_position(y, x); |
| 13 | + static hls::LineBuffer<unsigned char, WIDTH, HF_KERNEL_SIZE> line_buffer; |
33 | 14 |
|
34 | | - if (out_of_bounds) { |
35 | | - output_fifo.write(0); |
36 | | - continue; |
37 | | - } |
| 15 | + line_buffer.ShiftInPixel(input_pixel); |
38 | 16 |
|
39 | | - // check stencil for strong edges where the two most |
40 | | - // significant bits are set to one (& 0xC0) |
41 | | - int threshold = 0; |
42 | | - for (unsigned int m = 0; m < HF_KERNEL_SIZE; m++) { |
43 | | - for (unsigned int n = 0; n < HF_KERNEL_SIZE; n++) { |
44 | | - threshold = (line_buffer.window[m][n] & 0xC0) ? 1 : threshold; |
45 | | - } |
46 | | - } |
| 17 | + // keep track of how many pixels we have shifted into the line_buffer to |
| 18 | + // tell when it is filled |
| 19 | + static int count = 0; |
| 20 | + if (!is_filled(HF_KERNEL_SIZE, count)) { |
| 21 | + count++; |
| 22 | + return; |
| 23 | + } |
| 24 | + |
| 25 | + // i, j to track the position we are at while processing each input frame |
| 26 | + static unsigned int i = 0, j = 0; |
| 27 | + |
| 28 | + // calculate if the kernel is currently out of bounds, i.e. the kernel |
| 29 | + // overlaps with pixels outside of the current input frame |
| 30 | + bool outofbounds = is_out_of_bounds(HF_KERNEL_SIZE, i, j); |
47 | 31 |
|
48 | | - // strengthen edge by a factor of 2 |
49 | | - unsigned int center = HF_KERNEL_SIZE / 2; |
50 | | - int output = line_buffer.window[center][center] * 2; |
51 | | - output = (output > 255) ? 255 : output; |
| 32 | + // update i, j for next iteration |
| 33 | + update_image_position(i, j); |
52 | 34 |
|
53 | | - // only keep edge if it neighbours on a strong edge |
54 | | - output = threshold ? output : 0; |
| 35 | + if (outofbounds) { |
| 36 | + output_fifo.write(0); |
| 37 | + return; |
| 38 | + } |
55 | 39 |
|
56 | | - output_fifo.write(output); |
| 40 | + // check stencil for strong edges where the two most |
| 41 | + // significant bits are set to one (& 0xC0) |
| 42 | + int threshold = 0; |
| 43 | + for (unsigned int m = 0; m < HF_KERNEL_SIZE; m++) { |
| 44 | + for (unsigned int n = 0; n < HF_KERNEL_SIZE; n++) { |
| 45 | + threshold = (line_buffer.window[m][n] & 0xC0) ? 1 : threshold; |
| 46 | + } |
57 | 47 | } |
| 48 | + |
| 49 | + // strengthen edge by a factor of 2 |
| 50 | + unsigned int center = HF_KERNEL_SIZE / 2; |
| 51 | + int output = line_buffer.window[center][center] * 2; |
| 52 | + output = (output > 255) ? 255 : output; |
| 53 | + |
| 54 | + // only keep edge if it neighbours on a strong edge |
| 55 | + output = threshold ? output : 0; |
| 56 | + |
| 57 | + output_fifo.write(output); |
58 | 58 | } |
| 59 | + |
0 commit comments