Microsoft图像合成编辑器StitchEngine.dll

时间:2019-02-21 05:43:00

标签: c# image-composite-editor

我们想在我们的C#项目之一中使用Microsoft的图像合成编辑器(ICE)中的StitchEngine.dll。几乎没有证据表明人们已经完成了这项任务,例如理查德(Richard)在这个问题Getting an "InvalidCastException" when passing a Rectangle ValueType in c#中。因此,我们的问题是,是否有人可以提供一个最小的工作示例,即加载两个图像,将它们拼接起来并导出结果图像。

目前,我们已经陷在加载(或初始化)部分了。我们研究了StitchEngineWrapperStitchProjectInfo类,但无法弄清楚如何精确加载图像。 StitchEngineWrapper.AddImageCacheLocations(IReadOnlyList<string> imageCacheLocations)方法对我们不起作用!? List<ImageInfo> StitchProjectInfo.SourceImages属性不可访问!使用ILSpy也无济于事。

每个方向正确的提示都值得赞赏!希望理查德会看到这个问题。

1 个答案:

答案 0 :(得分:1)

ICE是在后台运行的状态机,因此您必须等待每个步骤完成才能进入下一个步骤。这是一个示例控制台C#应用程序,只要您添加了至少两个有效的图像(首先使用UI进行测试),它就可以正常工作:

class Program
{
    static void Main(string[] args)
    {
        using (var stitch = new StitchEngineWrapper()) // using Microsoft.Research.ICE.Stitching;
        {
            var taskCompleted = new AutoResetEvent(false);
            stitch.ProgressChanged += (s, e) => Console.Write(".");
            stitch.TaskCompleted += (s, e) =>
            {
                Console.WriteLine();
                taskCompleted.Set();
            };

            var pi = new StitchProjectInfo();
            pi.SourceImages.Add(new ImageInfo(@"c:\myPath\lenna1.jpg", null));
            pi.SourceImages.Add(new ImageInfo(@"c:\myPath\lenna2.jpg", null));
            if (!stitch.InitializeFromProjectInfo(pi) || stitch.HasLastError)
            {
                Console.WriteLine("Initialization failed.");
                if (stitch.HasLastError)
                {
                    Console.WriteLine("Error 0x" + stitch.LastError.ToString("x8") + ": " + stitch.LastErrorMessage);
                }
                return;
            }
            Console.WriteLine("Initialization ok.");

            stitch.StartAligning();
            taskCompleted.WaitOne(Timeout.Infinite);
            if (stitch.AlignedCount < 2 || stitch.HasLastError)
            {
                Console.WriteLine("Alignement failed. Wrong input.");
                Console.WriteLine("Error 0x" + stitch.LastError.ToString("x8") + ": " + stitch.LastErrorMessage);
                return;
            }
            Console.WriteLine("Alignement ok.");

            stitch.StartCompositing();
            taskCompleted.WaitOne(Timeout.Infinite);
            if (stitch.HasLastError)
            {
                Console.WriteLine("Composition failed.");
                Console.WriteLine("Error 0x" + stitch.LastError.ToString("x8") + ": " + stitch.LastErrorMessage);
                return;
            }
            Console.WriteLine("Composition ok.");

            stitch.StartProjecting();
            taskCompleted.WaitOne(Timeout.Infinite);
            if (stitch.HasLastError)
            {
                Console.WriteLine("Projection failed.");
                Console.WriteLine("Error 0x" + stitch.LastError.ToString("x8") + ": " + stitch.LastErrorMessage);
                return;
            }
            Console.WriteLine("Projection ok.");

            var options = new OutputOptions(ExportFormat.JPEG, 75, true, false, false);
            stitch.StartExporting(@"c:\myPath\stitched.jpg", stitch.ResetCropRect, 1, options, false);
            taskCompleted.WaitOne(Timeout.Infinite);
            Console.WriteLine("Export ok.");
        }
    }
}

这里是Lenna样式的示例(请注意图像的Y偏移和重叠):

左:

enter image description here

右:

enter image description here

缝合:

enter image description here

请注意由于缝合而在右侧出现的黑色假象和滑稽的头发