openCV(二)---iOS中使用openCV的图片格式转换


可以实现将UIImage和IplImage类型实现相互转换

 
 

//由于OpenCV主要针对的是计算机视觉方面的处理,因此在函数库中,最重要的结构体是IplImage结构。

 
 
 
 

- (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;

 
 

}

 
 
 
 

- (UIImage *)UIImageFromIplImage:(IplImage *)image {

 
 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

 
 

    // Allocating the buffer for CGImage

 
 

    NSData *data =

 
 

    [NSData dataWithBytes:image->imageData length:image->imageSize];

 
 

    CGDataProviderRef provider =

 
 

    CGDataProviderCreateWithCFData((__bridge CFDataRef)data);

 
 

    // Creating CGImage from chunk of IplImage

 
 

    CGImageRef imageRef = CGImageCreate(

 
 

                                        image->width, image->height,

 
 

                                        image->depth, image->depth * image->nChannels, image->widthStep,

 
 

                                        colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefault,

 
 

                                        provider, NULL, false, kCGRenderingIntentDefault

 
 

                                        );

 
 

    // Getting UIImage from CGImage

 
 

    UIImage *ret = [UIImage imageWithCGImage:imageRef];

 
 

    CGImageRelease(imageRef);

 
 

    CGDataProviderRelease(provider);

 
 

    CGColorSpaceRelease(colorSpace);

 
 

    return ret;

 
 

}

 

 实现CvMat和UIImage的相互转换

// CvMat to UIImage
-(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);
    
    // Creating CGImage from cv::Mat
    CGImageRef imageRef = CGImageCreate(cvMat.cols,                                 //width
                                        cvMat.rows,                                 //height
                                        8,                                          //bits per component
                                        8 * cvMat.elemSize(),                       //bits per pixel
                                        cvMat.step[0],                            //bytesPerRow
                                        colorSpace,                                 //colorspace
                                        kCGImageAlphaNone|kCGBitmapByteOrderDefault,// bitmap info
                                        provider,                                   //CGDataProviderRef
                                        NULL,                                       //decode
                                        false,                                      //should interpolate
                                        kCGRenderingIntentDefault                   //intent
                                        );
    
    
    // Getting UIImage from CGImage
    UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    CGDataProviderRelease(provider);
    CGColorSpaceRelease(colorSpace);
    
    return finalImage;
}

// UIImage to cvMat
- (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); // 8 bits per component, 4 channels
    
    CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,                 // Pointer to  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), image.CGImage);
    CGContextRelease(contextRef);
    CGColorSpaceRelease(colorSpace);
    
    return cvMat;
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM