Не удалось подтвердить ROI при обнаружении лица в OpenCV

Я немного новичок в OpenCV, и я хотел попрактиковаться с простым распознавание лиц и обрезка изображений.

В частности, я загружаю изображения из папки, используя cv::globЗатем я определяю лица, рисую прямоугольник на обнаруженном лице и затем обрезаю только обнаруженную область лица.

Все работает отлично, лицо распознано, прямоугольник нарисован прямо на месте. За исключением последней части: обрезка. Я получаю позорный Assertion Failed ошибка. Ниже мой код и ошибка, которую я имею:

void faceDetectFolder()
{
Mat source;

CascadeClassifier face_cascade;
face_cascade.load("C:/OpenCV-3.2.0/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml");

String path(path on my PC);
std::vector<cv::String> fn;
glob(path, fn, true);

for (size_t i = 0; i < fn.size(); i++)
{
source = imread(fn[i]);
if (source.empty()) continue;

std::string imgname = fn[i].substr(45, std::string::npos); //File name
std::vector<Rect> faces;
face_cascade.detectMultiScale(source, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));

for (int i = 0; i < faces.size(); i++)
{

if (faces[i].width > 80 && faces[i].height*0.5 > 80) //Threshold, some detections are false
{
int x = faces[i].x;
int y = faces[i].y;
int h = y + faces[i].height;
int w = x + faces[i].width;

rectangle(source, Point(x, y), Point(w, h), Scalar(255, 0, 0), 2, 8, 0); //Drawing rectangle on detected face

imshow(imgname, source);

Rect roi;
roi.x = x;
roi.y = y;
roi.height = h;
roi.width = w;

Mat detectedface = source(roi);

imshow("cropped image", detectedface);

waitKey(0);
}
}
}
}

И ошибка:

Ошибка OpenCV: утверждение не выполнено (0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= протоколы && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows) в cv :: Mat :: Mat, файл C: \ build \ master_winpack-build-win64-vc14 \ opencv \ modules \ core \ src \ matrix.cpp, строка 522

Теперь я понимаю, что ошибка появляется, потому что roi вне границ. Вот что меня беспокоит.

  1. Разве я не должен получить эту ошибку, когда я пытаюсь нарисовать прямоугольник в первую очередь? Почему я получаю ошибку на roi но НЕ на прямоугольнике я рисую?

  2. Почему roi за границами? Я показываю изображение с нарисованным прямоугольником, и все выглядит хорошо. Почему я получаю эту ошибку, когда roi имеет те же значения, что и нарисованный прямоугольник?

Пожалуйста, извините меня за любые ошибки новичка, мы все начинаем где-нибудь. Спасибо за чтение и хорошего дня!

1

Решение

в roi.height а также roi.widthпопробуйте дать faces[i].height а также faces[i].width
соответственно. В самом деле, вы могли бы подумать, что ошибка должна появиться раньше, но она работает с рисованием, поскольку прямоугольник принимает в качестве аргумента две диагонально противоположные вершины, а не ширину / высоту в случае вашей Rect roi, Вы могли бы инициализировать Rect вместо Point(x, y) а также Point(w,h) и это должно работать нормально.

2

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

Других решений пока нет …

По вопросам рекламы [email protected]