Извините, если название дало вам неверную идею, я постарался сделать это как можно более кратким. Короче говоря, я пытаюсь обнаружить лицо с помощью алгоритма Виолы-Джонса (уже реализованного), сохранить его в отдельном изображении, преобразовать это изображение в градации серого, а затем вернуть изображение в градациях серого в исходное положение, в результате чего дисплей веб-камеры, на котором все лица (и любые ложные срабатывания, я полагаю) окрашены в серый цвет и окружены зеленым прямоугольником. Тем не менее, я получаю следующее сообщение об ошибке:
Необработанное исключение в 0x771115de в proba.exe: исключение Microsoft C ++: cv :: Exception at> расположение в памяти 0x003ef2c8 ..
Это мой код (соответствующая часть), любые предложения / советы будут оценены:
face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );
for( int i = 0; i < faces.size(); i++ )
{
Point pt1(faces[i].x + faces[i].width, faces[i].y + faces[i].height);
Point pt2(faces[i].x, faces[i].y);
Rect myROI(pt1, pt2);
Mat croppedImage;
Mat(frame, myROI).copyTo(croppedImage);
cvtColor(croppedImage, croppedImage, CV_BGR2GRAY ); //the last four lines process the image
croppedImage.copyTo(frame(Rect(pt1, croppedImage.size()))); //this should copy the image back into its' original location
rectangle(frame, pt1, pt2, cvScalar(0, 255, 0, 0), 1, 8, 0);
}
//-- Show what you got
imshow( window_name, frame );
И извините, если я упускаю очевидный ответ.
Ваше обрезанное изображение в градациях серого croppedImage
является 1-канальным изображением, но вы пытаетесь наложить его на 3-канальное RGB-изображение frame
, Другими словами, функция copyTo
в
croppedImage.copyTo(frame(Rect(pt1, croppedImage.size())));
надеется croppedImage
иметь такое же количество каналов, как frame
, Вот почему вы получаете ошибку.
РЕДАКТИРОВАТЬ Чтобы решить проблему, попробуйте преобразовать обрезанное изображение в градациях серого обратно в формат RGB (оно все равно будет выглядеть как изображение в градациях серого). Что-то вроде
cvtColor(croppedImage, croppedImage, CV_BGR2GRAY ); // to grayscale
cvtColor(croppedImage, croppedImage, CV_GRAY2BGR ); // to RGB
croppedImage.copyTo(frame(Rect(pt1, croppedImage.size())));
Других решений пока нет …