可以实现将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() == ) {
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
, //bits per component
* cvMat.elemSize(), //bits per pixel
cvMat.step[], //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
, // Bits per component
cvMat.step[], // Bytes per row
colorSpace, // Colorspace
kCGImageAlphaNoneSkipLast |
kCGBitmapByteOrderDefault); // Bitmap info flags CGContextDrawImage(contextRef, CGRectMake(, , cols, rows), image.CGImage);
CGContextRelease(contextRef);
CGColorSpaceRelease(colorSpace); return cvMat;
}

openCV(二)---iOS中使用openCV的图片格式转换的更多相关文章

  1. ios中摄像头/相册获取图片压缩图片上传服务器方法总结

    本文章介绍了关于ios中摄像头/相册获取图片,压缩图片,上传服务器方法总结,有需要了解的同学可以参考一下下.     这几天在搞iphone上面一个应用的开发,里面有需要摄像头/相册编程和图片上传的问 ...

  2. 利用PBFunc在Powerbuilder中进行图片格式转换

    利用PBFunc的n_pbfunc_image对象可以方便的进行图片格式的转换与大小转换 支持相互转换的格式有以下几种: FORMAT_BMP //bmp格式FORMAT_GIF  //gif格式FO ...

  3. 【VC++技术杂谈007】使用GDI+进行图片格式转换

    本文主要介绍如何使用GDI+对图片进行格式转换,可以转换的图片格式为bmp.jpg.png. 1.加载GDI+库 GDI+是GDI图形库的一个增强版本,提供了一系列Visual C++ API.为了使 ...

  4. bmp,jpg,png,tif,wmf,emf与eps图片格式转换

    wmf/emf是两种Microsoft Windows的图形文件格式.它是一个矢量图格式,但是也允许包含位图.本质上,一个WMF文件保存一系列可以用来重建图片的Windows GDI命令.在某种程度上 ...

  5. python 将png图片格式转换生成gif动画

    先看知乎上面的一个连接 用Python写过哪些[脑洞大开]的小工具? https://www.zhihu.com/question/33646570/answer/157806339 这个哥们通过爬气 ...

  6. php 图片格式转换-亲测ok

    代码如下 /** * 图片格式转换 * @param string $image_path 文件路径或url * @param string $to_ext 待转格式,支持png,gif,jpeg,w ...

  7. IOS中无缓存的图片载入

    在IOS中,我们常用[UIImage imageNamed]方法获取图像,这种方法简便,容易理解.但是有个缺点,就是有缓存.这种方式 传人的图像的就是通过文件名方式文件名.如果,我们内存有限,我们就必 ...

  8. ios中摄像头/相册获取图片,压缩图片,上传服务器方法总结

    相册 iphone的相册包含摄像头胶卷+用户计算机同步的部分照片.用户可以通过UIImagePickerController类提供的交互对话框来从相册中选择图像.但是,注意:相册中的图片机器路径无法直 ...

  9. OpenCV - Android Studio 中集成Opencv环境(包含opencv_contrib部分)

    我在上一篇博客中说到了在Android中集成OpenCV,但是那个版本的OpenCV是没有SIFT和SURF算法的,因为这些算法是受专利保护的,所以并没有被包含在预编译库中,所以如果想要使用SIFT和 ...

  10. OpenCV - Android Studio 中集成Opencv环境(不包含opencv_contrib部分)

    OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,支持的运行环境也是非常的多,这篇文章主要讲的是Android环境集成OpenCV(IDE是Android Studio,我想Eclip ...

随机推荐

  1. hdu1020

    #include <stdio.h> int main(void){ int n,i,c; char txt[10001]; scanf("%d", &n); ...

  2. HDU2363 最短路+贪心

    Cycling Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  3. LINQ 查询集合总的重复项

                      select new FMDS_FarmPlotNewInfo                   {                        FarmPlo ...

  4. 4-jQuery - AJAX post()

    说明 POST 一般用于向后台发送数据,但也可用于从服务器获取数据.不过,POST 方法不会缓存数据,并且常用于连同请求一起发送数据. 格式 $.post(URL,data,callback); // ...

  5. Effective JavaScript :第四章

    1.理解:prototype.getPrototypeOf和_proto_之间的不同 ①C.prototype用于建立new C()创建的对象的原型. ②Object.getPrototypeOf(o ...

  6. 【C++】最大子列和

    此题来自<数据结构与算法>,书中一共介绍了四种方法,这里贴出两种. 1.分治递归,对本题来说,虽然有更好的算法,但是用此题理解分治算法感觉挺有用 #include <iostream ...

  7. grunt学习随笔

    1 grunt 安装  全局安装 npm install -g grunt-cli 2 配置好package.json 和 Gruntfile 文件,这两个文件必须位于项目根目录下. 2.1packa ...

  8. OPENSSL简介

    1. 什么是 SSL? SSL 是一个缩写,代表的是Secure Sockets Layer. 它是支持在Internet 上进行安全通信的标准,并且将数据密码术集成到了协议之中. 数据在离开您的计算 ...

  9. JS的一些常见验证代码

    1//檢查空串  2function isEmpty(str){  3 if((str == null)||(str.length == 0)) return (true);  4 else retu ...

  10. 使用紧凑的序列化器,数倍提升性能 —— ESFramework 4.0 快速上手(11)

    在分布式通信系统中,网络传递的是二进制流,而内存中是我们基于对象模型构建的各种各样的对象,当我们需要将一个对象通过网络传递给另一个节点时,首先需要将其序列化为字节流,然后通过网络发送给目标节点,目标节 ...