Я немного новичок в 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
вне границ. Вот что меня беспокоит.
Разве я не должен получить эту ошибку, когда я пытаюсь нарисовать прямоугольник в первую очередь? Почему я получаю ошибку на roi
но НЕ на прямоугольнике я рисую?
Почему roi
за границами? Я показываю изображение с нарисованным прямоугольником, и все выглядит хорошо. Почему я получаю эту ошибку, когда roi
имеет те же значения, что и нарисованный прямоугольник?
Пожалуйста, извините меня за любые ошибки новичка, мы все начинаем где-нибудь. Спасибо за чтение и хорошего дня!
в roi.height
а также roi.width
попробуйте дать faces[i].height
а также faces[i].width
соответственно. В самом деле, вы могли бы подумать, что ошибка должна появиться раньше, но она работает с рисованием, поскольку прямоугольник принимает в качестве аргумента две диагонально противоположные вершины, а не ширину / высоту в случае вашей Rect roi
, Вы могли бы инициализировать Rect
вместо Point(x, y)
а также Point(w,h)
и это должно работать нормально.
Других решений пока нет …