GetFullPathNameA
_getcwd然后strcat
filesystem::absolute
_getcwd然后strcat
filesystem::absolute
教程中所用到的资源:
XXXXXXXXXXXXXXXXX/download-open-source/#section-2
XXXXXXXXXXXXXXXXX/XXXXXXXXXXXXml
XXXXXXXXXXXXXXXXXX/opencv/opencv_contrib
(这里是尚未编写完成的教程)
通常来说,只有训练过的内容神经网络才会认识。
附源码:
dnndemo.h
<code class="language-c">#ifndef DNNDEMO_H #define DNNDEMO_H #include <qobject> #include <qimage> #include <opencv2 dnn.hpp> #include <opencv2 imgproc.hpp> typedef struct classIdProb { int classId; double classProb; } ClassIdProb; class DnnDemo : public QObject { Q_OBJECT public: explicit DnnDemo(QObject *parent = 0); ClassIdProb getClassIdProbByImage(QImage image); private: cv::dnn::Net net; void getMaxClass(cv::dnn::Blob &probBlob, int *classId, double *classProb); signals: public slots: }; #endif // DNNDEMO_H </opencv2></opencv2></qimage></qobject></code>
dnndemo.cpp
<code class="language-c">#include "dnndemo.h" #include <opencv2 dnn.hpp> #include <opencv2 imgproc.hpp> using namespace cv; using namespace cv::dnn; DnnDemo::DnnDemo(QObject *parent) : QObject(parent) { //prototxt和caffemodel文件的路径,看起来很丑,我不知如何使用相对路径打开它 const char * modelTxt = "C:/Users/ml/Documents/build-CvDnnDemo-Desktop_Qt_5_7_0_MinGW_32bit-Debug/bvlc_googlenet.prototxt"; const char * modelBin = "C:/Users/ml/Documents/build-CvDnnDemo-Desktop_Qt_5_7_0_MinGW_32bit-Debug/bvlc_googlenet.caffemodel"; //加载prototxt和caffemodel文件 Ptr<dnn::importer> importer = dnn::createCaffeImporter(modelTxt, modelBin); //初始化神经网络,不细说 importer->populateNet(net); //不再需要这个importer了,释放 importer.release(); } ClassIdProb DnnDemo::getClassIdProbByImage(QImage image) { //GoogleNet规定了只许使用224x224的RGB图像,这里是从QImage到Mat的各种转换,不细说 image = image.convertToFormat(QImage::Format_RGB888); Mat img = Mat(image.height(), image.width(), CV_8UC3, image.scanLine(0));; resize(img, img, Size(224, 224)); //把Mat图像类型数据转换成给神经网络使用的Blob dnn::Blob inputBlob = dnn::Blob(img); //设置".data"层的输入数据,"data"是模型文件bvlc_googlenet.prototxt当中一个层,位于最前,至于为什么加一个"."我也不懂,尚且留着吧。。。 net.setBlob(".data", inputBlob); //set the network input //使用神经网络做运算 net.forward(); //获取神经网络中"prob"的输出结果,"prob"也是模型文件bvlc_googlenet.prototxt当中一个层的名字,位于最后 dnn::Blob prob = net.getBlob("prob"); //ClassIdProb是我随便定义的一个struct,方便用来同时保存Id和Prob的值 ClassIdProb result; //寻找最佳匹配分类 getMaxClass(prob, &result.classId, &result.classProb); return result; } /* 使用神经网络运算结果寻找最佳的匹配 */ void DnnDemo::getMaxClass(dnn::Blob &probBlob, int *classId, double *classProb) { //一堆巴拉巴拉的转换,你要是数学好可以自己琢磨琢磨它是啥原理,总之就是把之前神经网络运算的结果变成一个Mat类型的变量了 Mat probMat = probBlob.matRefConst().reshape(1, 1); Point classNumber; //第二个参数是最小的匹配,这里用不到,就省略了 minMaxLoc(probMat, NULL, classProb, NULL, &classNumber); *classId = classNumber.x; } </dnn::importer></opencv2></opencv2></code>
因为绝对路径的关系就不上传 bin 文件了,有兴趣的朋友自己编译体会一下吧。
[修改于 8年3个月前 - 2016/09/24 18:04:34]
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |
200字以内,仅用于支线交流,主线讨论请采用回复功能。