how to convert from cvMat to UIImage in objective-c?

后端 未结 8 1396
渐次进展
渐次进展 2020-12-08 07:12

I\'m using the OpenCV framework with XCode and want to convert from cvMat or IplImage to UIImage, how to do that? Thanks.

8条回答
  •  被撕碎了的回忆
    2020-12-08 07:48

    As a category:

    #import 
    #import 
    using namespace cv;
    
    @interface UIImage (OCV)
    
    -(id)initWithOImage:(cv::Mat)oImage;
    -(cv::Mat)oImage;
    
    @end
    

    and

    #import "UIImage+OCV.h"
    
    @implementation UIImage (OCV)
    
    -(id)initWithOImage:(cv::Mat)oImage
    {
      NSData *data = [NSData dataWithBytes:oImage.data length:oImage.elemSize() * oImage.total()];
    
      CGColorSpaceRef colorSpace;
    
      if (oImage.elemSize() == 1) {
        colorSpace = CGColorSpaceCreateDeviceGray();
      } else {
        colorSpace = CGColorSpaceCreateDeviceRGB();
      }
    
      CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
    
      CGImageRef imageRef = CGImageCreate(oImage.cols,                                     // Width
                                          oImage.rows,                                     // Height
                                          8,                                              // Bits per component
                                          8 * oImage.elemSize(),                           // Bits per pixel
                                          oImage.step[0],                                  // Bytes per row
                                          colorSpace,                                     // Colorspace
                                          kCGImageAlphaNone | kCGBitmapByteOrderDefault,  // Bitmap info flags
                                          provider,                                       // CGDataProviderRef
                                          NULL,                                           // Decode
                                          false,                                          // Should interpolate
                                          kCGRenderingIntentDefault);                     // Intent
    
      self = [self initWithCGImage:imageRef];
    
      CGImageRelease(imageRef);
      CGDataProviderRelease(provider);
      CGColorSpaceRelease(colorSpace);
    
      return self;
    }
    
    -(cv::Mat)oImage
    {
      CGColorSpaceRef colorSpace = CGImageGetColorSpace(self.CGImage);
      CGFloat cols = self.size.width;
      CGFloat rows = self.size.height;
    
      cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels
    
      CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,                 // Pointer to backing data
                                                      cols,                       // Width of bitmap
                                                      rows,                       // Height of bitmap
                                                      8,                          // Bits per component
                                                      cvMat.step[0],              // Bytes per row
                                                      colorSpace,                 // Colorspace
                                                      kCGImageAlphaNoneSkipLast |
                                                      kCGBitmapByteOrderDefault); // Bitmap info flags
    
      CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), self.CGImage);
      CGContextRelease(contextRef);
    
      return cvMat;
    }
    
    @end
    

提交回复
热议问题