我有一个11 x 11顶点的网格。这个想法是每个点(顶点)保持扭曲图像中该像素的标准化浮点位置。例如。如果我想拉伸左上边缘,我会写入第一个顶点(-0.1,-0.1)。
我有网格,但没有图像变形功能。 cv::remap正是这样......但是以相反的顺序 - 网格“说”哪个像素邻域要映射到输出上的常规网格。
OpenCV中是否有标准方法来处理反向扭曲?我可以轻松转换网格或使用其他功能吗?我正在使用OpenCV和Boost,但任何免费的库/工具都可以帮助我。
PS:我需要在Linux PC上运行它。
答案 0 :(得分:1)
您需要为反向变换计算另一个地图。
但是,为此你需要变换公式或矩阵。
步骤1:在重新映射的图像上选择4个点。如果角落不是黑色(未定义),那么一个好主意是采取角落
第2步:在原始图片中找到它们的位置(查看地图)
第3步:计算两组点之间的单应性。 findHomoraphy()
是关键。
第4步: warpPerspective第二张图片。在内部,它计算网格,然后调用remap();
如果您具有与之前相同的变换,则使用findHomography中的输出点反转输入点,或者将inv()反转为生成的矩阵。
如果你想拥有多个调用的地图(它比每次调用warpPerspective更快),你必须在一个新函数中复制warpPerspective中的代码。
答案 1 :(得分:1)
您可能需要查看http://code.google.com/p/imgwarp-opencv/。这个库似乎正是你所需要的:基于稀疏网格的图像变形。