我想将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的常量?
问候
答案 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