OpenCV程序封装为64位DLL给Java调用

OpenCV程序封装为64位DLL给Java调用

//最近两周一直在忙一件事,刚刚做完给Java调用成功了,Mark一下。
做图像处理的经常用到OpenCV这个第三方库,函数好写,打包不好打,尤其打包成64位dll时。下面就自己这段时期的工作,分享一下,如何封装为64位dll的并且如何给Java调用的
1,封装为64位DLL
首先要在win x64环境下,配置好属性。由于之前一直采用自己配置的属性页方式,比较懒,依赖于平台和本地环境。给封装带来了极大的不便利(但是自己开发时候很舒服,只要添加属性页就可以了,不用每次都配置,方法来源于《OpenCV2计算机视觉编程手册》chapter 1.3)。所以,一定要自己加载opencv的lib。可以先把程序做好,功能实现了之后,再考虑摘依赖的lib。可以使用Dependency Walker软件寻找你用到了哪些lib文件。
OpenCV程序封装为64位DLL给Java调用
如图,标问号的说明没找到dll,这样在几层之后的dll貌似也没有打包的必要。这个软件使用很简单:打开此软件的exe,选择你要分析的exe打开即可。确保你的功能实现了,exe没有错误。
然后,在生成DLL的过程中,将使用到的opencv dll文件放入文件夹中,注意,要把.hpp、lib、dll一起放好。在引用dll时,有多种方法。我用到的是#include“.hpp” #pragram comment(lib,”.lib”),这样就把对应的DLL加载进去了。注意 Debug模式和Release模式用到的Dll不同,d.lib,*d.dll与.lib,*.dll有什么区别不再赘言。32位与64位也不同。注意区别。
在VS设置中,我遇到了一个错误,_MSC_VER,value值不匹配问题。
最后逼的没办法,换了对应的VS,解决。
在属性表—C/C++—代码生成中,运行库的设置也会产生影响。
分别生成DLL和LIB之后,要带着.h文件作为一个交付的包。我自己调用了一遍,处理没问题了才放心交付。
最后,出现的
error LNK2019: 无法解析的外部符号 “public: __cdecl Imf::Header::Header(int,int,float,class Imath::Vec2 const &,float,enum Imf::LineOrder,enum Imf::Compression)” ([email protected]@@[email protected]?[email protected]@[email protected]@[email protected]@[email protected]@@Z),该符号在函数 "public: virtual bool __cdecl cv::ExrEncoder::write(class cv::Mat const &,class std::vector<int,class std::allocator<int> > const &)" ([email protected]@[email protected]@[email protected]@AEBV?[email protected][email protected]@[email protected]@@[email protected]@@Z) 中被引用
这样的错误,是因为有lib文件没包含。在opencv自带的staticlib中会找到大部分,有这个方向就能够解决这类问题。

2,Java如何调用DLL可以参考此链接内容。网上内容驳杂,这个写的不错。
http://blog.****.net/jiangwei0910410003/article/details/17465085