【发布时间】:2015-02-12 08:36:15
【问题描述】:
我有一个基于opencv用C++编写的图像处理函数。在我的 wpf 应用程序中,我使用 AForge 库来访问网络摄像头并在 UI 上更新它。这是处理新帧的函数。
void UI_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
try
{
System.Drawing.Bitmap bitmapFrame = (Bitmap)eventArgs.Frame.Clone();
MemoryStream ms = new MemoryStream();
bitmapFrame.Save(ms, ImageFormat.Bmp);
ms.Seek(0, SeekOrigin.Begin);
BitmapImage bitmapImageFrame = new BitmapImage();
bitmapImageFrame.BeginInit();
bitmapImageFrame.StreamSource = ms;
bitmapImageFrame.EndInit();
bitmapImageFrame.Freeze();
CurrentFrame = bitmapImageFrame;
}
catch (Exception ex)
{
Debug.WriteLine("fatal::" + ex.Message);
}
}
这是我的 c++ 代码:
void FaceTracker(unsigned char* imageBuffer, int width, int height){
Mat frame(Size(width, height), CV_8UC4, imageBuffer, Mat::AUTO_STEP);
Mat gray;
cvtColor(frame, gray, COLOR_BGR2GRAY);
//do more operations
}
我有两个选择。我已经找到了使用CopyPixels 将数据从BitmapImage 复制到IntPtr 缓冲区的代码。我测试了它,它工作正常。但我还读到我可以使用GetHBitmap 简单地将句柄传递给位图。但是,这对我不起作用。我读了这个How can I pass a .NET Bitmap to a native DLL?,但我不明白关于GetDIBits 的部分。我还尝试锁定位图像素并像这样传递:
bitmapFrame.LockBits(new Rectangle(0, 0, bitmapFrame.Width, bitmapFrame.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite,
System.Drawing.Imaging.PixelFormat.Format24bppRgb);
NativeFunctions.FaceTracker(bitmapFrame.GetHbitmap(), bitmapFrame.Width, bitmapFrame.Height);
并且简单地传递 HBitMap,两者都不起作用。我总是收到一个异常说明内存访问冲突。
【问题讨论】:
-
只需使用
LockBits,然后传递Scan0。GetHbitmap与Scan0完全不同。
标签: c# opencv bitmap c++-cli pinvoke