Domanda

Sto cercando l'algoritmo (manipolazione dei pixel bitmap) per simulare la lente del pesce (distorsione del barilotto) da immagini normali. Finora ho trovato l'implementazione che coinvolge librerie esterne come OpenCV, OpenGL o JHLABS. Dal momento che sto frequentando una lezione di elaborazione delle immagini digitali e sto realizzando un progetto di valutazione del corso, non sono sicuro che l'utilizzo di un Lib esterno mi guadagnerà un buon voto. Quindi qualcuno mi darebbe il riferimento a tale algoritmo?

Ps. Mi viene chiesto di implementarlo in Java, ma l'esempio di qualsiasi lingua farebbe.

È stato utile?

Soluzione

È positivo che tu sia stato in grado di trovare esempi che facciano quello che vuoi. È utile includerli nella tua domanda: si assicura che le persone che lo leggono siano sulla stessa pagina di te. Quindi ecco un collegamento.

È anche bello che tu voglia fare le cose da solo, senza fare affidamento su una biblioteca per fare il duro lavoro per te. Ma ciò non significa che devi farlo ignorare Tali soluzioni. Ecco perché.

Guarda cosa viene effettivamente utilizzato OpenCV quel collegamento. Queste sono funzioni che iniziano cv:

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

Se guardi il API OpenCV, tutte queste funzioni gestiscono solo attività banali come la creazione di immagini, la cancellazione, la visualizzazione, l'impostazione di pixel, ecc. Nessuna di queste attività è particolare per la distorsione del barilotto. Per quanto riguarda la distorsione del barile, quella soluzione è non specifico OpenCV.

In effetti, il cuore del programma è qui:

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

Che è solo la formula di trasformazione radiale: questa è la parte che devi capire. Come puoi vedere, non ci sono chiamate OpenCV lì dentro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top