本文是一篇介绍如何将你写的opencv C++程序以及本地OPENCV 环境打包成一个dll(仅在Windows端),然后可移植在其他干净的电脑上运行的博客。
本文所用的IDE VS2010
OPENCV C++版本 2.4.11
首先,新建一个C++类库:
把opencv 源码和lib 文件放在该工程目录下:
我把opencv 源码文件夹 opencv opencv2 放在一起在opencv_source这个文件夹下:
然后与VS2010搭配使用的是VC10文件夹。
你只需要保留lib文件夹即可,其他的都可以删掉。
打开工程属性:
最好调成release版本,因为会更小,编译的更快。
然后平台设为x64,因为我这里是64位编译的opencv。
项目默认值按照这里设置。
下面是如何设置包含目录和库目录,这是最重要的一环。
你还需要opencv 的lib , 这样才能在一起编译。记住,在附加依赖项这一栏里,你需要写上所有的release版本的lib库文件,就是文件名不带字母 d 的:
opencv_calib3d2411.lib
opencv_contrib2411.lib
opencv_core2411.lib
opencv_features2d2411.lib
opencv_flann2411.lib
opencv_gpu2411.lib
opencv_highgui2411.lib
opencv_imgproc2411.lib
opencv_legacy2411.lib
opencv_ml2411.lib
opencv_objdetect2411.lib
opencv_ts2411.lib
opencv_video2411.lib
这些文件都是在这里找到:
你把不带 字母 d 的都写上为好,写多了不当紧。
写在连接器->输入->附加依赖项里,如下所示:
工程属性配置完毕。
接下来介绍源代码:
这里我的工程名字为AudioVideoDll, 那么你就需要在AudioVideoDll.h 这个头文件里加入到你所需要让调用程序使用的接口:
(关于 extern “C” _declspec(dllexport) 请自行百度)
// AudioVideoDll.h
#pragma once
#define _EXTERN_C_ extern "C" _declspec(dllexport)
#include <string>
using namespace std;
_EXTERN_C_ int CalKaDun(char* _filename);
然后再在AudioVideoDll.cpp里写下你的源代码:
// 这是主 DLL 文件。根据需要引入你所需要的STL库与算法库,还有opencv库。
#include "stdafx.h"
#include "AudioVideoDll.h"
#include <stdio.h>
#include <time.h>
#include <iostream>
#include<iostream>
#include <string>
#include <cmath>
#include <vector>
#include<opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include "SFR.h"
using namespace cv;
using namespace std;
//有无卡顿
int CalKaDun(char* _filename){
/*你的源代码*/
}
这里我仅仅简单介绍过程,所以源代码部分可以省略。事实上,一个大的过程编译成的动态链接库是很多函数接口暴漏出来的。
编译》》》》
点生成解决方案即可。
将生成的DLL 拿出来,这里就是
AudioVideoDll.dll
下面讲如何使用它:
新建一个C# 控制台程序即可,简单点。
设置成release版的:
先把C# 工程生成一下:
然后把AudioVideoDll.dll 放在 该C# 工程bin下:
C# 如何调用C++ DLL 我从简介绍即可:
//你的C++调用类Functions:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace CSharpUseAudioVideoDll
{
class Functioncs
{
[DllImport("AudioVideoDll.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public extern static int CalKaDun(ref byte filename);
}
}
//你的测试类Program:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CSharpUseAudioVideoDll
{
class Program
{
static void Main(string[] args)
{
byte[] srcBytes = System.Text.Encoding.ASCII.GetBytes("man_made.avi");
Console.WriteLine("计算卡顿:");
Console.WriteLine(Functioncs.CalKaDun(ref srcBytes[0]));
Console.ReadKey();
}
}
}
下面又是一个重点:
如何移植:
先生成编译一下:
然后把你编译好的C# exe可执行文件和opencv C++的DLL与lib 文件放在一起即可
上面图片,VC10就是opencv c++ 的lib文件
AudioVideoDll.dll就是你打包的dll。
CSharpUseAudioVideoDll.exe就是你的C# exe。
其他是实验视频。
接下来的就是一组opencv c++ 的dll 了,把他们和你的AudioVideoDll.dll
CSharpUseAudioVideoDll.exe
放在一起。
放在一个文件夹内,移植到一台干净的电脑上即可运行:
完。