C# 透视图像失真

C# 透视图像失真,c#,.net,image,perspective,C#,.net,Image,Perspective,我目前正在开发的应用程序需要透视图像失真功能。基本上,我想做的是允许用户将图像加载到应用程序中,并根据他们可以指定的4个角点调整其透视视图属性 我看了一眼魔术。它具有一些具有前瞻性调整的失真功能,但速度非常慢,某些输入输出不正确 你们中有人用过其他库或算法吗。我正在用C#编写代码 任何指点都将不胜感激 谢谢我们可以做到这一点,还有。您可以索取源代码或使用Reflector阅读源代码,了解如何对其进行编码。如果是透视变换,您应该能够指定与四个角匹配的4x4变换矩阵 计算该矩阵,然后在矩阵的结果图像

我目前正在开发的应用程序需要透视图像失真功能。基本上,我想做的是允许用户将图像加载到应用程序中,并根据他们可以指定的4个角点调整其透视视图属性

我看了一眼魔术。它具有一些具有前瞻性调整的失真功能,但速度非常慢,某些输入输出不正确

你们中有人用过其他库或算法吗。我正在用C#编写代码

任何指点都将不胜感激


谢谢

我们可以做到这一点,还有。您可以索取源代码或使用Reflector阅读源代码,了解如何对其进行编码。

如果是透视变换,您应该能够指定与四个角匹配的4x4变换矩阵

计算该矩阵,然后在矩阵的结果图像上应用每个像素,从而得到“映射”像素。请注意,这个“映射”像素很可能位于两个甚至四个像素之间。在这种情况下,使用您最喜欢的插值算法(例如双线性、双三次)来获得插值颜色


这确实是完成这项工作的唯一途径,而且不能更快。如果这个功能非常重要,而且你绝对需要它的速度,那么你需要将任务转移到GPU上。例如,可以调用DirectX库对纹理应用透视变换。即使在没有GPU的情况下,这也会使其速度极快,因为DirectX库使用SIMD指令来加速矩阵计算和颜色插值。

这似乎正是您(和我)想要的:

它将拍摄图像,并使用您提供的4个X/Y坐标对其进行扭曲

快速,免费,简单的代码。经过测试,效果非常好。只需从链接下载代码,然后像这样使用FreeTransform.cs:

using (System.Drawing.Bitmap sourceImg = new System.Drawing.Bitmap(@"c:\image.jpg")) 
{ 
    YLScsDrawing.Imaging.Filters.FreeTransform filter = new YLScsDrawing.Imaging.Filters.FreeTransform(); 
    filter.Bitmap = sourceImg;
    // assign FourCorners (the four X/Y coords) of the new perspective shape
    filter.FourCorners = new System.Drawing.PointF[] { new System.Drawing.PointF(0, 0), new System.Drawing.PointF(300, 50), new System.Drawing.PointF(300, 411), new System.Drawing.PointF(0, 461)}; 
    filter.IsBilinearInterpolation = true; // optional for higher quality
    using (System.Drawing.Bitmap perspectiveImg = filter.Bitmap) 
    {
        // perspectiveImg contains your completed image. save the image or do whatever.
    } 
} 

我也有同样的问题。以下是从中移植源代码。

YLScsFreeTransform无法按预期工作。更好的解决方法是

下面是在c#中如何使用它:


@igor brejc:出色的添加!仅仅对于转换来说,这可能有些过分,但却是一个很好的信息来源。这不是一个观点。看看这个:@ironic:这段代码足够接近透视图了。如果程序员愿意,他们可以更准确地处理更多的代码/偷听到的内容。这只是一个如何平衡每个项目需求的问题。定义“足够接近”。即使在某些用例中,此代码可以与透视转换代码互换使用,但它绝不是“透视”转换。@讽刺的是:如果你想获得技术性的东西,没有什么是“完全完美的透视”。你越想接近完美,就越想在其他方面做出权衡。在大多数情况下,这是速度/简单与准确性的对比。所以你决定你的优先权是什么,你想要什么。@讽刺是对的:这不是透视,而是梯形变换,这比透视容易得多。请看,共识是“不,他们不应该”!请解释YLScsFreeTransform如何“不按预期工作”。因为YLScsFreeTransform应用扭曲方法的参数较少,这使得结果与预期无关。“与预期无关”?OP只是想“将图像加载到应用程序中,并基于4个角点调整其透视视图属性”。YLScsFreeTransform就是这样做的。听起来好像你在说它不能做你想做的,这与OP的问题无关。+1使用ImageMagic的建议非常好。它帮助我发现了很多东西。对于您的示例,您仍然需要添加
image.VirtualPixelMethod=VirtualPixelMethod.Transparent这真的很有帮助!谢谢!
using(MagickImage image = new MagickImage("test.jpg"))
{
    image.Distort(DistortMethod.Perspective, new double[] { x0,y0, newX0,newY0, x1,y1,newX1,newY1, x2,y2,newX2,newY2, x3,y3,newX3,newY3 });
    control.Image = image.ToBitmap();
}