如何在Objective-C中使用OpenCV /或任何移植的库类

时间:2011-09-30 11:17:57

标签: iphone ios opencv

首先,我为这个新手问题道歉。我是Objective C和OpenCV的新手

Objective-C中的常规方法声明就像那样

Function functionName = [[Function alloc] init];

但是当我使用OpenCV类时,它说(例如CvMat)接收器类型不是Objective C类。

或者我想用C ++语法编写代码?

3 个答案:

答案 0 :(得分:2)

您使用C ++语法编写代码。 Objective-C实际上是C ++的超集,这意味着任何C ++程序也是一个有效的Objective-C程序(在大多数情况下都是如此)。 Objective-C只是为C ++中已经存在的内容添加了许多功能。

当我为iOS开发openCV应用程序时,这里是主要的绊脚石:

  • 将OpenCV编译为静态库。这是在iOS中使用OpenCV的唯一方法,如果您以前从未做过类似的事情,那么这不是一件容易的事。有一些很棒的博客文章介绍了如何操作,例如this one.

  • Armv6和armv7 - 确保为两者(或通用二进制文件)编译静态库,因为iOS在两者上运行。

  • 编码时,只需像编写c ++一样编写代码。这是您可以参考的一大块示例代码。

    // NOTE you SHOULD cvReleaseImage() for the return value when end of the code.
    - (IplImage *)CreateIplImageFromUIImage:(UIImage *)image {
      // Getting CGImage from UIImage
      CGImageRef imageRef = image.CGImage;
    
      CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
      // Creating temporal IplImage for drawing
      IplImage *iplimage = cvCreateImage(
        cvSize(image.size.width,image.size.height), IPL_DEPTH_8U, 4
      );
      // Creating CGContext for temporal IplImage
      CGContextRef contextRef = CGBitmapContextCreate(
        iplimage->imageData, iplimage->width, iplimage->height,
        iplimage->depth, iplimage->widthStep,
        colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault
      );
      // Drawing CGImage to CGContext
      CGContextDrawImage(
        contextRef,
        CGRectMake(0, 0, image.size.width, image.size.height),
        imageRef
      );
      CGContextRelease(contextRef);
      CGColorSpaceRelease(colorSpace);
    
      // Creating result IplImage
      IplImage *ret = cvCreateImage(cvGetSize(iplimage), IPL_DEPTH_8U, 3);
      cvCvtColor(iplimage, ret, CV_RGBA2BGR);
      cvReleaseImage(&iplimage);
    
      return ret;
    }
    

答案 1 :(得分:0)

是。您应该使用特殊的工厂功能。

例如,CvMat

可以创建CvMat* cvCreateMat(int rows, int cols, int type);

如需更多信息,请使用documentation

答案 2 :(得分:0)

看看这个显示如何在iPhone上使用OpenCV的article。它提供了一个OpenCV框架,可以放入您自己的项目中,也支持视频捕获。