是否可以在您的情况下实现一些简单的 OpenCV 本机代码的高级 API,以便使用 PInvoke 与 C# 轻松互操作?过去我遇到过类似的问题,我所做的是将我的本机代码与大约 15 个可从 C# 轻松使用的函数打包(使用 PInvoke)。我不知道在你的情况下是否可以轻松地做到这一点,如果没有,你可以尝试在 MC++ 中编写几个类并尝试使用 MC++ 编译你的 OpenCV 代码,毕竟 C++/CLI 的主要用途是创建一个本机 C++ 和托管语言之间的桥梁(尽管如此,我个人仍然更喜欢制作好的本机 API 并从 C# 中 PInvoke。
至于 IplImage,如果您使用的是 EmguCV,则有一个 .Bitmap 属性可以为您提供可以使用的托管 System.Drawing.Bitmap 类,而无需复制底层缓冲区(我在我的应用程序中渲染了来自摄像机的 5 个实时流,它工作得很好)。另一方面,如果您想在不使用 EmguCV 的情况下手动完成,我鼓励您检查他们的源代码并查看他们如何实现此功能并自己完成(基本上,您需要获取指向内存的指针并获取一些属性,例如图像的步幅、宽度、高度,并使用它们自己创建Bitmap 类)。
编辑:我找到了一些用于渲染在 OpenCV 中处理的图像的代码:
C++ 代码:
void __stdcall GetRectifiedImage(Calibration* calib, int left, int** dataPtr, int* stride)
{
CvMat* mat = ((CalibrationImpl*)calib)->imagesRectified[left > 0 ? 0 : 1];
*dataPtr = mat->data.i;
*stride = mat->step;
}
这段代码基本上是填充dataPtr和stride(假设宽高已知)
C# PInvoke:
[DllImport("Stereo.dll")]
public static extern void GetRectifiedImage(IntPtr calib, int left, out IntPtr data, out int stride);
C# 用法(使用 EmguCV):
StereoNative.GetDepthImage(calib, out ptr, out stride);
pictureBox5.Image = new Image<Gray, byte>(640, 480, stride, ptr).Bitmap;
如果没有 Emgu,您将需要了解它们如何实现 .Bitmap 属性,然后自己动手制作自己的 Bitmap 对象。