распознавание лиц в Qt и opencv

Я написал некоторый код для распознавания лиц в c ++, используя библиотеку opencv. Здесь я управляю указателем мыши, используя лицо. Когда я пишу тот же код в Qt, он не загружает файлы haarcascade xml

Вот мой код на C ++:

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
using namespace cv;

CascadeClassifier faceCade;

String faceCascadeName = "lbpcascade_frontalface.xml";
String FaceDetectWindow = "Face Detector Window";
String FaceDetectGrayWindow = "Face Detector Gray Window";int main() {

VideoCapture cap(0);
Mat camFrames, grayFrames;
vector<Rect> faces;
long imageIndex = 0;

int preX=0,preY=0;
int j=0;

if( !faceCade.load( faceCascadeName ) ){ cout<<"--(!)Error loading\n"; return -1; };

while (1) {
cap >> camFrames;

cvtColor(camFrames, grayFrames, CV_BGR2GRAY);
equalizeHist(grayFrames, grayFrames);

faceCade.detectMultiScale(grayFrames, faces, 1.1, 2, 0, Size(160, 160));

for (int i = 0; i < faces.size(); i++)
{
Mat faceROI = grayFrames(faces[i]);

rectangle(camFrames, Rect(faces[i].x - 25,faces[i].y - 25,faces[i].width + 35 ,faces[i].height + 35),  Scalar(0, 0, 255), 1, 1, 0);

Point center(faces[i].x + faces[i].width * 0.5,faces[i].y + faces[i].height * 0.5);cout<<"\nx = "<<faces[i].x<<"\ty = "<<faces[i].y;

//while(j==10)
//{
if((faces[i].y<125)&&(faces[i].x<255))
{
printf("  RU");
system("xte 'mousermove 10 -10'");
}
else if((faces[i].y>185)&&(faces[i].x<255)){
printf("  RD");
system("xte 'mousermove 10 10'");
}
else if((faces[i].y>185)&&(faces[i].x>305)){
printf("  LD");
system("xte 'mousermove -10 10'");
}
else if((faces[i].y<125)&&(faces[i].x<255)){
printf("  LU");
system("xte 'mousermove -10 -10'");
}
else if((faces[i].y>185)&&(faces[i].x>255)&&(faces[i].x<305)){
printf("  Down");
system("xte 'mousermove 0 10'");
}
else if((faces[i].y<125)&&(faces[i].x>255)&&(faces[i].x<305)){
printf("  up");
system("xte 'mousermove 0 -10'");
}
else if((faces[i].y>125)&&(faces[i].y<185)&&(faces[i].x<255)){
printf("  L");
system("xte 'mousermove -10 0'");
}
else if((faces[i].y>125)&&(faces[i].y<185)&&(faces[i].x>305)){
printf("  R");
system("xte 'mousermove 10 0'");
}
preX = faces[i].x;
preY   = faces[i].y;
j=0;
}
//j++;
//}

imshow(FaceDetectWindow, camFrames);
imshow(FaceDetectGrayWindow, grayFrames);
if(waitKey(30) >= 0) break;

}

}

здесь лицо обнаружено, но в приведенном ниже коде QT это не работает

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
using namespace cv;

CascadeClassifier faceCade;

String faceCascadeName = ":/new/prefix1/lbpcascade_frontalface.xml";
String FaceDetectWindow = "Face Detector Window";
String FaceDetectGrayWindow = "Face Detector Gray Window";int main() {

VideoCapture cap(0);
Mat camFrames, grayFrames;
vector<Rect> faces;
long imageIndex = 0;

int preX=0,preY=0;
int j=0;

if( !faceCade.load( "lbpcascade_frontalface.xml" ) ){ cout<<"--(!)Error loading\n"; return -1; };

while (1) {
cap >> camFrames;

cvtColor(camFrames, grayFrames, CV_BGR2GRAY);
equalizeHist(grayFrames, grayFrames);

faceCade.detectMultiScale(grayFrames, faces, 1.1, 2, 0, Size(80, 80));

/*    for (int i = 0; i < faces.size(); i++)
{
Mat faceROI = grayFrames(faces[i]);

rectangle(camFrames, Rect(faces[i].x - 25,faces[i].y - 25,faces[i].width + 35 ,faces[i].height + 35),  Scalar(0, 0, 255), 1, 1, 0);

Point center(faces[i].x + faces[i].width * 0.5,faces[i].y + faces[i].height * 0.5);cout<<"\nx = "<<faces[i].x<<"\ty = "<<faces[i].y;

//while(j==10)
//{
if((faces[i].y<125)&&(faces[i].x<255))
{
printf("  RU");
system("xte 'mousermove 10 -10'");
}
else if((faces[i].y>185)&&(faces[i].x<255)){
printf("  RD");
system("xte 'mousermove 10 10'");
}
else if((faces[i].y>185)&&(faces[i].x>305)){
printf("  LD");
system("xte 'mousermove -10 10'");
}
else if((faces[i].y<125)&&(faces[i].x<255)){
printf("  LU");
system("xte 'mousermove -10 -10'");
}
else if((faces[i].y>185)&&(faces[i].x>255)&&(faces[i].x<305)){
printf("  Down");
system("xte 'mousermove 0 10'");
}
else if((faces[i].y<125)&&(faces[i].x>255)&&(faces[i].x<305)){
printf("  up");
system("xte 'mousermove 0 -10'");
}
else if((faces[i].y>125)&&(faces[i].y<185)&&(faces[i].x<255)){
printf("  L");
system("xte 'mousermove -10 0'");
}
else if((faces[i].y>125)&&(faces[i].y<185)&&(faces[i].x>305)){
printf("  R");
system("xte 'mousermove 10 0'");
}
preX = faces[i].x;
preY   = faces[i].y;
j=0;
}
//j++;
//}*/

imshow(FaceDetectWindow, camFrames);
imshow(FaceDetectGrayWindow, grayFrames);
if(waitKey(30) >= 0) break;

}

}

пожалуйста, помогите мне сделать это в платформе QT
здесь вывод, показанный в коде qt, — (!) Ошибка загрузки
что означает, что каскадный файл не загружен

1

Решение

String faceCascadeName = ":/new/prefix1/lbpcascade_frontalface.xml";

Это допустимый путь, но вам нужно создать его в файле ресурсов Qt.

http://qt-project.org/doc/qt-5.0/qtcore/resources.html

В противном случае, если вы не хотите иметь дело с ресурсами, выберите относительный путь.

Например:

"./file.xml" будет искать XML-файл из рабочего каталога.

"../file.xml" будет искать XML-файл на один уровень выше рабочего каталога.

Надеюсь, это поможет.

2

Другие решения

Следующий путь не кажется правильным:

String faceCascadeName = ":/new/prefix1/lbpcascade_frontalface.xml";
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector