目的:主要为了将C++的图像处理部分交给C#界面,特此学习怎么用DLL。
一、生成DLL
1、在vs中创建名为datFile的dll项目,设置包含目录和库目录为opencv路径
2、编写datFile类的头文件和实现
datFile.h
#ifndef DATFILE_H
#define DATFILE_H
#include <iostream>
#include <fstream>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/gpu/gpu.hpp"
#include "opencv2/contrib/contrib.hpp" //所用到的头文件
#pragma comment( lib, "opencv_core249d.lib" )
#pragma comment( lib, "opencv_highgui249d.lib" )
#pragma comment( lib, "opencv_imgproc249d.lib" )
#pragma comment( lib, "opencv_gpu249d.lib" )
#pragma comment( lib, "opencv_contrib249d.lib" ) //所用到的lib
using namespace std;
using namespace cv; //命名空间
typedef int16_t datasize; //图像数据大小
class _declspec(dllexport) datFile //类声明,dllexport表示从dll中导出类
{
public:
void read(const char* filename, Mat& src); //从.dat导出数据
int16_t height;
int16_t width; //图像尺寸
};
#endif
datFile.cpp
#include "stdafx.h"
#include "datFile.h"
void datFile::read(const char* filename, Mat& src)
{
<span style="white-space:pre"> </span>//输入原始数据
ifstream datfile(filename, ios::in|ios::binary);
<span style="white-space:pre"> </span>datfile.read ((char*)&height, sizeof(int16_t));
datfile.read ((char*)&width, sizeof(int16_t));
src.create(height, width, CV_16UC1);
datfile.read ((char*)src.data, height*width*sizeof(datasize));
<span style="white-space:pre"> </span>datfile.close();
}
分别添加到项目的头文件和源文件中,编译,获得datFile.dll和datFile.lib
二、调用DLL
1、创建名为testDll的控制台项目,设置包含目录和库目录为opencv路径
2、把datFile.cpp拷贝至本目录并添加头文件
3、编写测试代码。
testDll.cpp
#include "stdafx.h"
#include "readDat.h" //包含类声明头文件
#pragma comment(lib,"lib所在路径\\datFile.lib") //或者把lib拷贝至本目录,直接填"datFile.lib"
int _tmain(int argc, _TCHAR* argv[])
{
Mat src;
datFile dat;
dat.read("dat文件所在路径\\raw.dat",src);
namedWindow("show",CV_WINDOW_NORMAL);
resizeWindow("show",dat.height,dat.width);
imshow("show",src);
waitKey(0);
return 0;
}
编译,得到testDll.exe