訪問衝突異常我正在寫一個簡單的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
不幸的是,我有訪問衝突異常到方法「複製'!我不明白爲什麼。
有人可以幫助我嗎?
非常感謝您的幫助。
@AlexD不是當你獲得的指針指向的資源。 GC只能重新定位.NET對象,'fixed'可以防止這種情況發生。本機對象不會在內存中移動。 –
你解釋我我無法打印幀視頻緩衝區,因爲EMGU使用本地API?因此,如果Visual Studio調試器顯示我的'ptr'指針是無效指針,這很正常嗎?所以我無法打印它的內容? – user1364743
@ user1364743我不是說那樣的話。我的評論是對之前被刪除的評論的迴應。我不知道emgu,但只要'IntPtr'不是零,它就指向一些數據,並且您應該能夠使用答案的方法來讀取這些數據。如果您的緩衝區指向視頻幀,您應該可以閱讀它。 –