我是靠谱客的博主 乐观海燕,这篇文章主要介绍unity中调用dll动态库(基于OpenCV),现在分享给大家,希望可以做个参考。

声明:内容非原创,为多家整合版

一,下载OpenCV并配置VS2017环境

网上很多教程,此处主要不是研究这个

二,创建DLL动态库

1、本文用的是vs2017,建立新项目”Dll1.dll”

2、在VS2017开发界面中,右键单击“解决方案”里面“Dll1”项目下的“头文件”目录,新建头文件“dll1.h”

 

3、Windows中,定义在dll中的变量、函数和类,如果希望让别的程序能够访问。必须通过manifest文件指定导出目标(变量、函数或类)或者通过_declspec(dllimport)关键字指定需要导出的目标,然后在使用dll的程序中通过_declspec(dllimport)关键字指定导入的目标。

本文使用_declspec()定义导出/导入目标是最方便的做法,因此,可以继续向“dll1项目”中添加一个头文件 “export.h”,然后添加自适应导出/导入目标的宏。

 

复制代码
1
2
3
4
5
6
7
8
9
10
#pragma once #ifndef EXPORT_H #define EXPORT_H #ifndef EXPORT_DLL #define EXPORT_API __declspec(dllimport) #else #define EXPORT_API __declspec(dllexport) #endif // !EXPORT_DLL #endif // !EXPORT_H

4、鼠标选中DLL1项目右键“属性”,打开Dll1项目的属性页窗口;

 

在“预处理器定义”右侧的属性值中增加“EXPORT_DLL”。

5、打开 “dll1.h”文件,使用#include包含“export.h”头文件,然后使用EXPORT_API声明一个名为高斯模糊Gauss()的DLL导出函数。

复制代码
1
2
3
4
5
6
7
8
#pragma once #ifndef DLL1_H #define DLL_H #include "export.h" //声明一个在控制台中输出的函数 extern "C" EXPORT_API void Gauss();//高斯模糊 //EXPORT_API void Gauss(); #endif // !DLL1_H

 

这个地方要注意前面的extern“c”,如果没有就会导致后面在unity调用dll动态库的时候找不到文件入口,这是因为C++源代码中的函数在编译成DLL后,函数的名称就发生了改变,会在函数的前后产生一些字符,所以找不到方法的入口点。

还有一个叫EXESCOPE的反编译软件来查看C++编译后的函数名称是什么,但是这个软件英文版的在网上不太好找,中文版的还不行。所以采用extern“c”的方法。

6、最后是打开dll1.cpp文件,这里就是实现高斯模糊GaussianBlur的函数本体。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Dll1.cpp : 定义 DLL 应用程序的导出函数。 #include "stdafx.h" #include "dll1.h" #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include"opencv2/imgproc/imgproc.hpp" #include <stdio.h> using namespace cv; void Gauss()//引用的高斯模糊函数 { Mat src, dst;//初始化一个操作对象 src = imread("C:/Users/JAY/Desktop/Others/tang.jpg");//读入图像 namedWindow("加载的图片", WINDOW_AUTOSIZE);//原图窗口 imshow("加载的图片", src);//""内命名一致,才能显示在一个窗口 GaussianBlur(src, dst, Size(7, 7), 0, 0);//高斯模糊 imshow("高斯模糊后的图片", dst);//显示结果 waitKey(0); }

 

7、生成解决方案,等待全部编译通过

三,创建控制台程序

由于DLL项目是无法独立运行的,所以为了测试DLL,需要创建控制台程序调用DLL。

1、右键单击左侧列表中“解决方案”,然后在弹出菜单中选择“添加 > 新建项目”,向解决方案中添加一个新的控制台项目。

2、将控制台项目设置为启动项目,这样每当运行程序时,启动的就是这个新创建的控制台项目

3、编写主函数main的内容,调用高斯模糊函数。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 #include "pch.h" //#include "stdafx.h" //#include <stelib.h> #include <iostream> #include "F:OneDrivecsDll1Dll1dll1.h"//注意文件位置 int main() { Gauss();//调用高斯模糊函数 system("pause"); return 0; }

 

四,配置动态库

1、设置控制台项目ConsoleApplication1依赖Dll1项目。这样可以保证每次编译ConsoleApplication1时,编译器总会自动先编译Dll1项目,保证Dll1总是最新的。

2、打开控制台项目的属性页,在“附加库目录中”添加“$(OutDir)”

3、在“附加依赖项”中填入“dll1.lib”。告诉编译器需要链接dll1.lib,进而加载我们需要的“Dll1.dll”。

符号链接库“Dll1.lib”和动态链接库“Dll1.dll”。在另一个项目中加载“Dll1.dll”文件,那么通过链接“Dll1.lib”是最简便的方式。

4、生成解决方案,运行程序成功。

五,unity调用DLL动态库

1、新建unity项目,在Assets文件夹下新建插件文件夹“Plugins”,并将四.3文件夹下的动态链接库“Dll1.dll”导入。

2、在Assets文件夹下新建C#脚本“CsDll”。

 

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using UnityEngine; using System.Collections; using System.Runtime.InteropServices; public class CsDll : MonoBehaviour//注意和文件名命名一致 { [DllImport("Dll1")]//使用[DllImport("Dll名字")]指明要引用的DLL,然后声明要使用的DLL中的方法。 private static extern void Gauss(); // Use this for initialization void Start() { } // Update is called once per frame void OnGUI()//按钮 { if (GUILayout.Button("cs c++ dll")) { Gauss(); Debug.Log("dll"); } } }

3、unity中的脚本文件必须要将脚本附着在某个物体上才能执行。点击脚本拖到MainCamera的Inspector下。

4、执行程序,显示结果。

 

 

 

 

 

最后

以上就是乐观海燕最近收集整理的关于unity中调用dll动态库(基于OpenCV)的全部内容,更多相关unity中调用dll动态库(基于OpenCV)内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部