GetFullPathNameA
_getcwd然后strcat
filesystem::absolute
_getcwd然后strcat
filesystem::absolute
教程中所用到的资源:
XXXXXXXXXXXXXXXXX/download-open-source/#section-2
XXXXXXXXXXXXXXXXX/XXXXXXXXXXXXml
XXXXXXXXXXXXXXXXXX/opencv/opencv_contrib
(这里是尚未编写完成的教程)
通常来说,只有训练过的内容神经网络才会认识。
附源码:
dnndemo.h
#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>
dnndemo.cpp
#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>
因为绝对路径的关系就不上传 bin 文件了,有兴趣的朋友自己编译体会一下吧。
[修改于 8年4个月前 - 2016/09/24 18:04:34]
200字以内,仅用于支线交流,主线讨论请采用回复功能。