我想生成如下所述的“投影”图像。左图是原图,右图是我想要的。但是,我不知道如何生成正确的图像。我知道OpenCV只能产生仿射效果,所以我知道只有OpenGL或者Matlab可以产生这种效果。但是我没有OpenGL结合Visual C++的经验,所以不知道如何通过OpenGL生成正确的图片。此外,根据其他网站,我知道Matlab中的“affine3d”函数可以实现这个效果,但我的Matlab没有提供这个功能。有谁能帮助我吗?请。谢谢你。
通过OpenGL或Matlab生成投影图像
如果您想开始学习 OpenGL,请参阅答案的第 1 部分。如果您只想获得与您展示的图像类似的图像(图像编辑器转换将为您工作)并且不想要不必要的复杂性,请参阅第 2 部分。
您确实可以使用 OpenGL 生成这样的图片,但是对于这里的答案来说有点太大了。这是一些(相当老的)OpenGL教程和第二个包的链接,都带有源代码,您可以在那里学习和理解如何创建这样的程序,或者如果需要,只需获取源代码并为您的需要稍作修改需要。
在上面链接的第一个包中,您可以学习如何设置窗口和渲染基本图元,以及如何应用转换等。第二个包将教您如何应用纹理(课程 06-07,其他课程为高级主题)。
请记住,尽管这些课程已经过时,并且它们使用了已弃用的 OpenGL 的 FFP(固定功能管道)接口,但我认为这个接口更适合初学者。现代 OpenGL 应用程序使用可编程管道,其中所有转换/投影矩阵都手动填充并传输到着色器,立即图元模式不可用(您只能批量发送图元数据)等;这最初可能会令人困惑。
但是如果你只需要这样的图片,并且不想学习如何使用 OpenGL,那么你可能想要一些图像编辑器并使用类似于这种透视调整的东西。似乎这个免费软件编辑器也有类似的调整可用。
对于这样的透视变换,您不需要 OpenGL。
首先创建一个带有可口可乐纹理的 3D 圆柱体。(即使在3D 仓库中也可以找到)。
然后,首先创建一个伪相机矩阵,然后为每个轴生成具有所需范围的任意旋转角度。组成最终旋转。还合成翻译。你的投影矩阵然后读取。使用此矩阵投影您的 3D 点,您将获得扭曲效果。
如果您有带有图像处理工具箱的最新版本的 MATLAB,则可以将该imwarp
函数与affine2d
或projective2d
转换对象一起使用。
如果您有一个没有 的旧版本,imwarp
那么您可以使用imtransform
,并且您可以使用 创建转换对象maketform
。