【问题标题】:How would I implement SURF in objC?我将如何在 objC 中实现 SURF?
【发布时间】:2012-07-06 08:32:35
【问题描述】:

我需要在 objc iOS 中实现 SURF 算法。 我在 openCV 上搜索过,也尝试实现以下示例

jonmarimbaishai jaffe

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

我正在尝试在 jonmarimba 的示例中使用 openCV 2.4.2。

并且还尝试将 iOS5.1.1 与 Xcode 4.3 一起使用

【问题讨论】:

  • OpenCV 是开源的,所以请尝试查看源代码...
  • @Astor 请帮帮我,我无能为力....我感觉自己好像残废了
  • 下载OpenCV源码,找到需要的函数,重写成objc
  • 请注意:SURF is patented, and a license fee is required for its use,因此在深入探讨之前,您可能需要牢记这一点。

标签: objective-c ios opencv surf


【解决方案1】:

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

要了解该主题,请查看 OpenCVs 官方 docs 和有关 Feature Description 的示例代码。

下一步是获取当前适用于 iOS 的 OpenCV 版本的副本。从版本 2.4.2 OpenCV has official iOS-support 开始,您只需要 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;
}

……反之亦然:

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);
}

剩下的工作就是简单的 OpenCV Stuff。所以给你喝杯咖啡,开始工作吧。

如果您需要一些“灵感”,请查看此 repo gsoc2012 - /ios/trunk 它专用于 OpenCV + iOS。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
相关资源
最近更新 更多