OpenCV, динамическое изменение отображения веб-камеры

Извините, если название дало вам неверную идею, я постарался сделать это как можно более кратким. Короче говоря, я пытаюсь обнаружить лицо с помощью алгоритма Виолы-Джонса (уже реализованного), сохранить его в отдельном изображении, преобразовать это изображение в градации серого, а затем вернуть изображение в градациях серого в исходное положение, в результате чего дисплей веб-камеры, на котором все лица (и любые ложные срабатывания, я полагаю) окрашены в серый цвет и окружены зеленым прямоугольником. Тем не менее, я получаю следующее сообщение об ошибке:

Необработанное исключение в 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 );

И извините, если я упускаю очевидный ответ.

1

Решение

Ваше обрезанное изображение в градациях серого 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())));
1

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

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

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