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#不能调用的主要内容,如果未能解决你的问题,请参考以下文章