gpt4 book ai didi

c# - 如何在带有 VB.net GUI 的 C++ OpenCV 项目中使用 C# 库?

转载 作者:搜寻专家 更新时间:2023-10-31 01:57:31 27 4
gpt4 key购买 nike

我开发了一个使用 OpenCV 的非托管 C++ 编写的应用程序,直到现在我一直在使用内置的 highgui 库来显示结果。

现在我想与 VB.net 开发人员一起将其打包成适合销售的产品。

我决定做的两个增强是添加一个 GUI,其次通过用 3rdParty 解决方案替换它来改进人脸识别模块。

问题在于 3rdParty SDK 只有一个 C# API,显然其他程序员想在 VB 中实现该接口(interface)。

我可以将我的代码移植到 C# 并使用 EmguCV 一石二鸟,但是代码库非常大,我认为我没有时间,但这是一个选择。

我想知道从这里到哪里去。我是否移植到 MC++,混合使用 native 和托管程序集,自己在 Qt 中编写 GUI,等等

另外,如何在 .NET WinForm 控件中显示 Iplimage 流?

最佳答案

在您的情况下,是否可以实现 OpenCV native 代码的一些简单、高级 API,以便使用 PInvoke 轻松地与 C# 互操作?我过去遇到过类似的问题,我所做的是将我的 native 代码与大约 15 个可以从 C# 轻松使用的函数(使用 PInvoke)打包在一起。我不知道在你的情况下是否可以轻松地做到这一点,如果不行,你可能会尝试在 MC++ 中编写几个类并尝试使用 MC++ 编译你的 OpenCV 代码,毕竟,C++/CLI 的主要用途是创建一个 native c++ 和托管语言之间的桥梁(尽管如此,我个人仍然更喜欢制作漂亮的 native API 并从 C# 调用它。

至于 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 和步幅(假设宽度和高度已知)

C#调用:

[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 对象。

关于c# - 如何在带有 VB.net GUI 的 C++ OpenCV 项目中使用 C# 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5512255/

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