Здравствуйте.
Недавно меня коснулась интересная тема, но сам я в ней почти ничего не понимаю.
Так вот дело в том, что мне нужно с помощью трёх способов распознать движение в серии изображений с помощью оптического потока.
Два способа я более менее испробывал «Horn–Schunck» и «Blockmatching»
осталься ещё один «LUCAS KANADE FEATURE TRACKER a pyramidal implementation»
вот с ним то я и борюсь сейчас.
Мне нужен алгоритм в Яве что бы создать «Gaussian Pyramid», никак не могу осилить.
Могу с вами поделиться моими потугами с двумя другими алгоритмами.
Я конечно сам не понял что написал, но если вы поняли меня, буду рад дальнейшему обсуждению этой темы.
GD Star Rating
loading...
loading...
а в чём, собственно состоит проблема? там в пдфнике есть отображение (2), определяющее значение каждой точки (*,y) сделующего уровня через предыдущий
запрограммировать его можно хоть на Яве, хоть на Фокале. или проблема не в алгоритме, а в способе представления данных? или в чём?
проблема в програмировании этого алгоритма, как всё это должно работать я представляю, но с Явой не дружу.
для начала можно абстрагироваться от того, что это изображение, и представлять его в виде двумерного массива целых
сперва написать заполнение массива m*n константным значением, потом, например, копирование этого массива, а потом, освоившись, уже и сам алгоритм
(я прошу прощения, если банальщину пишу)
если проблема в синтаксисе языка, то нужно поискать сэмплы и руководства и опробовать их. здесь комменты помогут в случае какогото конкретного затыка, но не в целом «как это написать?»
да, согласен, спасибо за ответ.
Положу тут ссылку по теме. И еще одну. Ну так, просто, вдруг пригодится.
Ручками все же сделать не сложнее и получится ближе к спецификации.
Перечитал пост, понял что от моего комментария тебе мало толку. Извините, поясню.
Насколько я понял из первой страницы указанной статьи, тебе просто нужно сделать к заданной картинке кучу скалированных копий, и несмотря на то, что в статье указан конкретный способ скалирования гауссовым фильтром, кажется мне что по большому счету пофигу каким фильтром это делать, сойдет любой, лишь бы работал.
Если я прав, то один из самых простых способов получить твою пирамиду, это не париться ручками с массивами, а загрузить картинку в класс 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, на который я выше и сослался.
Пример как к жабе OpenCV прикрутили //habrahabr.ru/blogs/java/60782/
мне всё самому нужно писать вот в чём соль. Это всё подходит, но это не то что мне нужно.
вот то что пока у меня получилось, но ещё не работает.
функция «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[lauf1].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*i1][2*j]+bild[2*i+1][2*j]+bild[2*i][2*j1]+bild[2*i][2*j+1])
+0.0625*(bild[2*i1][2*j1]+bild[2*i+1][2*j+1]+bild[2*i1][2*j+1]+bild[2*i+1][2*j1]));
}
}
meinbild[lauf].resetPixel(bild_neu1); //вот здесь он показывает ошибку
}
ошибка
Exception in thread «AWTEventQueue0» java.lang.ArrayIndexOutOfBoundsException : 0