我如何在objC中实现SURF?

mad*_*esh 2 opencv objective-c surf ios

我需要在objc iOS中实现SURF算法.我搜索了openCV,并尝试实现以下示例

jonmarimbaishai jaffe

这些例子不起作用,我需要让它们中的任何一个工作,所以至少我可以放心,是的,SURF也可以在iOS上运行.我试图从头开始构建,但我完全融入了短路.

我试图在jonmarimba的例子中使用openCV 2.4.2.

并尝试使用X5 4.3的iOS5.1.1

dom*_*dom 6

首先:使用OpenCVs C++ - 接口.Objective-C是一个严格的C超集,所以你可以使用它.

要掌握该主题,请查看OpenCVs官方文档和有关功能描述的示例代码.

下一步是获取iOS的当前OpenCV版本的副本.从版本2.4.2开始,OpenCV具有官方iOS支持,您只需要opencv2.framework.

要将UIImage转换为cv :: Mat,请使用以下函数:

?static UIImage* MatToUIImage(const cv::Mat& m) {
    CV_Assert(m.depth() == CV_8U);
    NSData *data = [NSData dataWithBytes:m.data length:m.elemSize()*m.total()];
    CGColorSpaceRef colorSpace = m.channels() == 1 ?
        CGColorSpaceCreateDeviceGray() : CGColorSpaceCreateDeviceRGB();
    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
    // Creating CGImage from cv::Mat
    CGImageRef imageRef = CGImageCreate(m.cols, m.cols, m.elemSize1()*8, m.elemSize()*8,
        m.step[0], colorSpace, kCGImageAlphaNoneSkipLast|kCGBitmapByteOrderDefault,
        provider, NULL, false, kCGRenderingIntentDefault);
    UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef); CGDataProviderRelease(provider);
    CGColorSpaceRelease(colorSpace); return finalImage;
}
Run Code Online (Sandbox Code Playgroud)

......反之亦然:

static void UIImageToMat(const UIImage* image, cv::Mat& m) {
    CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
    CGFloat cols = image.size.width, rows = image.size.height;
    m.create(rows, cols, CV_8UC4); // 8 bits per component, 4 channels
    CGContextRef contextRef = CGBitmapContextCreate(m.data, m.cols, m.rows, 8,
        m.step[0], colorSpace, kCGImageAlphaNoneSkipLast | kCGBitmapByteOrderDefault);
    CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage);
    CGContextRelease(contextRef); CGColorSpaceRelease(colorSpace);
}
Run Code Online (Sandbox Code Playgroud)

您需要做的其余工作是简单的OpenCV Stuff.所以抓你一杯咖啡开始工作吧.

如果你需要一些"灵感",请看看这个repo gsoc2012 - /ios/trunk它专门用于OpenCV + iOS.