Qt读取分类器训练后xml文件(以SVM为例)
文章目录1 问题描述2 解决方法3 总结1 问题描述之前在用qt写mac桌面应用程序的时候,当时做的是行人检测,由于每次检测要读取训练出来的xml文件,因此需要把xml保存起来,然后每次运行程序后保存起来。首先想到的第一个解决方法是把xml文件放在Resources中,然后通过QFile file(":/detectionFile/source/SVM_HOG.xml");string ...
1 问题描述
之前在用qt写mac桌面应用程序的时候,当时做的是行人检测,由于每次检测要读取训练出来的xml文件,因此需要把xml保存起来,然后每次运行程序后保存起来。
首先想到的第一个解决方法是把xml文件放在Resources中,然后通过
QFile file(":/detectionFile/source/SVM_HOG.xml");
string tempname = file.toStdString();
Ptr<SVM> svm = SVM::create();// 创建分类器
svm = SVM::load(tempname);
来读取,后面实现发现这种方法不行,在编译器上可以运行,但是单独打开编译好的软件一读取xml文件就会崩溃。
后面尝试了第二种方法,
QString temp = QDir::currentPath();
string tempname = temp.toStdString();
tempname += "/SVM_HOG.xml";
Ptr<SVM> svm = SVM::create();// 创建分类器
svm = SVM::load(tempname);
通过绝对路径来读取,把文件放在app的/Users/macbookpro/Qt/build-pedestrian_detection-unknown-Release/pedestrian_detection.app/Contents/MacOS中和实际运行程序在同一个文件夹中,单独打开app再次崩溃。
2 解决方法
Ptr<SVM> svm = SVM::create();// 创建分类器
QString temp = QApplication::applicationDirPath();
string tempname = temp.toStdString() +"/SVM_HOG.xml";
Ptr<SVM> svm = SVM::create();// 创建分类器
svm = SVM::load(tempname);
3 总结
为什么能解决呢?
因为如果使用QString QDir::currentPath(),那么这个静态方法将返回应用程序当前目录的绝对路径。 当前目录是使用QDir :: setCurrent()设置的最后一个目录,或者,如果从未调用过,则是父进程在其上启动该应用程序的目录。
示例:
- 直接启动运行的程序(如:/Users/macbookpro/Qt/build-pedestrian_detection-unknown-Release/pedestrian_detection.app/Contents/MacOS/pedestrian_detection),QDir::currentPath()为:/Users/macbookpro/用户名。如果此时我所在的用户名为macpro,则QDir::currentPath()为/Users/macbookpro/macpro。
但是如果使用QApplication::applicationDirPath()
无论你通过何种途径去运行exe文件,QAppllication::appllicationDirPath()的路径始终都是exe文件所在的绝对路径。
更多推荐



所有评论(0)