Skip to content

Instantly share code, notes, and snippets.

@geta6
Created October 15, 2012 07:31
Show Gist options
  • Save geta6/3891208 to your computer and use it in GitHub Desktop.
Save geta6/3891208 to your computer and use it in GitHub Desktop.
- (void)captureOutput:(AVCaptureOutput *)capture didOutputSampleBuffer:(CMSampleBufferRef)sample fromConnection:(AVCaptureConnection *)connection
{
CVImageBufferRef buffer = CMSampleBufferGetImageBuffer(sample);
CVPixelBufferLockBaseAddress(buffer, 0);
size_t width = CVPixelBufferGetWidth(buffer);
size_t height = CVPixelBufferGetHeight(buffer);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(buffer);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef cgContext = CGBitmapContextCreate(CVPixelBufferGetBaseAddress(buffer), width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease(colorSpace);
CGImageRef cgImage = CGBitmapContextCreateImage(cgContext);
UIImage* stream = [UIImage imageWithCGImage:cgImage scale:1.0f orientation:UIImageOrientationRight];
CGImageRelease(cgImage);
CGContextRelease(cgContext);
CVPixelBufferUnlockBaseAddress(buffer, 0);
IplImage *source = [self ui2iplConversion:stream];
IplImage *scaled = cvCreateImage(cvGetSize(source), IPL_DEPTH_8U, 1);
const char *cascade_name = "haarcascade_frontalface_alt2.xml";
cascade_name = [[[NSBundle mainBundle] pathForResource:@"haarcascade_frontalface_alt2" ofType:@"xml"] UTF8String];
CvHaarClassifierCascade *cascade = (CvHaarClassifierCascade *) cvLoad(cascade_name, nil, nil, nil);
CvMemStorage* storage = cvCreateMemStorage (0);
cvClearMemStorage(storage);
cvCvtColor(source, scaled, CV_BGR2GRAY);
cvEqualizeHist(scaled, scaled);
CvSeq *faces = cvHaarDetectObjects(scaled, cascade, storage, 1.11, 4, 0, cvSize (40, 40));
for (int i = 0; i < (faces ? faces->total : 0); i++) {
CvRect *r = (CvRect *) cvGetSeqElem (faces, i);
CvPoint center;
center.x = cvRound (r->x + r->width * 0.5);
center.y = cvRound (r->y + r->height * 0.5);
int radius = cvRound ((r->width + r->height) * 0.25);
cvCircle (source, center, radius, colors[i % 8], 3, 8, 0);
}
deviceview.image = [self ipl2uiConversion:source];
cvReleaseImage(&source);
cvReleaseImage(&scaled);
cvReleaseMemStorage(&storage);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment