我正在寻找算法(位图像素操作)来模拟普通图片中的鱼眼镜头(桶形失真)。到目前为止,我已经找到了涉及 OpenCV、OpenGL 或 jhlabs 等外部库的实现。由于我正在学习数字图像处理课程并且我正在做一个课程评估项目,我不确定使用任何外部库是否会给我带来好成绩。那么有人会给我这种算法的参考吗?
附言。我被要求用 Java 实现它,但是任何语言的例子都可以。
我正在寻找算法(位图像素操作)来模拟普通图片中的鱼眼镜头(桶形失真)。到目前为止,我已经找到了涉及 OpenCV、OpenGL 或 jhlabs 等外部库的实现。由于我正在学习数字图像处理课程并且我正在做一个课程评估项目,我不确定使用任何外部库是否会给我带来好成绩。那么有人会给我这种算法的参考吗?
附言。我被要求用 Java 实现它,但是任何语言的例子都可以。
很高兴您能够找到满足您需求的示例。将它们包含在您的问题中会很有帮助——它可以确保阅读它的人与您在同一页面上。所以这里有一个链接。
你想自己做事情也很好,而不是依赖一些库来为你做艰苦的工作。但这并不意味着您必须忽略此类解决方案。这就是为什么。
查看该链接中实际使用的 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 调用。
这应该是你想要的。
看看着色器mFishEyeShader
和updateProgramParams()