Привет, ребята, кодеры переполнения стека,
Я недавно играл с OpenCV на iPhone, но столкнулся со стеной и поэтому обращаюсь к вам за помощью.Я знаком с UIKit, Objective C, использовал OpenCV для обнаружения блобов и отслеживания лиц с платформой Openframeworks C ++ на настольном компьютере.В настоящее время я пытаюсь настроить слежение за лицом с помощью видеопотока в реальном времени.
У меня есть функция распознавания лиц, работающая из этого учебного пособия, и пример кода с использованием одного изображения: http://niw.at/articles/2009/03/14/using-opencv-on-iphone/en
, и яуспешно получили данные из вывода видеобуфера, отображаемого в окне с использованием OpenGL, из учебного пособия и примера кода (и примера Apple), для которых я не могу найти ссылку прямо сейчас (опубликую, как только смогу ее найти).
Мне удалось получить edgeDetection видеопотока, работающего с iPhone, с использованием вывода видеобуфера путем создания IPLImage из didOutputSampleBuffer и использования стандартного openCVEdgeDetect и отображения на экране.
Но яне могу включить функцию распознавания лиц, я пытался и пытался, но я застрял.В настоящее время я просто пытаюсь получить одно изображение из буфера образцов, переданное в стандартные методы openCVFaceDetect, а затем отображать это изображение с квадратом (или любым маркером) вокруг лица.Как только я получу эту работу, я попытаюсь создать полный видеопоток.
Функция, которая дает сбой приложению, получает IPLImage, затем выполняет волшебство openCV и передает это изображение в функцию делегата дляи т. д.
- (void) opencvFaceDetect:(IplImage *)aTempOverlayImage {
cvSetErrMode(CV_ErrModeParent);
IplImage *aOverlayImage = aTempOverlayImage;//[self CreateIplImageFromUIImage:imageView.image];
// Scaling down
IplImage *small_image = cvCreateImage(cvSize(aOverlayImage->width/2,aOverlayImage->height/2), IPL_DEPTH_8U, 3);
cvPyrDown(aOverlayImage, small_image,CV_GAUSSIAN_5x5);
// Load XML
NSString *path = [[NSBundle mainBundle] pathForResource:@"haarcascade_frontalface_default" ofType:@"xml"];
CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad([path cStringUsingEncoding:NSASCIIStringEncoding], NULL, NULL, NULL);
CvMemStorage* storage = cvCreateMemStorage(0);
// Detect faces and draw rectangle on them
CvSeq* faces = cvHaarDetectObjects(small_image, cascade, storage, 1.2f, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(20, 20));
cvReleaseImage(&small_image);
[self.delegate parseOpenCVFaces:faces];
// Create canvas to show the results
CGImageRef imageRef = [self getCGImageFromCVImage:aOverlayImage];//imageViewFromOpenCV.image.CGImage;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef contextRef = CGBitmapContextCreate(NULL, 360, 480,
8, 480 * 4,
colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault);
CGContextDrawImage(contextRef, CGRectMake(0, 0, 360, 480), imageRef);
CGContextSetLineWidth(contextRef, 4);
CGContextSetRGBStrokeColor(contextRef, 0.0, 0.0, 1.0, 0.5);
int scale = 2;
// Draw results on the iamge
for(int i = 0; i < faces->total; i++) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// Calc the rect of faces
CvRect cvrect = *(CvRect*)cvGetSeqElem(faces, i);
CGRect face_rect = CGContextConvertRectToDeviceSpace(contextRef, CGRectMake(cvrect.x * scale, cvrect.y * scale, cvrect.width * scale, cvrect.height * scale));
CGContextStrokeRect(contextRef, face_rect);
[pool release];
}
imageViewFromOpenCV.image = [UIImage imageWithCGImage:CGBitmapContextCreateImage(contextRef)];
[self.delegate parseOpenCVFaceImage:imageViewFromOpenCV.image];
CGContextRelease(contextRef);
CGColorSpaceRelease(colorSpace);
cvReleaseMemStorage(&storage);
cvReleaseHaarClassifierCascade(&cascade);
}
Я получаю сообщение об ошибке: Поток 1: Program received signal:"SIGABRT"
в строке:
cvPyrDown(aOverlayImage, small_image,CV_GAUSSIAN_5x5);
Я посмотрел исходный код openCVкод, и кажется, что этот код сжимает и размывает изображение перед его анализом.Хотя мне бы хотелось получить лучшее объяснение от кого-то, у кого больше знаний (я провел многочисленные поиски в Google).Когда я закомментирую этот код, я получаю еще одну похожую ошибку в закрывающей скобке функции.
Правильно ли я поступаю?Я знаю, что у людей это работает, и что многие другие хотели бы помочь с этим.Любой совет или помощь с этим будет высоко ценится.
спасибо.