0

我想将 openCV 级联添加到 QT 的资源管理中。但我失败了。

我已经测试了这段代码:

// load cascades
QUrl *location_cascade= new QUrl("qrc:/cascades/haarcascade_frontalface_alt.xml");
std::string file=location_cascade->toString().toStdString();
CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad( file);

但比编译器说的:

cannot convert 'std::string* {aka std::basic_string<char>*}' to 'const char*' for argument '1' to 'void* cvLoad(const char*, CvMemStorage*, const char*, const char**)'

有人有想法吗?

更新 当前该文件位于项目的源文件夹中。我可以通过相对路径访问这个文件吗?也许是指向 src.dir 的常数?

问候

4

3 回答 3

2

编译器告诉你cvLoad应该是的第一个参数const char*,但你正在传递std::string。您需要将其称为cvLoad(file.c_str()).

但是,即使您设法编译了该代码,它也可能无法正常工作,因为 openCV 对 Qt 资源一无所知,并且无法打开具有该名称的文件。

于 2013-04-19T07:55:56.647 回答
1

即便如此,这个问题已经 2 岁了,我想分享我使用的解决方法。

QString sPath = QCoreApplication::applicationDirPath().append("/frontalface.xml")
QFile::copy(":/android-sources/OpenCV/haarcascade_frontalface_default.xml" , sPath);
cv::CascadeClassifier faceCascade = cv::CascadeClassifier(sPath.toStdString());
QFile::remove(sPath);

它可以工作,但你必须绕道绕过本地硬盘。对于 android 应用程序仍然有用。

于 2016-02-25T14:44:06.640 回答
0
using namespace cv;    
QFile xmlRes(":/new/cascades/res/cascade.xml");
    if (xmlRes.open(QIODevice::ReadOnly)) {
        QString data(xmlRes.readAll());
        FileStorage fs(data.toStdString().c_str(), FileStorage::MEMORY | FileStorage::FORMAT_XML);
        if (!cascade.read(fs["cascade"]))
            qDebug() << "ERROR: Could not read classifier cascade.";
    }
于 2020-09-22T11:39:31.060 回答