C# OpenCV 上的 C++ dll

Posted

技术标签:

【中文标题】C# OpenCV 上的 C++ dll【英文标题】:C++ dll on C# OpenCV 【发布时间】:2018-01-20 19:36:43 【问题描述】:

我正在使用 C++ 和 OpenCV 创建一个 dll。此 dll 将用于 C#。

我的 c++ (dll) 代码具有三个功能:

extern "C"

    bool x(Mat image, Mat gray, Point center)
    ...


extern "C"

    bool y(Mat image. Mat gray, Point center)
    ...



extern "C"

    __declspec(dllexport)

    int main (const char *cam1 ,int blur)
    ...

main 函数从 C# 代码中接收一个字符串和一个 int。 在 C# 中,我有:

[DllImport("mydll.dll")]
    public static extern int main(string path, int blur);

我应该如何在 C# 上声明其他函数,知道它们具有 Mat 和 Point 等类型的参数?

【问题讨论】:

您可以使用 structs e.t.c 将 mat 类型转换为 C# 类型。或者你可以在你的 C++ dll 中有另一个函数,你可以用它来初始化一个 Mat 类型,然后它会返回它指向 C# 代码的指针。 托管堆上的对象可以随时被 gc 移动。如果让 dll 访问行指针,则需要在 dll 函数调用期间固定这些对象。如果对象包含对托管堆上其他对象的引用,这可能还不够。这取决于 Mat 类型的复杂程度。 我忘了告诉你 Mat 是在 main 函数中初始化的。 bool 函数在 main 函数中调用。 【参考方案1】:

我按照 Owuor 的建议做了,效果很好。

我的 C++ bool 函数现在是

extern "C"

    bool x(Mat *image, Mat *gray, Point *center)
    ...


extern "C"

    bool y(Mat *image, Mat *gray, Point *center)
    ...

在 C# 上我有

[DllImport("mydll.dll")]
    public static extern int main(string path, int blur);

[DllImport("mydll.dll")]
    public static extern bool (IntPtr ptr1, IntPtr ptr1, IntPtr ptr1);

【讨论】:

以上是关于C# OpenCV 上的 C++ dll的主要内容,如果未能解决你的问题,请参考以下文章

C# 窗口中的 C++ opencv 应用程序

包装 OpenCV C++ 以与 C# 一起使用

OpenCV C# 像 C++ 一样迭代 Mat 对象

如何通过C#调用OpenCV函数(自制OpenCV的c++ dll文件)

C# EmguCV Image.setValue(...) 方法的 C++ OpenCV 等效项

如何从 c# web 服务调用 c++ Opencv 项目?