Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2017, 23:39   #1
Yw72
Новичок
Джуниор
 
Регистрация: 29.03.2017
Сообщений: 1
По умолчанию Поиск фрагмента в изображении

Использую библиотеку fftw. Хочу написать программу, которая бы быстро находила фрагмент в большом изображении. При это данный фрагмент - это какая-нибудь часть этого изображения. Сначала всё делалось в лоб: циклом по всем точкам и минимизируем функционал разности. Но это долго. Поэтому было решено использовать БПФ. Вот, что имею на данный момент:

PHP код:
#include <fstream>
#include <complex>
#include <vector>
#include <iostream>
 
#include "fftw3.h"
 
using namespace std;
 
void loadData(vector<complex<double>> &arrint wint h){
    
arr.clear();
    
arr.resize(w*h);
 
    for (
int y 0hy++) {
        for (
int x 0wx++) {
            
arr[x] = rand()%0;
        }
    }
}
 
void loadFragment(vector<complex<double>> arrint wint hvector<complex<double>> &fragmentint xoint yoint wfint hf){
    
fragment.clear();
    
fragment.resize(wf*hf);
 
    for (
int y yoyo+hfy++) {
        for (
int x xoxo+wfx++) {
            
fragment[(x-xo)+(y-yo)*wf] = arr[x+y*w];
        }
    }
}
 
void fft2(vector<complex<double>> arrint wint hvector<complex<double>> &out){ 
    
out.clear();
    
out.resize(w*h);
    
fftw_plan plan fftw_plan_dft_2d(wh, (fftw_complex*) &arr[0], (fftw_complex*) &out[0], FFTW_FORWARDFFTW_ESTIMATE);
    
fftw_execute(plan);
}
 
void ifft2(vector<complex<double>> arrint wint hvector<complex<double>> &out){    
    
out.clear();
    
out.resize(w*h);
    
fftw_plan plan fftw_plan_dft_2d(wh, (fftw_complex*) &arr[0], (fftw_complex*) &out[0], FFTW_BACKWARDFFTW_ESTIMATE);
    
fftw_execute(plan);
 
    for (
int y 0hy++) {
        for (
int x 0wx++) {
            
out[x] = out[x].real() / (h);
        }
    }
}
 
void expandArr(vector<complex<double>> &arrint wint hint wfint hf){
    
vector<complex<double>> temp;
    
temp.resize(w*h);
 
    for (
int y 0hfy++) {
        for (
int x 0wfx++) {
            
temp[x] = arr[wf x];
        }
    }
 
    
arr.clear();
    
arr.resize(w*h);
 
    for (
int y 0hy++) {
        for (
int x 0wx++) {
            
arr[x] = temp[x];
        }
    }
}
 
void print(vector<complex<double>> arrint wint h){
    for (
int y 0hy++) {
        for (
int x 0wx++) {
            
cout << arr[x] << " ";
        }
        
cout << endl;
    }
    
cout << endl;
}
 
void conj(vector<complex<double>> &arr){    
    for(
int k 0arr.size(); ++karr[k].imag(arr[k].imag()*(-1));
}
 
void avarage(vector<complex<double>> &arr){
    
double a 0;
 
    for (
int y 0arr.size(); y++) += arr[y].real();
 
    
/= arr.size();
 
    for (
int y 0arr.size(); y++) arr[y] -= a;
}
 
void main()
{
    
int w 500;
    
int h 500;
    
vector<complex<double>> arr;
    
loadData(arrwh);
    
avarage(arr);
 
    
vector<complex<double>> forward;
    
fft2(arrwhforward);
    
conj(forward);
 
    
vector<complex<double>> fragment;
    
int xo 15;
    
int yo 35;
    
int wf 50;
    
int hf 60;
 
    
loadFragment(arrwhfragmentxoyowfhf);
    
avarage(fragment);
    
expandArr(fragmentwhwfhf);
    
vector<complex<double>> forwardF;
    
fft2(fragmentwhforwardF);
 
    
vector<complex<double>> conv;
 
    for (
int y 0h-hfy++) {
        for (
int x 0w-wfx++) {
            
complex<doublesum 0;
            for (
int j yy+hfj++) {
                for (
int i xx+wfi++) {
                    
sum += (forwardF[i-x,j-y]*forward[x,y]);    
                }
            }
            
sum /= (wf*hf);
            
conv.push_back(sum);
        }
    }
 
    
vector<complex<double>> backward;
    
ifft2(convw-wfh-hfbackward);
 
    
system("pause");

а что дальше делать - не знаю. В интернете пишут, что нужно найти максимум модуля взаимной корреляции для определения координат фрагмента. Но про какой модуль говорится - не пойму. Буду рада помощи.
Yw72 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск фрагмента текста в Memo roman_kalin C++ Builder 0 11.01.2015 14:37
Поиск фрагмента текста kopnei C# (си шарп) 14 01.06.2012 23:08
С++|Поиск фрагмента строки Демик Общие вопросы C/C++ 12 14.07.2011 12:11
Поиск фрагмента изображения на картинке banderas.antonio C# (си шарп) 3 07.05.2011 18:45
Поиск фрагмента по Lixtbox'у. Pavarotti Общие вопросы Delphi 15 09.08.2010 12:25