1

嗨,Stack Overflow 编码人员,

我最近一直在 iPhone 上玩 OpenCV,但遇到了墙,所以我向你寻求帮助。我熟悉 UIKit,Objective C,在台式计算机上使用 OpenCV 通过 Openframeworks C++ 框架进行斑点检测和面部跟踪。我目前正在尝试使用实时视频流进行面部跟踪。

我已经从本教程和使用单个图像的示例代码中进行了面部检测:http: //niw.at/articles/2009/03/14/using-opencv-on-iphone/en

我已经成功地从使用OpenGL的教程和示例代码(以及Apple的示例)的窗口中显示的视频缓冲区输出中获取数据,我现在实际上无法找到链接(一旦我能找到就会发布它)。

通过从 didOutputSampleBuffer 创建 IPLImage 并使用标准的 openCVEdgeDetect 并在屏幕上显示,我已经设法使用视频缓冲区输出获得与 iPhone 一起使用的视频流的 edgeDetection。

但我无法让人脸检测工作,我已经尝试过,但被卡住了。目前,我只是想从样本缓冲区中获取单个图像,然后将其传递给标准的 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 源代码,似乎该代码在分析之前缩小并模糊了图像。虽然我希望有更多知识的人给出更好的解释(我已经做了很多谷歌搜索)。当我注释掉这段代码时,我在函数的右括号上得到另一个类似的错误。

我会以正确的方式解决这个问题吗?我知道人们已经完成了这项工作,并且许多其他人会很乐意为此提供帮助。对此的任何建议或帮助将不胜感激。

谢谢。

4

0 回答 0