您的位置:首页 > 运维架构

【学习OpenCV】通过DLL实现图像数据从.dat导入Mat

2014-09-04 16:15 543 查看
目的:主要为了将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

4、将datFile.dll和相关的opencv的dll(包括tbb的lib)与testDll.exe放在同一个文件夹里,那么在别的没有部署opencv的机器上也可以运行了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: