目录
1.下载之后双击.exe文件,解压得到即可opencv文件夹
2.配置环境变量,此电脑->属性->高级系统设置->环境变量->系统环境变量PATH
3.添加windows运行库目录,该目录为protobuf的bin路径
一、下载vs2017
vs2017下载地址:http://visual studio community 2017
下载之后双击.exe文件,选择安装“.NET桌面开发、使用C++的桌面开发、使用window平台开发”三项。
可以自己选择安装路径,避免C盘占用过大。
二、下载安装cmake
下载地址:https://cmake.org/download/
解压下载文件,将bin目录添加到系统路径,此电脑->属性->高级系统设置->环境变量->系统环境变量PATH:
三、编译protobuf
protobuf3.4.0下载地址:protobuf3.4.0
1.解压下载的文件,然后从“开始”打开vs2017本机工具
2.编译protobuf
> cd <protobuf-root-dir>
> mkdir build-vs2017
> cd build-vs2017
> cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_MSVC_STATIC_RUNTIME=OFF ../cmake
> nmake
> nmake install
<protobuf-root-dir>是你解压后protobuf所在的目录,例如D:/yolov3/protobuf-3.4.0。
四、编译ncnn
ncnn下载地址:https://github.com/Tencent/ncnn。点击“clone or download”下载zip格式文件。
1.解压下载文件,编译ncnn
> cd <ncnn-root-dir>
> mkdir -p build-vs2017
> cd build-vs2017
# cmake option NCNN_VULKAN for enabling vulkan
> cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=%cd%/install \
-DProtobuf_INCLUDE_DIR=<protobuf-root-dir>/build-vs2017/install/include \
-DProtobuf_LIBRARIES=<protobuf-root-dir>/build-vs2017/install/lib/libprotobuf.lib \
-DProtobuf_PROTOC_EXECUTABLE=<protobuf-root-dir>/build-vs2017/install/bin/protoc.exe \
-DNCNN_VULKAN=OFF ..
> nmake
> nmake install
pick build-vs2017/install folder for further usage
注意以上命令也是在vs2017本机工具执行,并且需要将<ncnn-root-dir>和<protobuf-root-dir>替换成自己的下载的ncnn和protobuf的路径,例如:D:/yolov3/ncnn-master和D:/yolov3/protobuf-3.4.0。
五、下载opencv
opencv3.4.2下载地址:https://github.com/opencv/opencv/releases
1.下载之后双击.exe文件,解压得到即可opencv文件夹
2.配置环境变量,此电脑->属性->高级系统设置->环境变量->系统环境变量PATH
六、在VS2017中配置和测试
1.打开Visual Studio 2017,新建一个C++项目。选择【视图】->【其他窗口】->【属性管理器】,点击之后,选择“Debug|x64”。双击“Microsoft.Cpp.x64.user”,并添加包含目录
2.添加库目录
3.添加windows运行库目录,该目录为protobuf的bin路径
4.在链接器-常规添加附加库目录
4.在链接器-输入中添加附加依赖项
5.测试用例a
//打开摄像头样例
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
using namespace cv;
int main()
{
VideoCapture cap(0);
Mat frame;
while (1)
{
cap >> frame;
imshow("调用摄像头", frame);
waitKey(30);
}
return 0;
}
6.测试用例b,需指定ncnn格式的squeezenet模型路径和并在工程中(和main.cpp同目录下)预先添加测试图片test.jpg。注意要把OpenCV的头文件放在最上面,深度网络的头文件放到下面
#include <opencv2\opencv.hpp>
#include <map>
#include <vector>
#include <algorithm>
#include <functional>
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <net.h>
static int detect_squeezenet(const cv::Mat& bgr, std::vector<float>& cls_scores)
{
ncnn::Net squeezenet;
squeezenet.load_param("D:/yolov3/ncnn-master/examples/squeezenet_v1.1.param");
squeezenet.load_model("D:/yolov3/ncnn-master/ncnn-20190611/examples/squeezenet_v1.1.bin");
ncnn::Mat in = ncnn::Mat::from_pixels_resize(bgr.data, ncnn::Mat::PIXEL_BGR, bgr.cols, bgr.rows, 227, 227);
const float mean_vals[3] = { 104.f, 117.f, 123.f };
in.substract_mean_normalize(mean_vals, 0);
ncnn::Extractor ex = squeezenet.create_extractor();
ex.input("data", in);
ncnn::Mat out;
ex.extract("prob", out);
cls_scores.resize(out.w);
for (int j = 0; j<out.w; j++)
{
cls_scores[j] = out[j];
}
return 0;
}
static int print_topk(const std::vector<float>& cls_scores, int topk)
{
// partial sort topk with index
int size = cls_scores.size();
std::vector< std::pair<float, int> > vec;
vec.resize(size);
for (int i = 0; i<size; i++)
{
vec[i] = std::make_pair(cls_scores[i], i);
}
std::partial_sort(vec.begin(), vec.begin() + topk, vec.end(),
std::greater< std::pair<float, int> >());
// print topk and score
for (int i = 0; i<topk; i++)
{
float score = vec[i].first;
int index = vec[i].second;
fprintf(stderr, "%d = %f\n", index, score);
}
return 0;
}
int main()
{
std::string imagepath = "./test.jpg";
cv::Mat m = cv::imread(imagepath, CV_LOAD_IMAGE_COLOR);
if (m.empty())
{
std::cout << "cv::imread " << imagepath << " failed\n" << std::endl;
return -1;
}
std::vector<float> cls_scores;
detect_squeezenet(m, cls_scores);
print_topk(cls_scores, 3);
return 0;
}
注:调试时需选择X64
参考文章: