VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库

时间:2021-07-09 09:13:48

一、 新建工程

1、菜单选择“文件——新建——项目”

VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库

2、左侧选择“已安装——模板——Visual C++——Win32”,右侧选择“Win32项目”

VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库

3、确定后,依次点击“下一步”,

VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库

4、点击“完成”,自动生成项目

VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库

5、选择菜单“生成——生成解决方案”,下方输出区会显示成功:

VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库

6、选择菜单“调试——开始执行(不调试)”,结果如下:

VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
至此,新建、编译并运行一个程序即告完成。

二、 工程使用OpenCV-3.0.0动态链接库

1、选中项目,右击选择“属性”,

VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
出现如下属性设置框:
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库

2、右侧选中“C/C++”,左侧“附加包含目录”右侧下拉按钮选中“编辑”

VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
出现如下附加包含目录设置框:
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
从空白区第一行双击,选择OpenCV-3.0.0加压包中build目录下的include文件夹
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
选择后结果如下图
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
确定后,附加包含目录即设定OK。
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
设置“附加包含目录”就是要告知编译器去哪里找头文件的位置。

3、在右侧选择“链接器”,右侧选中“附加库目录”

VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
直接填入:D:\Softwares\OpenCV-3.0-beta\build\x86\vc11\lib,结果如下:
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
左侧点开“链接器”,选择“输入”,在右侧“附加依赖项”中加入opencv_world300d.lib
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
确定后,即配置完成。
设置“附加库目录”和“附加依赖项”就是要告知编译器去哪里链接头文件中声明函数。

4、在项目中,打开文件Win32Project2.cpp,添加头文件引用

#include "opencv2\opencv.hpp"

结果如下:
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
在InitInstance函数中添加三行代码:

    cv::Mat image = cv::imread("E:/IMG_0012.JPG ");  // 读入一幅图像
    cv::imshow("IMG",image);  // 显示图像
    cv::waitKey(10);  // 等待10毫秒

VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
点击菜单“生成——生成解决方案”后,编译成功如下图:
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
点击菜单“调试——开始运行(不调试)”,出现如下提示:
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
此时,将OpenCV中build/x86/vc11/bin/opencv_world300d.dll复制到Debug目录下:
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
再次点击,运行显示图像。
复制“*dll”文件到运行目录下,使得程序能够链接到依赖库并按照依赖库来执行。

三、 工程使用OpenCV-3.0.0静态链接库

此过程与使用动态链接库非常相似,在第3步存在差异,具体如下:

3、在右侧选择“链接器”,右侧选中“附加库目录”

VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
直接填入:D:\Softwares\OpenCV-3.0-beta\build\x86\vc11\staticlib,结果如下:
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
左侧点开“链接器”,选择“输入”,在右侧“附加依赖项”中加入
ippicvmt.lib
IlmImfd.lib
libjasperd.lib
libjpegd.lib
libpngd.lib
libtiffd.lib
libwebpd.lib
zlibd.lib
comctl32.lib
vfw32.lib
opencv_calib3d300d.lib
opencv_core300d.lib
opencv_features2d300d.lib
opencv_flann300d.lib
opencv_highgui300d.lib
opencv_imgcodecs300d.lib
opencv_imgproc300d.lib
opencv_ml300d.lib
opencv_objdetect300d.lib
opencv_photo300d.lib
opencv_shape300d.lib
opencv_stitching300d.lib
opencv_superres300d.lib
opencv_ts300d.lib
opencv_video300d.lib
opencv_videoio300d.lib
opencv_videostab300d.lib
结果如下:
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
确定后,即配置完成。
此处加载的项目繁多,其中comctl32.lib和vfw32.lib是windows下的库,必须加载;opencv_.lib可选择性加载(只加载依赖项)。*

此外,在完成以上配置后,还需要修改代码生成的运行库。
在“属性——C/C++——代码生成”中,修改运行库“多线程调试DLL(/MDd)”为“多线程调试(/MTd)”
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
重新编译,执行即可使用静态链接库,且目标文件夹下无需复制文件即可运行。
静态链接库将依赖的库的相关部分全部链接到生成程序中,故无需依赖其他项。

四、 从OpenCV-3.0.0静态链接库制作自己的动态链接库

1、右击“解决方案”,选择“添加——新建项目”

VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
出现如下添加新项目
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库

2、选择“已安装——Visual C++——Win32”,右侧选择“Win32 项目”,输入项目名后确定,出现如下界面,点击“下一步”。

VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
接下来出现的界面中选择“应用程序类型——DLL”,点击“完成”。
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
出现如下DllWin32Project工程:
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库

3、配置OpenCV-3.0.0的静态链接库,参见上一节内容。

4、在stdafx.H中加入OpenCV头文件:

#include "opencv2\opencv.hpp"

VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
在头文件目录下添加DllWin32Project.h,并添加如下代码:

#ifdef __DLL_WIN32PROJECT__
#define __DLL_WIN32PROJECT__ extern "C" _declspec(dllexport)
#else
#define __DLL_WIN32PROJECT__ extern "C" _declspec(dllimport)
#endif

__DLL_WIN32PROJECT__ void ShowImageByOpenCV(char *imageName);

VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
在DllWin32Project.cpp中添加:

#define __DLL_WIN32PROJECT__
#include "DllWin32Project.h"

void ShowImageByOpenCV(char *imageName)
{ cv::Mat image = cv::imread(imageName); // 读入一幅图像 cv::imshow("IMG SHOW BY DLL",image); // 显示图像 cv::waitKey(10); // 等待10毫秒 }

VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库

5、编译执行后,生成DllWin32Project.lib和DllWin32Project.dll文件

VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
至此,制作自己的动态链接库即告完成,其中OpenCV的调用函数已集成到Dll内部,对外只有一个DllWin32Project.dll,可以很好的隐藏二次开发的依赖库。

五、 C#调用自己的动态链接库

1、从左侧“其它语言——Visual C#——Windows”中添加ShowImageByOpenCVDll的Windows窗体应用程序,确定。

VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
生成如下工程:
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
从右侧工具栏,添加一个按钮到Form1中,修改按钮名称为“显示图像”:
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库

2、双击按钮,进入代码区,添加代码:

VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
在引用区添加

using System.Runtime.InteropServices;

在Form1里添加

[DllImport("DllWin32Project.dll")]
public static extern void ShowImageByOpenCV(String imageName);

在button1_Click中添加

String imName = "E:/IMG_0012.JPG";
ShowImageByOpenCV(imName);

VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
编译后生成可执行文件,运行之即可得到如下窗体:
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
点击按钮,显示图像如下
VS2012中使用OpenCV-3.0.0的动态链接库和静态链接库
至此,成功调用自己编写的Dll程序。