OpenCV iOS - Image Processing

Goal

In this tutorial we will learn how to do basic image processing using OpenCV in iOS.

Introduction

In OpenCV all the image processing operations are usually carried out on the Mat structure. In iOS however, to render an image on screen it have to be an instance of the UIImage class. To convert an OpenCV Mat to an UIImage we use the Core Graphics framework available in iOS. Below is the code needed to covert back and forth between Mat’s and UIImage’s.

- (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;
 }

After the processing we need to convert it back to UIImage. The code below can handle both gray-scale and color image conversions (determined by the number of channels in the if statement).

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

Output

header

Check out an instance of running code with more Image Effects on YouTube .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《光伏组件自动清洗系统设计》 课程设计 目 录 第1章 项目研究背景分析 4 1.1 光伏系统概述 4 1.2光伏发电特点 5 1.3 光伏发电前景分析 6 1.4光伏组件清洗装置现状 7 第2章 光伏组件清洗装置 9 2.1 我国的光伏装机量 9 2.2光伏阵列不清洗的危害 9 2.3 光伏组件清洗装置现状分析 9 3.1人工清洗 9 3.2半自动清洗方式 9 3.3自动清洗方式 9 第三章 光伏自动清洗方式设计 10 3.1光伏清洗机构 10 3.2光伏清洁度传感器 10 3.3控制系统结 11 第4章 项目的综合效益评价 12 4.1经济效益分析 12 4.2技术效益分析 12 4.3社会效益分析 13 4.4环境效益分析 13 第1章 项目研究背景分析 1.1 光伏系统概述 2010年,我国新增光伏发电装机约500MW,累计达800MW。但与我国飞速发展的光伏制 造业相比,在光伏应用领域的前进步伐明显滞后于我国光伏制造业。2000年,我国太阳 能电池产量仅为3MW,到2007年年底达到1088MW,超过欧洲(1062.8MW)和日本(920MW ),跃居世界第一位。2010年,我国太阳能电池产量达到10GW,约占全球光伏电池产量 的一半。目前,我国光伏发电的应用市场处于起步阶段。从当前光伏发电应用领域来看 ,现主要广泛应用于工业、农业、科技、国防及人们生活方面,预计到21世纪中叶,太 阳能光伏发电将成为重要的发电方式,在可再生能源结构中占有一定比例。 当前太阳能光伏发电主要应用领域如下: 1.通信领域的应用。主要包括无人值守微波中继站,光缆通信系统及维护站,移动通 信基站,广播、通信、无线寻呼电源系统,卫星通信和卫星电视接收系统,农村程控电 话、载波电话光伏系统,小型通信机,部队通信系统,士兵GPS供电等。 2.公路、铁路、航运等交通领域的应用。如铁路和公路信号系统,铁路信号灯,交通 警示灯、标志灯、信号灯,公路太阳能路灯,太阳能道钉灯、高空障碍灯,高速公路监 控系统,高速公路、铁路无线电话亭,无人值守道班供电,航标灯灯塔和航标灯电源等 。 3.石油、海洋、气象领域的应用。如石油管道阴极保护和水库闸门阴极保护太阳能电 源系统,石油钻井平台生活及应急电源,海洋检测设备,气象和水文观测设备,观测站 电源系统等。 4.农村和边远无电地区应用。在高原、海岛、牧区、边防哨所等农村和边远无电地区 应用太阳能光伏户用系统、小型风光互补发电系统等解决日常生活用电问题,如照明、 电视、收录机、DVD、卫星接收机等的用电,也解决了手机、手电筒等随身小电器充电的 问题,发电功率大多在及瓦到几百瓦。应用1~5kW的独立光伏发电系统或并网发电系统 作为村庄、学校、医院、饭馆、旅社、商店等的供电系统。应用太阳能光伏水泵,解决 了无电地区的深水井饮用、农田灌溉等用电问题。另外还有太阳能喷雾器、太阳能电围 栏、太阳能黑光灭虫灯等应用。 5.太阳能光伏照明方面的应用。太阳能光伏照明包括太阳能路灯、庭院灯、草坪灯, 太阳能景观照明,太阳能路标标牌、信号指示、广告灯箱照明等:还有家庭照明灯具及 手提灯、野营灯、登山灯、垂钓灯、割胶灯、节能灯、手电等。 1.2光伏发电特点 太阳能光伏发电过程简单,没有机械转动部件,不消耗燃料,不排放包括温室气体在 内的任何物质,无噪声、无污染;太阳能资源分布广泛且取之不尽、用之不竭。因此, 与风力发电和生物质能发电等新型发电技术相比,光伏发电是一种最具可持续发展理想 特征(最丰富的资源和最洁净的发电过程)的可再生能源发电技术,其主要优点有以下 几点。 1.太阳能资源取之不尽,用之不竭,照射到地球上的太阳能要比人类目前消耗的能量 大6000倍。而且太阳能在地球上分布广泛,只要有光照的地方就可以使用光伏发电系统 ,不受地域、海拔等因素的限制。 2.太阳能资源随处可得,可就近供电,不必长距离输送,避免了长距离输电线路所造 成的电能损失。 3.光伏发电的能量转换过程简单,是直接从光子到电子的转换,没有中间过程(如热 能转换为机械能、机械能辖换为电磁能等)和机械运动,不存在机械磨损。根据热力学 分析,光伏发电具有很高的理论发电效率,可达80%以上,技术开发潜力巨大。 4.光伏发电本身不使用燃料,不排放包括温室气体和其他废气在内的任何物质,不污 染空气,不产生噪声,对环境友好,不会遭受能源危机或燃料市场不稳定而造成的冲击 ,是真正绿色环保的新型可再生能源。 5.光伏发电过程不需要冷却水,可以安装在没有水的荒漠戈壁上。光伏发电还可以很 方便地与建筑物结合,构成光伏建筑一体化发电系统,不需要单独占地,可节省宝贵的 土地资源。 6.光伏发电无机械传动部件,操作、维护简单,运行稳定可靠。一套光伏发电系统只 要有太阳能电池组件就能发电,加之自动控

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值