Здравствуйте.

Недавно меня коснулась интересная тема, но сам я в ней почти ничего не понимаю.
Так вот дело в том, что мне нужно с помощью трёх способов распознать движение в серии изображений с помощью оптического потока.

Два способа я более менее испробывал «Horn–Schunck» и «Blockmatching»
осталься ещё один «LUCAS KANADE FEATURE TRACKER a pyramidal implementation»
вот с ним то я и борюсь сейчас.

Мне нужен алгоритм в Яве что бы создать «Gaussian Pyramid», никак не могу осилить.
Могу с вами поделиться моими потугами с двумя другими алгоритмами.
Я конечно сам не понял что написал, но если вы поняли меня, буду рад дальнейшему обсуждению этой темы.

GD Star Rating
loading...

9 Responses to Нужно распознать движение в серии изображений

  1. Dr4:

    а в чём, собственно состоит проблема? там в пдфнике есть отображение (2), определяющее значение каждой точки (*,y) сделующего уровня через предыдущий

    запрограммировать его можно хоть на Яве, хоть на Фокале. или проблема не в алгоритме, а в способе представления данных? или в чём?

  2. Na:

    проблема в програмировании этого алгоритма, как всё это должно работать я представляю, но с Явой не дружу.

  3. Dr4:

    для начала можно абстрагироваться от того, что это изображение, и представлять его в виде двумерного массива целых

    сперва написать заполнение массива m*n константным значением, потом, например, копирование этого массива, а потом, освоившись, уже и сам алгоритм
    (я прошу прощения, если банальщину пишу)

    если проблема в синтаксисе языка, то нужно поискать сэмплы и руководства и опробовать их. здесь комменты помогут в случае какого–то конкретного затыка, но не в целом «как это написать?»

  4. Na:

    да, согласен, спасибо за ответ.

  5. Peels:

    Положу тут ссылку по теме. И еще одну. Ну так, просто, вдруг пригодится.

    Ручками все же сделать не сложнее и получится ближе к спецификации.

  6. Peels:

    Перечитал пост, понял что от моего комментария тебе мало толку. Извините, поясню.

    Насколько я понял из первой страницы указанной статьи, тебе просто нужно сделать к заданной картинке кучу скалированных копий, и несмотря на то, что в статье указан конкретный способ скалирования гауссовым фильтром, кажется мне что по большому счету пофигу каким фильтром это делать, сойдет любой, лишь бы работал.

    Если я прав, то один из самых простых способов получить твою пирамиду, это не париться ручками с массивами, а загрузить картинку в класс Image (что–то вроде Image im = Toolkit.getDefaultToolkit().getImage(«im agefile.png»))
    А потом используя метод getScaledInstance получить из него сколько хочешь уменьшенных версий:
    im2 = im.getScaledInstance(w/2,h/2,SCALE_SMOOT H)
    im3 = im2.getScaledInstance(w/4,h/3,SCALE_SMOO TH)
    итп.

    Эта операция является стандартной в комьютерной графике и называется mipmapping. Поэтому стандартные графические библиотеки обычно имеют метод который для заданной картинки делает всю «пирамиду» мипмапов сразу. Например, gluBuild2dMipmaps, на который я выше и сослался.

  7. LeBig:

    Пример как к жабе OpenCV прикрутили //habrahabr.ru/blogs/java/60782/

  8. Na:

    мне всё самому нужно писать вот в чём соль. Это всё подходит, но это не то что мне нужно.

  9. Na:

    вот то что пока у меня получилось, но ещё не работает.
    функция «erstellePyramide» создаёт пирамиду в трёх уровнях из картинки «MeinBild bv»(первая из двух)

    public void lucaskanade(MeinBild mbv, MeinBild mbv2, int manzIt){

    bv = mbv;
    bv2 = mbv2;
    anzIt = manzIt;
    MeinBild[] meinbild = new MeinBild[3];

    meinbild[0] = bv;
    meinbild[1] = bv;
    meinbild[2] = bv;

    for(int i = 1; i < meinbild.length; i++){
    erstellePyramide(meinbild,i);
    }

    }

    public void erstellePyramide(MeinBild[] meinbild, int lauf){
    int[][] bild = meinbild[lauf–1].getBildmatrix();
    int[][] bild_neu1 = new int[width][height];

    for(int j = 0; j < (height/2)–1; j++){
    for(int i = 0; i < (width/2)–1; i++){

    bild_neu1[i][j] :int) (0.25*bild[2*i][2*j]
    +0.125*(bild[2*i–1][2*j]+bild[2*i+1][2*j]+bild[2*i][2*j–1]+bild[2*i][2*j+1])
    +0.0625*(bild[2*i–1][2*j–1]+bild[2*i+1][2*j+1]+bild[2*i–1][2*j+1]+bild[2*i+1][2*j–1]));

    }
    }

    meinbild[lauf].resetPixel(bild_neu1); //вот здесь он показывает ошибку

    }

    ошибка
    Exception in thread «AWT–EventQueue–0» java.lang.ArrayIndexOutOfBoundsException : 0

Добавить комментарий