这是建立在win10上已经搭建好caffe框架的前提下进行的,若还没在win10下搭建caffe,则请查看caffe安装。
1. 安装OpenCV 3.1.0
1.1 下载解压opencv 算法库
进入到以下链接:OpenCV 3.1.0下载,需要下载的版本选 3.1.0,点击Windows,即可下载。注意:caffe目前只支持OpenCV 3.1.0版本的。
下载完之后双击.exe,在抽取文件的目录中选择想要存放的磁盘和文件夹即可。
比如我抽取到的文件路径是:D:\software\opencv3
进入 D:\software\opencv3\opencv\build\x64\vc14\bin 将安装路径配置到环境变量中:
然后在这个相同的路径:D:\software\opencv3\opencv\build\x64\vc14\bin下,复制
opencv_world310.dll
opencv_world310d.dll
到C:\Windows\System32 路径下。
1.2 新建c++ 空白项目并配置opencv 目录及链接器
新建c++ 空白项目,在新建好的Project1 项目名称上右击 ,点击属性:把平台改为 x64,(debug还是release按自己需求来);
点击VC ++ 目录, 点击包含目录,点击右边的下拉三角形,点击编辑,将如下目录输入即可,
D:\software\opencv3\opencv\build\include
D:\software\opencv3\opencv\build\include\opencv2
这表示,VC++ 会从此opencv 算法目录调用。
然后,点击库目录,点击右边的下拉三角形,点击编辑,将如下目录输入即可,
D:\software\opencv3\opencv\build\x64\vc14\lib
然后点击确认。
接下来,点击链接器,点击输入,点击附加依赖项,点击右边的下拉三角形,点击编辑,将如下目录输入即可:opencv_world310d.lib
注意:opencv_world310d.lib对应debug版,opencv_world310.lib对应release版。
点击应用,点击确认,等待配置完成。
1.3 测试代码
#include<opencv2/opencv.hpp>
#include<iostream>
#include <string>
using namespace cv;
void ImageThreshold(String str) {
Mat image = imread(str);
Mat binary;
cvtColor(image, binary, COLOR_BGR2GRAY);
imshow("test_opencv_srtup", binary);
waitKey(0);
}
int main() {
String str = "C:\\Users\\Administrator\\Desktop\\timg.jpg"; #图片路径自己改
ImageThreshold(str);
return 0;
}
如果能正常出图就表示配置正确。
2.使用caffe进行图像分类
2.1 配置环境
1)已经配置好了caffe的基本环境,包括使用python的“import caffe”不出错,可按照https://www.jianshu.com/p/5026bede958a,进行配置,并且libraries_v140_x64_py35_1.1.0.tar.bz2已经解压至对应目录。
2)使用VS2015新建空项目“cpp_classification”;拷贝文件cpp_classification.cpp(地址E:\caffe\examples\cpp_classification目录下)至VS2015新建的目录下;右键源文件添加现有项,选中“classification.cpp”。
3)调整配置“Release、x64”或“Debug、x64”
4)配置包含目录、库目录和附加依赖项
- 包含目录:VC++目录 -> 包含目录
- 添加caffe的包含目录
E:\caffe\include
- 将E:\caffe\scripts\build\include\caffe(有可能在E:\caffe\build\include\caffe) 下的proto文件夹复制到E:\caffe\include\caffe下
- 添加boost的包含目录
C:\Users\XMICUser\.caffe\dependencies\libraries_v140_x64_py35_1.1.0\libraries\include\boost-1_61
- 添加其他依赖的包含目录
C:\Users\XMICUser\.caffe\dependencies\libraries_v140_x64_py35_1.1.0\libraries\include
- 预处理器:C/C++ ->预处理器->预处理的宏定义
添加:
USE_OPENCV
CPU_ONLY
- 最终包含目录为:
- 库目录: VC++目录 -> 库目录
C:\Users\XMICUser\.caffe\dependencies\libraries_v140_x64_py35_1.1.0\libraries\lib
在编译的时候系统会提示无法打开lib*.lib文件(例如,无法打开文件“libboost_date_time-vc140-mt-1_61.lib”),我的系统中主要是boost中的一些lib。其实这些lib在文件夹中是存在的只是命名的方式不对。将库文件夹中对应的lib文件前面加上lib三个字母就可以了。
例如我的系统中提示找不到libboost_date_time-vc140-mt-1_61.lib,在同一个文件夹中创建一个副本并重新命名为libboost_date_time-vc140-mt-1_61.lib就行了。(除了这个.lib库需要重命名,其他还有几个)
- (二选一)解决方案为 Release
添加caffe.lib的Release版本包含目录:
E:\caffe\scripts\build\lib\Release
- (二选一)解决方案为 Debug
添加caffe-d.lib的Debug版本包含目录:
E:\caffe\scripts\build\lib\Debug
- 添加python3.5的库目录
D:\software\Anaconda3\envs\python35_env\libs
- 总的库目录
- 附加依赖项:链接器 -> 输入 -> 附加依赖项
- (二选一)解决方案为 Release
根据E:\caffe\scripts\build\examples\cpp_classification\Release 目录下的DLL依赖文件名称,在附加依赖中添加对应的lib名。
例如,
总的附加依赖项为:
caffe.lib
caffeproto.lib
python35.lib
gflags.lib
glog.lib
libprotobuf.lib
libprotoc.lib
opencv_world310.lib
boost_chrono-vc140-mt-1_61.lib
boost_filesystem-vc140-mt-1_61.lib
boost_python-vc140-mt-1_61.lib
boost_system-vc140-mt-1_61.lib
boost_thread-vc140-mt-1_61.lib
caffehdf5.lib
caffehdf5_hl.lib
caffezlib.lib
libopenblas.dll.a
opencv_world310.lib 之前配置opencv时添加过可以在这里可不写。
- (二选一)解决方案为 Debug
总的附加依赖项为:
caffe-d.lib
caffeproto-d.lib
python35.lib
gflagsd.lib
glogd.lib
libprotobufd.lib
libprotoc.lib
opencv_world310.lib
boost_chrono-vc140-mt-gd-1_61.lib
boost_filesystem-vc140-mt-gd-1_61.lib
boost_python-vc140-mt-gd-1_61.lib
boost_system-vc140-mt-gd-1_61.lib
boost_thread-vc140-mt-gd-1_61.lib
caffehdf5_D.lib
caffehdf5_hl_D.lib
caffezlib.lib
libopenblas.dll.a
配置部分结束,此时已经能够编译成功。
2.2 图像分类
- 修改classification.cpp文件
- 添加head.h 头文件
当前目录下新建head.h 头文件
添加代码:
#include "caffe/common.hpp"
#include "caffe/layers/input_layer.hpp"
#include "caffe/layers/inner_product_layer.hpp"
#include "caffe/layers/dropout_layer.hpp"
#include "caffe/layers/conv_layer.hpp"
#include "caffe/layers/relu_layer.hpp"
#include "caffe/layers/pooling_layer.hpp"
#include "caffe/layers/lrn_layer.hpp"
#include "caffe/layers/softmax_layer.hpp"
namespace caffe
{
extern INSTANTIATE_CLASS(InputLayer);
extern INSTANTIATE_CLASS(InnerProductLayer);
extern INSTANTIATE_CLASS(DropoutLayer);
extern INSTANTIATE_CLASS(ConvolutionLayer);
REGISTER_LAYER_CLASS(Convolution);
extern INSTANTIATE_CLASS(ReLULayer);
REGISTER_LAYER_CLASS(ReLU);
extern INSTANTIATE_CLASS(PoolingLayer);
REGISTER_LAYER_CLASS(Pooling);
extern INSTANTIATE_CLASS(LRNLayer);
REGISTER_LAYER_CLASS(LRN);
extern INSTANTIATE_CLASS(SoftmaxLayer);
REGISTER_LAYER_CLASS(Softmax);
}
之后在classification.cpp中include该头文件
# include "head.h"
-
下载测试数据 链接:http://pan.baidu.com/s/1skIfYkH 密码:w69a
将cifar放到Project1.vcxproj同一目录下
(二选一)解决方案为 Release
复制E:\caffe\scripts\build\examples\cpp_classification\Release 下所有文件到
E:\cpp_classification\Project1\x64\Release下
工程里会有几个x64,我们这里的x64是和Project1.sln同目录的x64。(二选一)解决方案为 Debug
复制E:\caffe\scripts\build\examples\cpp_classification\Debug 下所有文件到
E:\cpp_classification\Project1\x64\Debug下编译-开始执行(不调试)
参考博客:
博客一:https://blog.csdn.net/zb1165048017/article/details/70116323
博客二:https://blog.csdn.net/m0_47472749/article/details/111328183
博客三:https://blog.csdn.net/woha1yo/article/details/117877773