这是一个数学问题,而不是编程问题,除了我必须在图形应用程序中使用Delphi实现它。
假设我有一张纸的照片。实际的纸张当然是矩形区域。当图像显示在计算机屏幕上时,矩形区域不再是矩形,因为拍摄照片时,相机并未完美地定位在纸张上方。有各种各样的透视效果会导致变形。
我的应用程序需要调整图像,以便原始矩形区域在屏幕上显示为矩形区域。
大多数照片处理软件都有一个交互式工具。用户在矩形对象周围的屏幕上绘制矩形区域,然后拖动每个角以使显示的矩形区域变形,直到他将真实区域看作矩形。我正在寻找的是进行该计算的算法。
答案 0 :(得分:1)
您需要将问题分成两个步骤。找到工作表的边缘或角落并重新映射像素。
要找到角落或边缘,这是一个非常难的问题,因为它们可能在图片之外是不可见的,被遮挡,弯曲或变形。假设您有一个非常简单的设置(黑色均匀背景,白纸,非常小的失真),您可以在图像上运行edge detection kernel,然后找到4个外边缘。如果您找到边缘,您可以将它们相交以找到角落,反之亦然。
找到角落后,在图像上运行插值,将像素映射到所需的矩形上。如果您提供角的坐标作为矩形的纹理坐标并将图像映射为纹理,您应该能够让图形引擎为您执行此操作。
我听起来很简单,但你会遇到很多参数来设置和试验。
答案 1 :(得分:1)
似乎(因为你提到了双线性插值)你需要透视转换。
在Anti-Grain Geometry库(exe example)中实现了透视变换(任意凸四边形到矩形的映射,反之亦然)。 Delphi port
使用agg_trans_perspective
可以计算出persp的矩阵。转换然后将其应用于从一个四边形到另一个四边形的地图坐标。