目錄
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
參考文章: