OpenCV install in xcode

后端 未结 6 1054
你的背包
你的背包 2020-12-30 18:21

I use bellow link for install opencv in my project but how we generate command in terminal I don`t know can anybody help me?? http://aptogo.co.uk/2011/09/opencv-framework-f

6条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-30 19:07

    If you want to use OpenCV on iOS you should go with the official framework provided by OpenCV (as of version 2.4.2).

    Get the lastest version here: OpenCV for iOS, drop it into your project and include this into your project prefixes:

    ExampleApp-Prefix.pch:

    #ifdef __cplusplus
        #import 
    #endif
    

    You'll also have to "convert" an UIImage to a cv::Mat to use it with OpenCV.

    UIImageCVMatConverter.h:

    //
    //  UIImageCVMatConverter.h
    //
    
    #import 
    
    @interface UIImageCVMatConverter : NSObject {
    
    }
    
    + (UIImage *)UIImageFromCVMat:(cv::Mat)cvMat;
    + (UIImage *)UIImageFromCVMat:(cv::Mat)cvMat withUIImage:(UIImage*)image;
    + (cv::Mat)cvMatFromUIImage:(UIImage *)image;
    + (cv::Mat)cvMatGrayFromUIImage:(UIImage *)image;
    + (UIImage *)scaleAndRotateImageFrontCamera:(UIImage *)image;
    + (UIImage *)scaleAndRotateImageBackCamera:(UIImage *)image;
    
    @end
    

    UIImageCVMatConverter.mm:

    //
    //  UIImageCVMatConverter.mm
    //
    
    #import "UIImageCVMatConverter.h"
    
    @implementation UIImageCVMatConverter
    
    + (UIImage *)UIImageFromCVMat:(cv::Mat)cvMat withUIImage:(UIImage*)image;
    {
      CGColorSpaceRef colorSpace = CGImageGetColorSpace( image.CGImage );
        CGFloat cols = image.size.width;
        CGFloat rows = image.size.height;
        CGFloat widthStep = image.size.width;
        CGContextRef contextRef = CGBitmapContextCreate( NULL, cols, rows, 8, widthStep*4, colorSpace, kCGImageAlphaNoneSkipLast | kCGBitmapByteOrderDefault );
        CGContextDrawImage( contextRef, CGRectMake(0, 0, cols, rows), image.CGImage );
        CGContextSetRGBStrokeColor( contextRef, 1, 0, 0, 1 );
        CGImageRef cgImage = CGBitmapContextCreateImage( contextRef );
        UIImage* result = [UIImage imageWithCGImage:cgImage];
        CGImageRelease( cgImage );
        CGContextRelease( contextRef );
        CGColorSpaceRelease( colorSpace );
        return result;
    }
    
    +(UIImage *)UIImageFromCVMat:(cv::Mat)cvMat
    {
        NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize()*cvMat.total()];
        CGColorSpaceRef colorSpace;
        if ( cvMat.elemSize() == 1 ) {
            colorSpace = CGColorSpaceCreateDeviceGray();
        }
        else {
            colorSpace = CGColorSpaceCreateDeviceRGB();
        }
        CGDataProviderRef provider = CGDataProviderCreateWithCFData( (__bridge CFDataRef)data );
        CGImageRef imageRef = CGImageCreate( cvMat.cols, cvMat.rows, 8, 8 * cvMat.elemSize(), cvMat.step[0], colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefault, provider, NULL, false, kCGRenderingIntentDefault );
        UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
        CGImageRelease( imageRef );
        CGDataProviderRelease( provider );
        CGColorSpaceRelease( colorSpace );
        return finalImage;
    }
    
    + (cv::Mat)cvMatFromUIImage:(UIImage *)image
    {
        CGColorSpaceRef colorSpace = CGImageGetColorSpace( image.CGImage );
        CGFloat cols = image.size.width;
        CGFloat rows = image.size.height;
        cv::Mat cvMat( rows, cols, CV_8UC4 );
        CGContextRef contextRef = CGBitmapContextCreate( cvMat.data, cols, rows, 8, cvMat.step[0], colorSpace, kCGImageAlphaNoneSkipLast | kCGBitmapByteOrderDefault );
        CGContextDrawImage( contextRef, CGRectMake(0, 0, cols, rows), image.CGImage );
        CGContextRelease( contextRef );
        CGColorSpaceRelease( colorSpace );
        return cvMat;
    }
    
    + (cv::Mat)cvMatGrayFromUIImage:(UIImage *)image
    {
      cv::Mat cvMat = [UIImageCVMatConverter cvMatFromUIImage:image];
      cv::Mat grayMat;
        if ( cvMat.channels() == 1 ) {
            grayMat = cvMat;
      }
        else {
            grayMat = cv :: Mat( cvMat.rows,cvMat.cols, CV_8UC1 );
            cv::cvtColor( cvMat, grayMat, CV_BGR2GRAY );
        }
      return grayMat;
    }
    
    + (UIImage *)scaleAndRotateImageBackCamera:(UIImage *)image
    {
      static int kMaxResolution = 640;
      CGImageRef imgRef = image.CGImage;
      CGFloat width = CGImageGetWidth( imgRef );
      CGFloat height = CGImageGetHeight( imgRef );
      CGAffineTransform transform = CGAffineTransformIdentity;
      CGRect bounds = CGRectMake( 0, 0, width, height );
      if ( width > kMaxResolution || height > kMaxResolution ) {
        CGFloat ratio = width/height;
        if ( ratio > 1 ) {
          bounds.size.width = kMaxResolution;
          bounds.size.height = bounds.size.width / ratio;
        }
            else {
          bounds.size.height = kMaxResolution;
          bounds.size.width = bounds.size.height * ratio;
        }
      }
      CGFloat scaleRatio = bounds.size.width / width;
      CGSize imageSize = CGSizeMake( CGImageGetWidth(imgRef), CGImageGetHeight(imgRef) );
      CGFloat boundHeight;
      UIImageOrientation orient = image.imageOrientation;
      switch( orient ) {
        case UIImageOrientationUp:
          transform = CGAffineTransformIdentity;
          break;
        case UIImageOrientationUpMirrored:
          transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0);
          transform = CGAffineTransformScale(transform, -1.0, 1.0);
          break;
        case UIImageOrientationDown:
          transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height);
          transform = CGAffineTransformRotate(transform, M_PI);
          break;
        case UIImageOrientationDownMirrored:
          transform = CGAffineTransformMakeTranslation(0.0, imageSize.height);
          transform = CGAffineTransformScale(transform, 1.0, -1.0);
          break;
        case UIImageOrientationLeftMirrored:
          boundHeight = bounds.size.height;
          bounds.size.height = bounds.size.width;
          bounds.size.width = boundHeight;
          transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width);
          transform = CGAffineTransformScale(transform, -1.0, 1.0);
          transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
          break;
        case UIImageOrientationLeft:
          boundHeight = bounds.size.height;
          bounds.size.height = bounds.size.width;
          bounds.size.width = boundHeight;
          transform = CGAffineTransformMakeTranslation(0.0, imageSize.width);
          transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
          break;
        case UIImageOrientationRightMirrored:
          boundHeight = bounds.size.height;
          bounds.size.height = bounds.size.width;
          bounds.size.width = boundHeight;
          transform = CGAffineTransformMakeScale(-1.0, 1.0);
          transform = CGAffineTransformRotate(transform, M_PI / 2.0);
          break;
        case UIImageOrientationRight:
          boundHeight = bounds.size.height;
          bounds.size.height = bounds.size.width;
          bounds.size.width = boundHeight;
          transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0);
          transform = CGAffineTransformRotate(transform, M_PI / 2.0);
          break;
        default:
          [NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"];
      }
      UIGraphicsBeginImageContext( bounds.size );
      CGContextRef context = UIGraphicsGetCurrentContext();
      if ( orient == UIImageOrientationRight || orient == UIImageOrientationLeft ) {
        CGContextScaleCTM( context, -scaleRatio, scaleRatio );
        CGContextTranslateCTM( context, -height, 0 );
      }
        else {
        CGContextScaleCTM( context, scaleRatio, -scaleRatio );
        CGContextTranslateCTM( context, 0, -height );
      }
      CGContextConcatCTM( context, transform );
      CGContextDrawImage( UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef );
      UIImage *returnImage = UIGraphicsGetImageFromCurrentImageContext();
      UIGraphicsEndImageContext();
      return returnImage;
    }
    
    + (UIImage *)scaleAndRotateImageFrontCamera:(UIImage *)image
    {
      static int kMaxResolution = 640;
      CGImageRef imgRef = image.CGImage;
      CGFloat width = CGImageGetWidth(imgRef);
      CGFloat height = CGImageGetHeight(imgRef);
      CGAffineTransform transform = CGAffineTransformIdentity;
      CGRect bounds = CGRectMake( 0, 0, width, height);
      if (width > kMaxResolution || height > kMaxResolution) {
        CGFloat ratio = width/height;
        if (ratio > 1) {
          bounds.size.width = kMaxResolution;
          bounds.size.height = bounds.size.width / ratio;
        } else {
          bounds.size.height = kMaxResolution;
          bounds.size.width = bounds.size.height * ratio;
        }
      }
    
      CGFloat scaleRatio = bounds.size.width / width;
      CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef));
      CGFloat boundHeight;
      UIImageOrientation orient = image.imageOrientation;
      switch(orient) {
        case UIImageOrientationUp:
          transform = CGAffineTransformIdentity;
          break;
        case UIImageOrientationUpMirrored:
          transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0);
          transform = CGAffineTransformScale(transform, -1.0, 1.0);
          break;
        case UIImageOrientationDown:
          transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height);
          transform = CGAffineTransformRotate(transform, M_PI);
          break;
        case UIImageOrientationDownMirrored:
          transform = CGAffineTransformMakeTranslation(0.0, imageSize.height);
          transform = CGAffineTransformScale(transform, 1.0, -1.0);
          break;
        case UIImageOrientationLeftMirrored:
          boundHeight = bounds.size.height;
          bounds.size.height = bounds.size.width;
          bounds.size.width = boundHeight;
          transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width);
          transform = CGAffineTransformScale(transform, -1.0, 1.0);
          transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
          break;
        case UIImageOrientationLeft:
          boundHeight = bounds.size.height;
          bounds.size.height = bounds.size.width;
          bounds.size.width = boundHeight;
          transform = CGAffineTransformMakeTranslation(0.0, imageSize.width);
          transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
          break;
            case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
          boundHeight = bounds.size.height;
          bounds.size.height = bounds.size.width;
          bounds.size.width = boundHeight;
          transform = CGAffineTransformMakeScale(-1.0, 1.0);
          transform = CGAffineTransformRotate(transform, M_PI / 2.0);
          break;
            default:
          [NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"];
      }
      UIGraphicsBeginImageContext( bounds.size );
      CGContextRef context = UIGraphicsGetCurrentContext();
      if ( orient == UIImageOrientationRight || orient == UIImageOrientationLeft ) {
        CGContextScaleCTM(context, -scaleRatio, scaleRatio);
        CGContextTranslateCTM(context, -height, 0);
      }
        else {
        CGContextScaleCTM(context, scaleRatio, -scaleRatio);
        CGContextTranslateCTM(context, 0, -height);
      }
      CGContextConcatCTM( context, transform );
      CGContextDrawImage( UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef );
      UIImage *returnImage = UIGraphicsGetImageFromCurrentImageContext();
      UIGraphicsEndImageContext();
      return returnImage;
    }
    
    @end
    

    Rename your view controller implementation file to *.mm

    MyViewController.m -> MyViewController.mm
    

    And import the UIImageCVMatConverter in your view controller:

    #import "UIImageCVMatConverter.h"
    

    Now you can mix Objective-C and C++ OpenCV code inside your view controller:

    cv::Mat img = [UIImageCVMatConverter cvMatFromUIImage:[UIImage imageNamed:@"my_image.png"]];
    ...
    

    Have fun!

提交回复
热议问题