2013-05-16 3 views
0

Я пытаюсь следовать следующему учебнику, но с использованием WPF вместо Win Forms:EMGU с C# WPF

A Basic Program

WPF не использует PictureBox, вместо этого он использует Image.

Итак, здесь идет загрузка Image.

XAML

<Image x:Name="srcImg" Width="400" Height="300"></Image> 

CS Попытка 1:

Image<Bgr, Byte> My_Image = new Image<Bgr, byte>(Openfile.FileName); 
srcImg.Source = My_Image.ToBitmap(); 

Сообщение об ошибке

Cannot implicitly convert type 'System.Drawing.Bitmap' 
to 'System.Windows.Media.ImageSource' 

CS Попытка 2:

Image<Bgr, Byte> My_Image = new Image<Bgr, byte>(Openfile.FileName); 
srcImg.Source = new BitmapImage(My_Image); 

Сообщение об ошибке

Error 1 The best overloaded method match for 'System.Windows.Media.Imaging.BitmapImage.BitmapImage(System.Uri)' has some invalid arguments 
Error 2 Argument 1: cannot convert from 'Emgu.CV.Image<Emgu.CV.Structure.Bgr,byte>' to 'System.Uri' 

Любые идеи, что я делаю неправильно?

+2

Давай, прочитайте документацию о том, что вы используете, также ошибки кристально чисты. –

+0

Я не знаю, что такое EMGU, но WPF не заботится о «System.Drawing» и не будет работать с ним. Если вы ожидаете чего-либо в WPF, удалите все ссылки на 'System.Drawing.dll' из всех ваших проектов и начните сначала. –

ответ

5

Проблема решена. Для того, чтобы преобразовать изображение:

Image<Bgr, Byte> My_Image = new Image<Bgr, byte>(Openfile.FileName); 
srcImg.Source = BitmapSourceConvert.ToBitmapSource(myImage); 

BitmapSourceConvert класс:

public static class BitmapSourceConvert 
{ 
    [DllImport("gdi32")] 
    private static extern int DeleteObject(IntPtr o); 

    public static BitmapSource ToBitmapSource(IImage image) 
    { 
     using (System.Drawing.Bitmap source = image.Bitmap) 
     { 
      IntPtr ptr = source.GetHbitmap(); 

      BitmapSource bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
       ptr, 
       IntPtr.Zero, 
       Int32Rect.Empty, 
       System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); 

      DeleteObject(ptr); 
      return bs; 
     } 
    } 
} 
0

Вы можете получить ImageSource from a Bitmap (расточительный, но у вас уже есть ToBitmap()), или вы можете реализовать прямое преобразование.

+1

Привет, я думаю, что вы неправильно поняли вопрос. Я пытаюсь отобразить изображение, сохраненное в изображении EMGU (OpenCV), а не отображать изображение из файла. – Gravy

+0

Почему в мире вы пытаетесь сделать это, когда у вас появится путь? –

+0

Знаете ли вы, что такое OpenCV или что такое EMGU? Я пытаюсь проверить, что я могу отображать EMGU-образ, прежде чем я начну вносить в него изменения. – Gravy

0

Если вы хотите использовать Emgu CV с WPF, вам следует рассмотреть возможность использования пользовательского элемента управления с помощью графического окна Emgu (этот элемент управления работает только с формами выигрышей), а затем используйте его с WindowsFormsHost.

0

Copy BitmapSourceConverter.cs из %installfolder%/Emgu/emgucv-windesktop x.x.x/Emgu.CV.WPF и добавить в свой проект, чтобы преобразовать в BitmapSource. Это полная версия:

//---------------------------------------------------------------------------- 
// Copyright (C) 2004-2017 by EMGU Corporation. All rights reserved. 
//---------------------------------------------------------------------------- 

using System; 
using System.Runtime.InteropServices; 
using System.Windows; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Shapes; 
using Emgu.CV; 
using Emgu.CV.CvEnum; 

namespace Emgu.CV.WPF 
{ 
    public static class BitmapSourceConvert 
    { 
     /// <summary> 
     /// Delete a GDI object 
     /// </summary> 
     /// <param name="o">The poniter to the GDI object to be deleted</param> 
     /// <returns></returns> 
     [DllImport("gdi32")] 
     private static extern int DeleteObject(IntPtr o); 

     /// <summary> 
     /// Convert an IImage to a WPF BitmapSource. The result can be used in the Set Property of Image.Source 
     /// </summary> 
     /// <param name="image">The Emgu CV Image</param> 
     /// <returns>The equivalent BitmapSource</returns> 
     public static BitmapSource ToBitmapSource(IImage image) 
     { 
     using (System.Drawing.Bitmap source = image.Bitmap) 
     { 
      IntPtr ptr = source.GetHbitmap(); //obtain the Hbitmap 

      BitmapSource bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
       ptr, 
       IntPtr.Zero, 
       Int32Rect.Empty, 
       System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); 

      DeleteObject(ptr); //release the HBitmap 
      return bs; 
     } 
     } 

     public static Mat ToMat(BitmapSource source) 
     { 

     if (source.Format == PixelFormats.Bgra32) 
     { 
      Mat result = new Mat(); 
      result.Create(source.PixelHeight, source.PixelWidth, DepthType.Cv8U, 4); 
      source.CopyPixels(Int32Rect.Empty, result.DataPointer, result.Step*result.Rows, result.Step); 
      return result; 
     } else if (source.Format == PixelFormats.Bgr24) 
     { 
      Mat result = new Mat(); 
      result.Create(source.PixelHeight, source.PixelWidth, DepthType.Cv8U, 3); 
      source.CopyPixels(Int32Rect.Empty, result.DataPointer, result.Step * result.Rows, result.Step); 
      return result; 
     } 
     else 
     { 
      throw new Exception(String.Format("Convertion from BitmapSource of format {0} is not supported.", source.Format)); 
     } 
     } 
    } 
} 
Смежные вопросы