Хорошо, что вы смогли найти примеры, которые делают то, что вы хотите.Полезно включить их в свой вопрос - это гарантирует, что люди, которые его читают, находятся на той же странице, что и вы.Итак, вот ссылка .
Хорошо также, что вы хотите что-то делать самостоятельно, не полагаясь на какую-то библиотеку, которая сделает за вас тяжелую работу.Но это не значит, что вы должны игнорировать такие решения.Вот почему.
Посмотрите, для чего на самом деле используется 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.