Использование kiss_fft для вычисления взаимной корреляции изображения в градациях серого
Я использую kiss_fft для проверки наличия в моем фрейм-буфере (оттенки серого 256x256 от камеры) предполагаемого шаблона (источник оттенков серого 50x50). Я использую STM32F7 с 8 МБ SDRAM и Camer OV7670. Это распознавание / идентификация изображения.
Поскольку мои изображения в оттенках серого, данные пикселей - uint8_t, и я хочу использовать kiss_fftndr.
Я объявляю память для кадрового буфера:
uint8_t* framebuffer = malloc(pixels*sizeof(uint8_t));
и настройте kiss_fft:
int dims_image[2] = {256,256}; // dimensions of fft obraz
int dims_pattern[2] = {256,256}; // znak is 50x50 but for FFT2 must be 50x50 completed zeroes to 256x256
int ndims = 2;
kiss_fftndr_cfg config_norm;
kiss_fftnd_cfg config_invert;
kiss_fft_cpx* multiplied_matrix = malloc( 256*256 * sizeof(kiss_fft_cpx));
kiss_fft_cpx* xcorr_matrix = malloc( 256*256 * sizeof(kiss_fft_cpx));
kiss_fft_cpx* fftbuf_out_image = malloc( 256*256 * sizeof(kiss_fft_cpx));
kiss_fft_cpx* fftbuf_out_pattern = malloc( 256*256 * sizeof(kiss_fft_cpx));
config_norm = kiss_fftndr_alloc(dims_image, ndims, 0, 0, 0); // norm FFT
config_invert = kiss_fftnd_alloc (dims_pattern, ndims, 1, 0, 0); // inv. FFT
В fftbuf_in_pattern я повернул свой паттерн 50x50 на 180 градусов, в левом верхнем углу 256x256. Другой из fftbuf_in_pattern заполнен zoroes.
когда я сделал снимок, я вычисляю:
kiss_fftndr(config_norm, fftbuf_in_pattern, fftbuf_out_pattenr);// calculate FFT2 of pattern
kiss_fftndr(config_norm, framebuffer, fftbuf_out_image);// calculate FFT2 of picture
nex, я делаю это несколько
for(i=0; i<Ma*Ma; ++i)
{
multiplied_matrix[i].r=fftbuf_out_image[i].r*fftbuf_out_pattern[i].r - fftbuf_out_image[i].i*fftbuf_out_pattern[i].i;
multiplied_matrix[i].i=fftbuf_out_image[i].r*fftbuf_out_pattern[i].i + fftbuf_out_znak[i].r*fftbuf_out_pattern[i].i;
}
и вычислить корреляцию:
kiss_fftnd(config_invert,multiplied_matrix,xcorr_matrix); // ifft2
У меня есть вопросы: это хороший способ достижения моей цели?
Как настроить kiss_fftndr для приема входных данных uint8_t? Когда я компилирую с опцией
-Dkiss_fft_scalar = uint8_t
... мой ОК он попадает в HardFault_Handler:/ в функции kiss_fftndr_alloc:
ntmp =
MAX( 2*dimOther , dimReal+2) * sizeof(kiss_fft_scalar) // freq buffer for one pass
+ dimOther*(dimReal+2) * sizeof(kiss_fft_scalar);
И я вижу в отладчике, что kiss_fft_scalar все еще float, а не uint8_t.
Можно ли использовать uint8_t в качестве входных данных?
Раньше я использовал вычисления kiss_fftnd (заполненные fft_fb_in[]. R данных в градациях серого) долго, потому что я хочу использовать kiss_fftndr.