iOS中如何将图片文件转为OpenCV中的cv::Mat

本文介绍了一种从文件中加载JPG格式图像的方法,并提供了将其转换为灰度图像的功能。该过程涉及文件读取、内存分配、使用Core Graphics库创建图像,以及使用OpenCV进行色彩空间转换。

/**

 * 提取图像元数据

 *

 * @param filepath 图片路径,目前只支持jpg格式的图片

 * @param convertToGray 是否转化为灰度图片

 *

 * @return cv::Mat

 */

cv::Mat ae_imageMatFromFile(constchar *filepath, bool convertToGray){ 

    FILE * pFile;

    long lSize;

    char * buffer;

    size_t result;

    

    pFile = fopen (filepath,"rb");

    if (pFile == NULL

        return cv::Mat();

    

    fseek (pFile , 0 , SEEK_END);

    lSize = ftell (pFile);

    rewind (pFile);

    

   // allocate memory to contain the whole file

    buffer = (char*) malloc (sizeof(char)*lSize);

    if (buffer == NULL) {

        fclose (pFile);

        return cv::Mat();

    }

    

    result = fread (buffer,1,lSize,pFile);

    if (result != lSize) {

        free (buffer); 

        fclose (pFile);

        return cv::Mat();

    }

    

    fclose(pFile);

    

    CFDataRef dataRef = CFDataCreate(NULL, (constunsigned char *)buffer, lSize);

    

    free(buffer); 

    

    if (dataRef == NULL) {

        return cv::Mat();

    }

 

    CGDataProviderRef imgDataProvider = CGDataProviderCreateWithCFData(dataRef);     

    

    CGImageRef imageRef = CGImageCreateWithJPEGDataProvider(imgDataProvider,NULL, true, kCGRenderingIntentDefault);

    

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    

    int imageWidth  = CGImageGetWidth(imageRef);

    int imageHeight = CGImageGetHeight(imageRef);

    

   // Creating temporal IplImage for drawing

    IplImage *iplImage = cvCreateImage(cvSize(imageWidth, imageHeight), 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, imageWidth, imageHeight),

                       imageRef);

    

    CGContextRelease(contextRef);

    CGColorSpaceRelease(colorSpace);

    CGImageRelease(imageRef);

    CGDataProviderRelease(imgDataProvider);

    

   // Creating result IplImage

    IplImage *retIplImage;

    

    if (convertToGray) {

         retIplImage = cvCreateImage(cvGetSize(iplImage), IPL_DEPTH_8U,1);

        cvCvtColor(iplImage, retIplImage, CV_BGR2GRAY);

    }

    else{

        retIplImage = cvCreateImage(cvGetSize(iplImage), IPL_DEPTH_8U,3);

        cvCvtColor(iplImage, retIplImage, CV_RGBA2BGR);

    }

    

    

    cv::Mat imageMat = cv::Mat(retIplImage,true);

    

    cvReleaseImage(&iplImage);

    cvReleaseImage(&retIplImage);

    

    return imageMat;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值