1 #include <opencv2/opencv.hpp>
2 #include <opencv2/dnn.hpp>
3 #include <iostream>
4 //使用Googlenet Caffe模型实现图像分类
5 using namespace cv;
6 using namespace cv::dnn;
7 using namespace std;
8
9 String model_bin_file = "D:/opencv3.3/opencv/sources/samples/data/dnn/bvlc_googlenetaffemodel";//模型二进制文件
10 String model_txt_file = "D:/opencv3.3/opencv/sources/samples/data/dnn/bvlc_googlenet.prototxt";//模型文本(描述)文件
11 String labels_txt_file = "D:/opencv3.3/opencv/sources/samples/data/dnn/synset_words.txt";//标签文本文件
12 vector<String> readLabels();//读写文件方法
13 int main(int argc, char** argv)
19 namedWindow("input image", CV_WINDOW_AUTOSIZE);
20 imshow("input image", src);
21 vector<String> labels = readLabels();
22 //读取Caffe模型
23 Net net = readNetFrCaffe(model_txt_file, model_bin_file);
24 if (net.empty())
28 //由bvlc_googlenet.prototxt知网络输入层大小为224*224
29 Mat inputBlob = blobFrImage(src, 1.0, Size(224, 224), Scalar(104, 117, 123));
30 Mat prob;
31 for (int i = 0; i < 10; i++)
35 Mat probMat = prob.reshape(1, 1);//转换成一行多列的分类结果
36 Point classNumber;//最大可能性的分类号
37 double classProb;//最大可能性的概率值
38 minMaxLoc(probMat, NULL, &classProb, NULL, &classNumber);
39 int classidx = classNumber.x;
40 printf("\n current image classification : %s, possible : %.2f", labels.at(classidx)_str(), classProb);
41 //图片上放置文本 红色显示
42 putText(src, labels.at(classidx), Point(20, 20), FONT_HERSHEY_SIMPLEX, 1.0, Scalar(0, 0, 255), 2, 8);
43 imshow("Image Classification", src);
44
45 waitKey(0);
46 return 0;
47 }
48 vector<String> readLabels()
55 string name;
56 while (!fp.eof())
61 }
62 fplose();//关闭文件输入输出流
return classNames;//返回分类名
64 }
航天飞机,概率100%
山地单车,概率93%
上一篇:OpenCV3.2图像分割 实例10:绿幕视频背景替换下一篇:C++快速入门 第四讲:文件操作
OpenCV