Question

Je recherche l'algorithme (manipulation des pixels bitmap) pour simuler l'objectif fisheye (Barrel Distortion) à partir d'images normales.Jusqu'à présent, j'ai trouvé des implémentations impliquant des bibliothèques externes comme OpenCV, OpenGL ou jhlabs.Étant donné que je suis un cours de traitement d'images numériques et que je réalise un projet d'évaluation de cours, je ne suis pas sûr que l'utilisation d'une bibliothèque externe me rapportera une bonne note.Alors, quelqu'un pourrait-il me donner la référence d'un tel algorithme ?

Ps.On me demande de l'implémenter en Java, mais un exemple de n'importe quel langage ferait l'affaire.

Était-ce utile?

La solution

C'est bien que vous ayez pu trouver des exemples qui font ce que vous voulez.Il est utile de les inclure dans votre question : cela garantit que les personnes qui la lisent sont sur la même longueur d'onde que vous.Voici donc un lien.

Il est également bon que vous souhaitiez faire les choses vous-même, sans compter sur une bibliothèque pour faire le travail à votre place.Mais cela ne veut pas dire que tu dois le faire ignorer de telles solutions.Voici pourquoi.

Regardez à quoi sert réellement OpenCV dans ce lien.Ce sont des fonctions qui commencent par cv:

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

Si vous regardez le API OpenCV, toutes ces fonctions ne gèrent que des tâches banales comme la création, la suppression, l'affichage d'images, le réglage des pixels, etc.Aucune de ces tâches n'est spécifique à la distorsion en barillet.En ce qui concerne la distorsion en barillet, cette solution est pas spécifique à OpenCV.

En effet, le cœur du programme est ici :

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;
}

Ce n’est que la formule de transformation radiale – c’est ce que vous devez comprendre.Comme vous pouvez le voir, il n’y a aucun appel OpenCV.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top