Я использую каскадный классификатор OpenCV для обнаружения лиц. Я последовал инструкциям по веб-камере и смог использовать detectMultiScale, чтобы найти и отследить свое лицо, пока он транслировал видео с веб-камеры моего ноутбука.
Но когда я фотографирую себя с веб-камеры своего ноутбука, я загружаю это изображение в OpenCV и применяю detectMultiScale к этому изображению, и по какой-то причине Cascade Classifier не может обнаружить лица на этом статическом изображении!
Это статическое изображение определенно было бы обнаружено, если бы оно было одним кадром из моего потока с веб-камеры, но когда я просто беру это одно отдельное изображение, ничего не обнаруживается.
Вот код, который я использую (только что выделил соответствующие строки):
Общий код:
String face_cascade_name = "/path/to/data/haarcascades/haarcascade_frontalface_alt.xml";
CascadeClassifier face_cascade;
Mat imagePreprocessing(Mat frame) {
Mat processed_frame;
cvtColor( frame, processed_frame, COLOR_BGR2GRAY );
equalizeHist( processed_frame, processed_frame );
return processed_frame;
}
Для потокового обнаружения лиц с веб-камеры:
int detectThroughWebCam() {
VideoCapture capture;
Mat frame;
if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading face cascade\n"); return -1; };
//-- 2. Read the video stream
capture.open( -1 );
if ( ! capture.isOpened() ) { printf("--(!)Error opening video capture\n"); return -1; }
while ( capture.read(frame) )
{
if(frame.empty()) {
printf(" --(!) No captured frame -- Break!");
break;
}
//-- 3. Apply the classifier to the frame
Mat processed_image = imagePreprocessing( frame);
vector<Rect> faces;
face_cascade.detectMultiScale( processed_frame, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE|CV_HAAR_FIND_BIGGEST_OBJECT, Size(30, 30) );
if (faces.size() > 0) cout << "SUCCESS" << endl;
int c = waitKey(10);
if( (char)c == 27 ) { break; } // escape
}
return 0;
}
Для моего обнаружения лица на статическом изображении:
void staticFaceDetection() {
Mat image = imread("path/to/jpg/image");
Mat processed_frame = imagePreprocessing(image);
std::vector<Rect> faces;
//-- Detect faces
face_cascade.detectMultiScale( processed_frame, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE|CV_HAAR_FIND_BIGGEST_OBJECT, Size(30, 30) );
if (faces.size() > 0) cout << "SUCCESS" << endl;
}
На мой взгляд, оба эти процесса идентичны (единственная разница в том, где я получаю исходное изображение), но версия видеопотока регулярно обнаруживает лица, в то время как статический метод, кажется, никогда не может найти лицо.
Я что-то упустил?