2013-05-07 4 views
1

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

Необработанное исключение в 0x771115de в proba.exe: Microsoft C++ исключение: резюме :: Exception в> ячейку памяти 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. Вот почему вы получаете ошибку.

EDIT Чтобы решить вашу проблему, вы можете попробовать преобразовать отредактированное изображение в оттенках серого в формат RGB (он будет по-прежнему выглядеть как изображение в градациях серого). Что-то вроде

cvtColor(croppedImage, croppedImage, CV_BGR2GRAY); // to grayscale 
cvtColor(croppedImage, croppedImage, CV_GRAY2BGR); // to RGB 
croppedImage.copyTo(frame(Rect(pt1, croppedImage.size()))); 
+0

Понятно, что вокруг нет никакого пути. Все это не важно, я просто хотел что-то проверить. В любом случае, спасибо за ваше время. – MrLinjak

+0

Я отредактировал свой ответ. Посмотрите, работает ли это для вас. – Alexey

+1

Работает как шарм. Спасибо, сэр. – MrLinjak