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;
}
原文地址:https://www.cnblogs.com/iOSDeng/p/5081588.html