iOS 下使用 OpenCV 实现图像处理

i iOS 下使用 OpenCV 实现图像处理

目的

在这个教程中我们将学习如何在 iOS 上用 OpenCV 实现基本的图像处理。

介绍

在 OpenCV 中所有的图像处理操作一般是基于 Mat 结构来进行的。而 iOS 上要在屏幕上显示图片用的是 UIImage 控件实现。为了将 OpenCV Mat 转成 UIImage 我们需要用到 Core Graphics 框架。下面的代码用来在 Mat 和 UIImage 对象之间进行转换。

- (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 (color channels + alpha)

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

  return cvMat;
}
- (cv::Mat)cvMatGrayFromUIImage:(UIImage *)image
{
  CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
  CGFloat cols = image.size.width;
  CGFloat rows = image.size.height;

  cv::Mat cvMat(rows, cols, CV_8UC1); // 8 bits per component, 1 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);

  return cvMat;
 }

处理完毕之后我们需要将其转回 UIImage。下面的代码可处理灰度和彩色图像转换(根据if 语句中对 channles 的数量进行判断)

cv::Mat greyMat;
cv::cvtColor(inputMat, greyMat, CV_BGR2GRAY);

After the processing we need to convert it back 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;
 }

输出

更多的图像处理效果请看 YouTube .

时间: 2024-08-25 15:35:14

iOS 下使用 OpenCV 实现图像处理的相关文章

解决IOS下不支持fixed的问题

我们公司有一个页面底部用到了fixed样式,每当弹出键盘的时候,IOS下fixed就会走样(据我所知android没有该问题). 为此之前我经过产品的同意做了简单的处理(方法1). 方法一: focus的时候让fixed块position变为relative,这是最简单的处理方法. 下面是我的小demo <!DOCTYPE html> <html> <head>     <title></title>     <meta charset=&

ios下移动文件方法汇总

  这篇文章主要给大家汇总了一下ios下移动文件方法,从简单到复杂,十分的实用,有需要的小伙伴可以参考下. 这段objective c代码用于移动指定路径下的文件 代码如下: if ([fileManager copyItemAtPath:@"FilePath1" toPath:@"FilePath2" error:NULL]) { NSLog(@"Copied successfully"); } 方法二: 使用 NSFileManager: 让

phonegep在ios下的页面上下划动问题

问题描述 phonegep在ios下的页面上下划动问题 如何 禁止掉这种拉伸,不影响页面本身的滚动条 解决方案 本身页面显示就是基于一个webview,所以只要关闭webview的滚动就好了

linux-Linux下使用opencv打开摄像头后无法彻底关闭摄像头

问题描述 Linux下使用opencv打开摄像头后无法彻底关闭摄像头 Linux下使用opencv调用cvCreateCameraCapture打开摄像头后,使用cvReleaseCapture无法彻底关闭摄像头,摄像头上的灯还亮着.只有退出程序才能关闭.如果不退出的话,再次调用cvCreateCameraCapture后就无法获取图像,出现 VIDIOC_STREAMON: 错误的文件描述符.初次接触opencv,不是很了解. 解决方案 ubuntu下使用OpenCV打开摄像头opencv打开

重磅出击 实现IOS下内嵌HTML编辑器 Objective-C 与 JavaScript 通信攻关

通过接近N天的努力. 终于在今天.IOS下内嵌HTML编辑器的Demo 基本实现. 学习过程中,参考了很多网上的资料.很感谢这些分享资源的牛人.有你们.. 才能顺利拿下这个比较特别的需求. 我使用的HTML编辑器是金山开源的 KindEditor         利用UIWebView 加载 KindEditor (也就是我说的内嵌). 实现IOS下用户可以进行富文本编辑. 主要目的是保证服务端的内容值不丢失.亦可在移动端对内容进行一些简单的修改. 途中难点在于,如何与 KindEditor 的

ios-怎么在iOS下用native api实现HTTPS?

问题描述 怎么在iOS下用native api实现HTTPS? 我想用swift编写native api实现与服务器通信,以前有一些开源框架,比如RestKit.AFNetworking,但是他们是用Objective-C编写的,而且用开源框架以后可能会有些问题,我的项目这方面要求比较高,所以我还是想用swift写native api实现HTTPS的通信.HTTP比较容易,用NSURL和NSURLSession就可以了.有人还写了一些库,比如https://github.com/daltonia

《Cocos2D-x权威指南》——2.3 iOS下的开发环境配置

2.3 iOS下的开发环境配置 iOS操作系统是由苹果公司开发的手持设备操作系统,最早发布于2007年1月9日的Macworld大会上,最初是为iPhone设计的,后来陆续套用到iPod Touch.iPad以及Apple TV等苹果移动操作设备上. iOS与苹果以Darwin为基础,因此同样属于类UNIX的商业操作系统.原本这个系统名为iPhone OS,直到2010年6月7日WWDC大会上被改名为iOS.截至2011年11月,iOS已经占据了全球智能手机系统市场份额的30%. Xcode是苹

iOS 下实现解压缩

就在今天,终于把两种主流的压缩格式给搞定了..  途中真的碰到不少坎坷,百度谷歌了无数篇,不过还是要谢谢网上的牛人啊.. 在此,做一些记录,以及贡献一些资源. 给那些需要在IOS下 需要进行解压相关需求的孩纸一些帮助. 在开始之前,先列举一下对我有帮助的链接.谢谢这些博主了! 1:rar解压缩的源代码出处: https://github.com/ararog/Unrar4iOS 2:这个帮我解决了rar解压缩无法生成目录功能缺失以及乱码问题: http://stackoverflow.com/q

在ios下定时任务的小例子

在ios下定时任务的小例子 为了模拟翻页场景(为了测试内存是否泄露),需要用定时任务刷新界面.写了个小例子. 一上来是空白页,3秒钟后显示第1页,以后间隔3秒,页号增加,直到第5页. 首先,在controlller头文件中增加: NSTimer *timer; 定时器变量. 在实现代码中创建一个页号变量: #import "list_demoViewController.h"  - int pageNo=1; 在viewDidLoad方法中初始化定时器: - (void)viewDid