我们想在我们的C#项目之一中使用Microsoft的图像合成编辑器(ICE)中的StitchEngine.dll
。几乎没有证据表明人们已经完成了这项任务,例如理查德(Richard)在这个问题Getting an "InvalidCastException" when passing a Rectangle ValueType in c#中。因此,我们的问题是,是否有人可以提供一个最小的工作示例,即加载两个图像,将它们拼接起来并导出结果图像。
目前,我们已经陷在加载(或初始化)部分了。我们研究了StitchEngineWrapper
和StitchProjectInfo
类,但无法弄清楚如何精确加载图像。 StitchEngineWrapper.AddImageCacheLocations(IReadOnlyList<string> imageCacheLocations)
方法对我们不起作用!? List<ImageInfo> StitchProjectInfo.SourceImages
属性不可访问!使用ILSpy
也无济于事。
每个方向正确的提示都值得赞赏!希望理查德会看到这个问题。
答案 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偏移和重叠):
左:
右:
缝合:
请注意由于缝合而在右侧出现的黑色假象和滑稽的头发