gpt4 book ai didi

c# - 将位图从 C# 传递到 C++

转载 作者:太空狗 更新时间:2023-10-29 20:02:48 53 4
gpt4 key购买 nike

我有一个基于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,两者都不起作用。我总是收到一个异常,指出内存访问冲突。

最佳答案

取决于范围。如果你能保证位图没有被其他地方使用,你可以锁定图像缓冲区,然后将指针向下传递给 C++ 代码,然后再解锁。

LockBits 命令返回一个 BitmapData 类在其 Scan0 中有一个指向图像缓冲区的指针属性:

BitmapData bmpData = bitmapFrame.LockBits(new Rectangle(0, 0, bitmapFrame.Width, bitmapFrame.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, 
System.Drawing.Imaging.PixelFormat.Format24bppRgb);

NativeFunctions.FaceTracker(bmpData.Scan0 , bitmapFrame.Width, bitmapFrame.Height);

bitmapFrame.UnlockBits(bmpData); //Remember to unlock!!!

关于c# - 将位图从 C# 传递到 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27463876/

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com