c++调用opencv相关函数并打包成dll,c#不能调用

Posted

技术标签:

【中文标题】c++调用opencv相关函数并打包成dll,c#不能调用【英文标题】:c++ calls opencv related function and is packaged into dll, c# can not call it 【发布时间】:2019-11-06 14:05:52 【问题描述】:

c++调用opencv相关函数后调用dll,c#不能调用。但是如果我不使用我的dll中的opencv,它可以正常工作。就像opencv包中的imread函数一样。

当我打包 dll 时,我使用了 opencv.dll 及其 lib 文件。在C++中,他们的相关环境已经配置好了。不知道c#是否需要配置相关的opencv环境,或者还需要什么其他方法。

[c++ code]-Packaged into test.dll
#include<memory.h>
#include<time.h>
#include<math.h>
#include<vector>
#include"test.h"

#pragma comment(lib,"opencv_world310.lib")

using namespace cv;
using namespace std;

extern "C" __declspec(dllexport) int test();
int test()

    Mat readImage = imread("D:\\pic\\pic1.JPG");
    int rowPic = readImage.rows;
    return rowPic;


[c# code]-Call the test.dll
namespace testOilDetectionCsharp

    public sealed partial class MainPage : Page
    
        [DllImport("test.dll", CharSet = CharSet.Unicode)]
        extern static int test();

        public MainPage()
        
            this.InitializeComponent();
        

        private void Button_Click(object sender, RoutedEventArgs e)
        
            unsafe
            
                int num = test();
                textBox.Text = num.ToString();
            
        

    

就像测试函数一样,我有图片路径,但是在c#中,调用该函数理论上会返回图像中的行数。不是这种情况。 opencv 中的 imread 函数不起作用。 谢谢!

【问题讨论】:

应用程序崩溃了吗?你得到什么异常? 谢谢,这个应用程序没有崩溃,但它总是返回0,opencv中的imread函数不起作用,所以我无法得到这个测试图片的行数和列数。 那么有两种可能性。 Imread 有问题或 c++/c# 接口有问题。要验证,请使用上述代码运行 c++ 控制台应用程序并检查结果。 Imread 是一个非常可靠的功能,我用过很多次。可能是您的图片路径错误或图片已损坏。 这里不需要不安全的块,因为我们没有使用任何指针。如果您使用的是视觉工作室,请在“return rowPic;”上放置一个断点;行并检查 readImage。如果它为空,那是因为文件丢失、权限不正确、格式不支持或无效。也检查一下docs.opencv.org/master/d4/da8/… THANKS,当我使用C++打包DLL时,我使用C++调用DLL,结果是我想要的,但是C#调用的返回值总是0。首先,我将路径字符串作为指针传递到 DLL 中,因此我使用了 unsafe。后来我直接传递了路径,而不是指针。 【参考方案1】:

从外观上看,我认为这是一个 dll not found 异常。我遇到过很多这样的。可能您可以通过运行 EventViewer(它是 Windows 内的实用程序)来解决这个问题。事件查看器将有一个关于丢失 DLL 的条目。可能将所有 opencv dll 复制到执行路径即可解决此问题。

【讨论】:

好的,我现在试试。谢谢。 我试了之后还是不行。函数返回结果还是0。我发现不是缺少其他的DLL,只是opencv中的imread函数不能用了。

以上是关于c++调用opencv相关函数并打包成dll,c#不能调用的主要内容,如果未能解决你的问题,请参考以下文章

jar打包成dll(C#调用java代码)

C#怎么调用C++的dll?

C#如何静态调用C++中的方法(静态调用dll)

调试从 C++ 调用的 C# dll(嵌入 Mono)

c#如何将一个类库打包成两个dll

在 C# 中为 p/invoke 创建一个基本的 C++ .dll