概述
声明:内容非原创,为多家整合版
一,下载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”,然后添加自适应导出/导入目标的宏。
#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导出函数。
#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的函数本体。
// 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的内容,调用高斯模糊函数。
// 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”。
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)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复