• 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;
    }
  • 相关阅读:
    【BZOJ 3098】 Hash Killer II
    【BZOJ 1189】[HNOI2007]紧急疏散evacuate
    【BZOJ 1088】 [SCOI2005]扫雷Mine
    【BZOJ 1821】 [JSOI2010]Group 部落划分 Group
    【BZOJ 1013】 [JSOI2008]球形空间产生器sphere
    【BZOJ 1084】[SCOI2005]最大子矩阵
    【BZOJ 1085】 [SCOI2005]骑士精神
    JNday6-pm
    JNday6-am
    JNday5-pm
  • 原文地址:https://www.cnblogs.com/iOSDeng/p/5081588.html
Copyright © 2020-2023  润新知