2014-07-04 52 views
0

訪問衝突異常我正在寫一個簡單的OpenCV應用程序使用.NET,目標是在一個簡單的窗口上呈現網絡攝像頭流。使用方法Marshal.Copy()

這裏是我用來做這個代碼:

private 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; 
    } 
} 

private void CameraShow() 
{ 
    ImageViewer viewer = new Emgu.CV.UI.ImageViewer(); //create an image viewer 
    Capture capture = new Capture(); //create a camera captue 

    this.isCamOff = false; 
    while (this.CamStat != eCamRun.CamStop) 
    { 
     Thread.Sleep(60); 
     viewer.Image = capture.QueryFrame(); //draw the image obtained from camera 
     System.Windows.Application.Current.Dispatcher.Invoke(
      DispatcherPriority.Normal, 
      (ThreadStart)delegate 
     { 
      this.ImageStream.Source = ToBitmapSource(viewer.Image); //BitmapSource 
     }); 
    } 

    viewer.Dispose(); 
    capture.Dispose(); 
    this.isCamOff = true; 
    Thread.CurrentThread.Interrupt(); 
} 

但現在我想在控制檯上顯示包含到System.Drawing.Bitmap對象像素緩衝區的內容(我知道無效*本地類型包含在IntPtr變量中,並放入Bitmap對象中)。所以,根據我的源代碼的正下方,以恢復IntPtr的變量I必須寫的以下代碼行(成「不安全」的上下文中):

IntPtr buffer = viewer.Image.Bitmap.GetHbitmap(); 

byte[] pPixelBuffer = new byte[16]; //16 bytes allocation 
Marshal.Copy(buffer, pPixelBuffer, 0, 9); //I copy the 9 first bytes into pPixelBuffer 

不幸的是,我有訪問衝突異常到方法「複製'!我不明白爲什麼。

有人可以幫助我嗎?

非常感謝您的幫助。

回答

0

您可以在不安全的上下文中將IntPtr投射到void*。你可以這樣做:

unsafe 
{ 
    var bytePtr = (byte*)(void*)buffer; 

    // Here use *bytePtr to get the byte value at bytePtr, just like in C/C++ 
} 
+0

@AlexD不是當你獲得的指針指向的資源。 GC只能重新定位.NET對象,'fixed'可以防止這種情況發生。本機對象不會在內存中移動。 –

+0

你解釋我我無法打印幀視頻緩衝區,因爲EMGU使用本地API?因此,如果Visual Studio調試器顯示我的'ptr'指針是無效指針,這很正常嗎?所以我無法打印它的內容? – user1364743

+0

@ user1364743我不是說那樣的話。我的評論是對之前被刪除的評論的迴應。我不知道emgu,但只要'IntPtr'不是零,它就指向一些數據,並且您應該能夠使用答案的方法來讀取這些數據。如果您的緩衝區指向視頻幀,您應該可以閱讀它。 –