从QT资源加载openCV Haarcascade

时间:2013-04-19 07:26:31

标签: c++ qt opencv

我想将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的常量?

问候

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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应用程序仍然有用。

答案 2 :(得分:0)

def guests(member,signup,visitor):
    visit = []
    for person in visitor:
        if person not in member and person not in signup:
            visit.append(person)
    return visit if len(visit) != 0 else None