private void selectImagesButton_Click(object sender, EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.CheckFileExists = true;
dlg.Multiselect = true;
if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
sourceImageDataGridView.Rows.Clear();
Image<Bgr, Byte>[] sourceImages = new Image<Bgr, byte>[dlg.FileNames.Length];
for (int i = 0; i < sourceImages.Length; i++)
{
sourceImages = new Image<Bgr, byte>(dlg.FileNames);
using (Image<Bgr, byte> thumbnail = sourceImages.Resize(200, 200, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC, true))
{
DataGridViewRow row = sourceImageDataGridView.Rows[sourceImageDataGridView.Rows.Add()];
row.Cells["FileNameColumn"].Value = dlg.FileNames;
row.Cells["ThumbnailColumn"].Value = thumbnail.ToBitmap();
row.Height = 200;
}
}
try
{
using (Stitcher stitcher = new Stitcher(false))
{
Image<Bgr, Byte> result = stitcher.Stitch(sourceImages);
resultImageBox.Image = result;
}
}
finally
{
foreach (Image<Bgr, Byte> img in sourceImages)
{
img.Dispose();
}
}
}
}
public Image<Bgr, Byte> Stitch(Image<Bgr, Byte>[] images)
{
IntPtr[] ptrs = new IntPtr[images.Length];
for (int i = 0; i < images.Length; ++i)
ptrs = images.Ptr;
GCHandle handle = GCHandle.Alloc(ptrs, GCHandleType.Pinned);
IntPtr resultIplImage = StitchingInvoke.CvStitcherStitch(_ptr, handle.AddrOfPinnedObject(), images.Length);
handle.Free();
if (resultIplImage == IntPtr.Zero)
throw new ArgumentException("Requires more images");
MIplImage tmp = (MIplImage) Marshal.PtrToStructure(resultIplImage, typeof(MIplImage));
Image<Bgr, Byte> result = new Image<Bgr, byte>(tmp.width, tmp.height);
CvInvoke.cvCopy(resultIplImage, result, IntPtr.Zero);
CvInvoke.cvReleaseImage(ref resultIplImage);
return result;
}
调用这个函数时,总是抛出上面的异常。不知道是什么原因。求教?
|