Использование 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.

0 ответов

Другие вопросы по тегам