int lap_filter_axim(volatile int *cam_fb, volatile int *lap_fb)
{
#pragma HLS INTERFACE s_axilite port=return
#pragma HLS INTERFACE m_axi depth=3072 port=cam_fb offset=slave bundle=cam_fb
#pragma HLS INTERFACE m_axi depth=3072 port=lap_fb offset=slave bundle=lap_fb
hls::LineBuffer<2, HORIZONTAL_PIXEL_WIDTH, int> linebuf;
hls::Window<3, 3, int> mbuf;
int x, y;
int val;
int gray_pix;
int i, j;
const int lap_weight[3][3] = {{-1, -1, -1},{-1, 8, -1},{-1, -1, -1}};
#pragma HLS ARRAY_PARTITION variable=lap_weight complete dim=0
int read_line[HORIZONTAL_PIXEL_WIDTH];
int write_line[HORIZONTAL_PIXEL_WIDTH];
// RGB値をY(輝度成分)のみに変換し、ラプラシアンフィルタを掛けた。
for (y=0; y<VERTICAL_PIXEL_WIDTH; y++){
for(i=0; i<HORIZONTAL_PIXEL_WIDTH; i++){
read_line[i] = cam_fb[y*(HORIZONTAL_PIXEL_WIDTH)+i];
}
for (x=0; x<HORIZONTAL_PIXEL_WIDTH; x++){
mbuf.shift_left(); // mbuf の列を1ビット左シフト
//mbuf.insert_left(colbuf); // mbuf の列に colbuf[] を代入
mbuf.insert(linebuf(1,x), 2, 2);
mbuf.insert(linebuf(0,x), 1, 2);
gray_pix = conv_rgb2y(read_line[x]);
mbuf.insert(gray_pix, 0, 2);
// LineBuffer の更新
linebuf.shift_down(x);
linebuf.insert_bottom(gray_pix, x);
// ラプラシアンフィルタの演算
for (j=0, val=0; j<3; j++){
for (i=0; i<3; i++){
val += lap_weight[j][i] * mbuf(2-j,i);
}
}
if (val<0) // 飽和演算
val = 0;
else if (val>255)
val = 255;
// ラプラシアンフィルタ・データの書き込み
if (x>1 && y>1)
write_line[x] = (val<<16)+(val<<8)+val ;
else
// x<2 || y<2 の場合はピクセルデータがまだ揃っていないので0にする
write_line[x] = 0;
// printf("x = %d y = %d", x, y);
}
for (i=0; i<HORIZONTAL_PIXEL_WIDTH; i++){
lap_fb[y*(HORIZONTAL_PIXEL_WIDTH)+i] = write_line[i];
}
}
return(0);
}
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
- | - | - | - | - | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |