Алгоритм эффекта изображения FishEye (искажение по бочонку) (с Java)? - PullRequest
4 голосов
/ 12 февраля 2011

Я ищу алгоритм (манипулирование растровыми пикселями) для имитации объектива «рыбий глаз» (искажение по бочонку) из обычных изображений.До сих пор я нашел реализацию, включающую внешние библиотеки, такие как OpenCV, OpenGL или jhlabs.Поскольку я беру урок по цифровой обработке изображений и делаю проект по оценке курса, я не уверен, что использование какой-либо внешней библиотеки принесет мне хорошую оценку.Так кто-нибудь даст мне ссылку на такой алгоритм?

Ps.Меня просят реализовать это на Java, но пример с любого языка подойдет.

Ответы [ 3 ]

6 голосов
/ 12 февраля 2011

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

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

Посмотрите, для чего на самом деле используется OpenCV в этой ссылке .Это функции, которые начинаются с cv:

$ grep -o "cv\\w*" barrel.cpp | sort | uniq
cv
cvCreateImage
cvGet2D
cvGetSize
cvLoadImage
cvNamedWindow
cvSaveImage
cvSet2D
cvShowImage
cvWaitKey

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

Действительно, суть программы здесь:

float getRadialX(float x,float y,float cx,float cy,float k){
  x = (x*xscale+xshift);
  y = (y*yscale+yshift);
  float res = x+((x-cx)*k*((x-cx)*(x-cx)+(y-cy)*(y-cy)));
  return res;
}

float getRadialY(float x,float y,float cx,float cy,float k){
  x = (x*xscale+xshift);
  y = (y*yscale+yshift);
  float res = y+((y-cy)*k*((x-cx)*(x-cx)+(y-cy)*(y-cy)));
  return res;
}

Что является радиальнымФормула преобразования - это то, что вам нужно понять.Как вы можете видеть, там нет вызовов OpenCV.

3 голосов
/ 16 февраля 2013
0 голосов
/ 18 сентября 2013

https://android.googlesource.com/platform/frameworks/base/+/ac39c604d6df8631922c2295b3341cd561f172a5/media/mca/filterpacks/java/android/filterpacks/imageproc/FisheyeFilter.java

это должно быть то, что вы хотите.

посмотрите на шейдер mFishEyeShader и updateProgramParams()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...