如何在 iOS 工程中使用 opencv for ios

一、&&&&&&前言
&&& OpenCV是开源的跨平台的计算机视觉库,实现了图像处理、计算机视觉和机器学习的很多通用算法。
对于移动设备没有快速输入的键盘,大的屏幕,其优势在于图像和声音,因此要发挥好移动设备的性能,必须很好的利用这一特点。
本文档主要说明如何在iOS系统中使用OpenCV。
二、&&&&&&开发准备
1.&&&&&&&&下载
2.&&&&&&&&打开XCode,新建一个工程,例如新建一个Single View Application
3.&&&&&&&&在项目中添加下载好的OpenCV库,其中一种添加方式,在新建好的项目中,右键Framework,选择Add Files to,在跳出的窗口中找到opencv&2.framework后&点击add。
4.&&&&&&&&最终效果图如下:
5.&&&&&&&&因为OpenCV中的MIN宏和UIKit的MIN宏有冲突。所以需要在.pch文件中,先定义OpenCV的头文件,否则会有编译错误。将工程的.pch文件内容修改成如下所示:
&&&&&&&& #ifdef __cplusplus
&&&&&&&& #import&&opencv2/opencv.hpp&
6.&&&&&&&&在使用OpenCV时,主要使用OpenCV的C++接口,为了混合使用C++和Objective-C,需将源文件扩展名为.m的改成.mm。
7.&&&&&&&&在iOS中图像的显示主要通过UIImage,在OpenCV中处理通过Mat类型,两者之间要进行转换,显示通过UIImage,处理通过Mat。转换写成一个公共类文件,添加到项目中,具体见附件。
8.&&&&&&&&在使用到OpenCV的地方跟原C++一样。
三、&&&&&&测试项目
对基本的图像处理算法进行测试给出原图,测试效果图,处理时间,代码。
1.&&&&&&&&建议对图像处理部分单独建一个类,将设计与处理分开。
2.&&&&&&&&打开.h头文件,直接引用C++的OpenCV库,添加要实现的方法,具体如下:
3.&&&&&&&&在.mm文件中具体实现,实现的部分代码如下:
4.&&&&&&&&Objective-C调用,在头文件中添加类似下面的方法,传入参数为待处理图像、处理方法的序号
-(UIImage&*)processImage:(UIImage&*)inputImage number:(int)useN
具体实现如下:
-(UIImage&*)processImage:(UIImage&*)inputImage number:(int)useNumber
&&&&cv::Mat&inputMat = [UIImageCVMatConverter&cvMatFromUIImage:inputImage];
&&&&cv::Mat&resultM
&&&&//这边到时构建一个字典,将序号转成调用名
&&&&switch&(useNumber)
&&&&&&&&case&0:
&&&&&&&&&&& resultMat =[self&cannyConversion:inputMat];
&&&&&&&&&&&&break;
&&&&&&&&case&1:
&&&&&&&&&&& resultMat =[self&equalizeHistConversion:inputMat];
&&&&&&&&&&&&break;
&&&&&&&&case&2:
&&&&&&&&&&& resultMat =[self&harrisConversion:inputMat];
&&&&&&&&&&&&break;
&&&&&&&&case&3:
&&&&&&&&&&& resultMat =[self&siftConversion:inputMat];
&&&&&&&&&&&&break;
&&&&&&&&case&4:
&&&&&&&&&&& resultMat =[self&surfConversion:inputMat];
&&&&&&&&&&&&break;
&&&&&&&&&&&
&&&&&&&&default:
&&&&&&&&&&&&break;
&&& inputMat.release();
&&&&return&[UIImageCVMatConverter&UIImageFromCVMat:resultMat];
5.&&&&&&&&设计界面,调用上述处理函数
&&&&&&&&&&&&&&&&&&&&&i.&&&&&&&&&&&&添加toolbar和imageview设计界面如下:
&&&&&&&&ii.&&&&&&设置关联,如下图:
&&&&&&iii.&&&&&&调用的过程
1.&&&获得加载图片的UIImage,本例如下:
NSString&*fileName = [[NSBundle&mainBundle]&pathForResource:@"fruits"&ofType:@"jpg"];
&&&&&&& &&&imageView.image&= [UIImage&&&&&&&&&imageWithContentsOfFile:fileName];
&&&&&&&&&&&&&&&&&&&&imageView.contentMode&=&UIViewContentModeScaleAspectFit;
&&&&&&&&&&&&&&&&&&&& loadImage&=&imageView.image;
将加载的图片的UIImage给上述中的loadImage,loadImage进行转换到Mat
直接调用之前写好的ImageProcessing类
imageView.image&= [imageProcessing&processImage:loadImage&&number:numberOfprocess&];
四、 & 实验结果
测试时间ms
五、&&&参考
1.&&&&&&&&
2.&&&&&&&&
3.&&&&&&&&
阅读(...) 评论()如何在 iOS 工程中使用 OpenCV_百度知道
如何在 iOS 工程中使用 OpenCV
在Groups&Files窗口的工程文件根目录右键-Get Iopencv&#47: iPhone真机调试;iPhoneSimulator&#47,同样在build项中搜索Header search paths,要设置头文件搜索路径;OpenCV&#47。
进行了这些设置之后,一种是转换到OpenCV target单独构建;iPhoneSimulator&#47: SDK版本 作者提供的工程SDK版本可能和你开发环境的不同(我下载到的是基于4: “$(SRCROOT)/” 模拟器调试;lib&#47,添加相应的内容: -lstdc++ -lz “$(SRCROOT)/lib/iPhoneOS&#47,不过基本可以无视;lib&#47: iPhone真机调试;OpenCV&#47,需要设置成你使用的SDK版本,构建主应用时一同构建:
2: -lstdc++ -lz “$(SRCROOT)/一种是将OpenCV添加为主应用的依赖,且构建进程很慢;OpenCV&#47,一般会报几个error和lib&#47。由于OpenCV的代码基本不需要修改;lib&#47. 链接标记 Other linker flags 本地的OpenCV库要链接进Xcode工程中.a” 模拟器调试. Building OpenCV 有两种方式构建OpenCV;lib&#47,在build栏的Base SDK一项中;lib&#47.a”
3;” “$(SRCROOT)&#47. 头文件搜索路径 Header search paths 为方便的调用OpenCV头文件;include&#47,主应用基本就可以正常编译运行了,点击Build and Run进行编译;iPhoneSimulator&#47,改为你的SDK版本。 在Groups & Files窗口中的Targets栏中;OpenCV&#47,双击OpenCV。过程比较慢,在Get Info的build项中;OpenCV/OpenCV&#47.a” “$(SRCROOT)/OpenCV/lib/” “$(SRCROOT)/iPhoneOS/iPhoneOS/libcxcore,搜索 Other Linker F”
4,添加相应的链接标记;lib/include/lib/iPhoneOS&#47,所以建议对OpenCV进行单独构建.a” “$(SRCROOT)/lib/OpenCV/iPhoneSimulator/include/include/opencv&#47: “$(SRCROOT)/lib&#47在ios中如何利用 opencv 进行图像处理的方法.0的)
知道智能回答机器人
我是知道站内的人工智能,可高效智能地为您解答问题。很高兴为您服务。
其他类似问题
为您推荐:
opencv的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Pages: 1/16
主题 : iphone项目中使用opencv教程
级别: 精灵王
可可豆: 3927 CB
威望: 4087 点
在线时间: 3300(时)
发自: Web Page
iphone项目中使用opencv教程&&&
因为自己的项目中需要用到opencv,当时在google上找了许久。很少有关于在iphone中使用opencv的教程  只有关于在mac os下使用opencv的教程  而opencv.Frameworks 无法在phone项目中使用   自己摸索了许久 编译了两个能在iphone使用的静态库。 测试在3.0 到 4.1均能完美使用 一个是在Simulator下使用的 基于X86架构的  一个是在Device下使用的基于arm架构的  分享给大家下载地址 下载完 放到项目目录下打开项目的Targets  在Other Linker Flags上 写 -lstdc++ , -lz , ${SRCROOT}/opencv/lib/libcxcore.a,${SRCROOT}/opencv/lib/libcv.aopencv是我自己建的一个opencv的文件夹  里面有include 和 lib 两个文件夹    include放入头文件  lib放入静态库然后在Header Search Paths 上写${SRCROOT}/opencv/include然后只在你用模拟器运行项目时把  里面下载关于模拟器libcxcore.a和libcv.a 放入opencv的lib文件夹即可同样你用真机运行时也只要把 关于真机的libcxcore.a和libcv.a 放入opencv的lib文件夹即可demo 我重新补上了 demo在模拟器才能使用, 使用前先在把关于模拟器libcxcore.a和libcv.a 放入opencv的lib文件夹即可[ 此帖被123探花在 13:28重新编辑 ]
(354 K) 下载次数:1066
级别: 精灵王
可可豆: 3927 CB
威望: 4087 点
在线时间: 3300(时)
发自: Web Page
例子&& 顶顶[ 此帖被123探花在 23:55重新编辑 ]
级别: 精灵王
可可豆: 3927 CB
威望: 4087 点
在线时间: 3300(时)
发自: Web Page
都没人来顶顶&&
级别: 新手上路
可可豆: 420 CB
威望: 420 点
在线时间: 245(时)
发自: Web Page
这么好的帖子居然没人顶!我顶--!
级别: 侠客
可可豆: 541 CB
威望: 541 点
在线时间: 607(时)
发自: Web Page
好贴当然要顶。谢谢楼主。
级别: 侠客
可可豆: 900 CB
威望: 900 点
在线时间: 909(时)
发自: Web Page
晕啊&&这么好的帖子没有人意思到。。。。。。。。。。。。。。。。。还是大家都对opencv。。。。。。。。。。。。。。。。。。。
级别: 精灵王
可可豆: 3927 CB
威望: 4087 点
在线时间: 3300(时)
发自: Web Page
回 5楼(新余蛋蛋) 的帖子
确实 我发了这教程 貌似大家都不敏感一样&&opencv在iphone项目中能做出许多有趣的东西&&[ 此帖被123探花在 17:46重新编辑 ]
级别: 新手上路
可可豆: 30 CB
威望: 30 点
在线时间: 2(时)
发自: Web Page
非常感谢楼主的工作,我想请问一下,楼主的demo建立的是什么类型的工程,bulid选项中Architectures选项是否需要修改。我建立的iphone的viewbased工程,可是bulid选项中Architectures选项与楼主的demo不一样。。。
级别: 精灵王
可可豆: 3927 CB
威望: 4087 点
在线时间: 3300(时)
发自: Web Page
回 7楼(xianrenhama) 的帖子
demo 就用的viewbased工程   Targets  里面的bulid选项,不管你用iphone的什么模板都是一样的&&&& 你只要配置我上面说明的那两个地方就行的
级别: 新手上路
可可豆: 30 CB
威望: 30 点
在线时间: 2(时)
发自: Web Page
如果楼主有时间的话,能否用一个更简单的例子(比如实现一张图片的灰度化),写一个比较详细的教程,比如如何建工程等。不甚感激!
Pages: 1/16
关注本帖(如果有新回复会站内信通知您)
个人IDP证书一年费用? 正确答案:99美金
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版评论-2117&
trackbacks-0
  OpenCV中保存图片的函数在c++版本中变成了imwrite(),这应该是向matlab中图像处理的的一些函数风格靠近吧。保存图片这个功能还是很重要的,比如说在写科研论文的时候需要把一些中间图片给贴出来,这样就可以在程序中间利用该函数保存图片了。甚至还可以将这些保存的图片供后续的matlab处理。本文就简单介绍下OpenCV中imwrite()函数的用法。不过个人感觉这个函数功能还是不够强大,使用时有很多限制。
  开发环境:QtCreato2.5.1+OpenCV2.4.3
  实验基础
  本次实验主要是测试imwrite()函数的2个功能:
  1. 测试其是否能够保存Mat图像中截取的一部分图像,比如说用Rect矩阵截取大的图像中的一部分,由于此时两者只是用了自己的文件头,数据是共享的(没有采用copyTo()函数或者clone()函数复制),所以这种测试想法很正常。
  2. 测试imwrite()函数的第3个参数的使用。
  在针对第1个测试时,是给定一张原图,截取一部分,然后保存。针对第2个功能是采用OpenCV官网文件中的一个例子,创建一个alpha表,然后保存为png格式的图片,压缩参数自设定。
  首先来看看imwrite()函数的具体用法。
  bool&imwrite(const string&&filename, InputArray&img, const vector&int&&&params=vector&int&()&)
  该函数是把程序中的Mat类型的矩阵保存为图像到指定位置。
  参数filename为所需保存图像的文件目录和文件名。这里的文件名需要带有图像格式后缀的,目前OpenCV该函数只支持JPEG,PNG,PPM,PGM,PBM,TIFF等。并不是所有Mat类型都支持。
  img参数为图像数据来源,其类型为Mat。注意也不是所有格式的Mat型数据都能被使用保存为图片,目前OpenCV主要只支持单通道和3通道的图像,并且此时要求其深度为8bit和16bit无符号(即CV_16U)。所以其他一些数据类型是不支持的,比如说float型等。如果Mat类型数据的深度和通道数不满足上面的要求,则需要使用函数和函数来进行转换。函数负责转换数据类型不同的Mat,即可以将类似float型的Mat转换到imwrite()函数能够接受的类型。而函数是负责转换不同通道的Mat,因为该函数的第4个参数就可以设置目的Mat数据的通道数(只是我们一般没有用到它,一般情况下这个函数是用来进行色彩空间转换的)。另外也可以不用imwrite()函数来存图片数据,可以直接用通用的XML IO接口函数将数据存在XML或者YXML中。
  参数params是用来设置对应图片格式的参数的,因为一般情况下这些图片格式都是经过了压缩的,这里就是设置这些压缩参数来控制图片的质量。该参数是一个vector&int&类型,里面分别存入paramId_1,&paramValue_1,&paramId_2,&paramValue_2,&...&也就是说存入一对属性值。如果不设置该参数的话,则程序会自动根据所保存的图像格式采用一个默认的参数。
  本实验中还用到了下面这个函数。
  template&...& _Tp&saturate_cast(_Tp2&v)
  将参数v转换成模板中的类型,比如说:
  uchar a = saturate_cast&uchar&(-100);&
  OpenCV知识点总结:
  Rect的构造函数中不能重载3个参数,比如左上角点的坐标,宽和高这时候应该改成4个,左上角点的坐标直接分开为2个写,对应着了点的x和y。
  实验结果
  程序执行后工程文件夹中显示如下:
  说明截取图像部分并保存是成功的。
  原图像和截取原图中间1/4大小的图像如下:
  后台输出如下:
  说明此时也保存成功了。
  生成的alpha表图像显示如下:
  实验代码及注释
  main.cpp:
#include &iostream&
#include &opencv2/core/core.hpp&
#include &opencv2/highgui/highgui.hpp&
using namespace
using namespace
string str = "./";
/*创建alpha表,整体偏红色,左上角到右下角呈现从完全透明到完全不透明变化趋势*/
void createAlphaMat(Mat &mat)
for (int i = 0; i & mat. ++i) {
for (int j = 0; j & mat. ++j) {
Vec4b& rgba = mat.at&Vec4b&(i, j);
rgba[0] = UCHAR_MAX;
//r分量一直最大,所以整体偏红
rgba[1] = saturate_cast&uchar&((float (mat.cols - j)) / ((float)mat.cols) * UCHAR_MAX);
rgba[2] = saturate_cast&uchar&((float (mat.rows - i)) / ((float)mat.rows) * UCHAR_MAX);
rgba[3] = saturate_cast&uchar&(0.5 * (rgba[1] + rgba[2]));
int main()
/*采用默认参数进行图片的保存*/
src = imread("test.jpg");
imwrite(str+"原图.jpg", src); //c版本中的保存图片为cvSaveImage()函数,c++版本中直接与matlab的相似,imwrite()函数。
imshow("src", src);
Rect rect(src.cols/4, src.rows/4, src.cols/2, src.rows/2);
image = src(rect);
imwrite(str+"截取原图中的一部分区域小图.jpg", image);
imshow("image", image);
/*采用自己设置的参数来保存图片*/
Mat mat(480, 640, CV_8UC4);
createAlphaMat(mat);
vector&int& compression_
compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
compression_params.push_back(9);
//png格式下,默认的参数为3.
imwrite("alpha.png", mat, compression_params);
catch (runtime_error& ex) {
fprintf(stderr, "Exception converting image to PNG format: %s\n", ex.what());
fprintf(stdout, "Saved PNG file with alpha data.\n");
waitKey(0);
  实验总结
  Imwrite()函数可以保存截取出的图像,但是这个函数使用时受限制太多,希望后面的版本对其进行加强。
  参考资料
阅读(...) 评论()
阿萨德发斯蒂芬ios(199)
第一步:首先去官网下载ios& framwork ,人家编辑好的包,直接用很方便,链接:
注意:opencv 3.0版本是beta版本,不稳定还缺少很多必要的库,请下载2.0以后,3.0以前版本,我下载的是2.4.13,16年5月19版本
第二步:下载的库直接可以拖到工程里,并且要添加以下framework:
添加以后这时候你build一下如果发现编译不过,出现了一个很蛋疼的错误缺少一个libjpg库,不要惊慌,请按照以下步骤;
& 下载 libjpeg-turbo-1.4.0.dmg
安装这个库,然后你会在路径/opt/libjpeg-turbo/lib找到它libjpeg.a
打开终端输入 lipo -info /opt/libjpeg-turbo/lib/libjpeg.a 看是不是armv7 x86-64都全,然后把这个.a拷贝到你的工程目录下
然后把库拖进你的工程里 ,然后编译,就没有link错误了。
第三步 :写个测试程序,你可能需要把Mat类型转UIImage&
openUtil.h
targetRecognition
Created by x32 on 16/5/29.
Copyright © 2016年 x32. All rights reserved.
#import &Foundation/Foundation.h&
@interface openUtil : NSObject
+(cv::Mat)cvMatFromUIImage:(UIImage *)
+(UIImage *)UIImageFromCVMat:(cv::Mat)cvM
openUtil.m
targetRecognition
Created by x32 on 16/5/29.
Copyright © 2016年 x32. All rights reserved.
#import &openUtil.h&
@implementation openUtil
+ (cv::Mat)cvMatFromUIImage:(UIImage *)image
CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
CGFloat cols = image.size.
CGFloat rows = image.size.
cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels (color channels + alpha)
CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,
// Pointer to
// Width of bitmap
// Height of bitmap
// 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 cvM
+(UIImage *)UIImageFromCVMat:(cv::Mat)cvMat
NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize()*cvMat.total()];
CGColorSpaceRef colorS
CGBitmapInfo bitmapI
if (cvMat.elemSize() == 1) {
colorSpace = CGColorSpaceCreateDeviceGray();
colorSpace = CGColorSpaceCreateDeviceRGB();
CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
// Creating CGImage from cv::Mat
CGImageRef imageRef = CGImageCreate(cvMat.cols,
cvMat.rows,
//bits per component
8 * cvMat.elemSize(),
//bits per pixel
cvMat.step[0],
//bytesPerRow
colorSpace,
//colorspace
kCGImageAlphaNone|kCGBitmapByteOrderDefault,// bitmap info
//CGDataProviderRef
//should interpolate
kCGRenderingIntentDefault
// Getting UIImage from CGImage
UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);
return finalI
写个viewcontroller& 里面显示一个UIImageView 引用一堆头文件 找张图片用以下程序测试一下
#import &opencv2/opencv.hpp&
#import &opencv2/imgproc/types_c.h&
#import &opencv2/core.hpp&
#import &opencv2/features2d.hpp&
#import &opencv2/calib3d.hpp&
#import &opencv2/objdetect.hpp&
#import &opencv2/nonfree/nonfree.hpp&
#import &opencv2/highgui.hpp&
#import &opencv2/imgproc.hpp&
#import &opencv2/objdetect/objdetect.hpp&
@property (weak, nonatomic)
UIImageView *imgV
-(void)corrosionPic
UIImage* image=[UIImage imageNamed:@&1.jpg&];
cv::Mat srcImage = [openUtil cvMatFromUIImage:image];
cv::Mat element = getStructuringElement(cv::MORPH_RECT, cv::Size(15, 15));
cv::Mat dstI
cv::erode(srcImage, dstImage, element);
UIImage *dstImg = [openUtil UIImageFromCVMat:dstImage];
self.imgView.image =dstI
self.view.backgroundColor = [UIColor blackColor];
//cv::Mat srcImage1 = cv::imread( &1.jpg&, 1 );
效果如果是这样的
原图:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 效果图:
&那证明你成功了。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:441405次
积分:5161
积分:5161
排名:第3447名
原创:80篇
转载:176篇
评论:38条
(4)(2)(4)(4)(6)(5)(1)(1)(4)(2)(5)(30)(4)(6)(1)(2)(6)(7)(8)(3)(3)(2)(16)(2)(3)(1)(3)(1)(6)(6)(10)(5)(13)(8)(1)(3)(6)(9)(3)(10)(2)(2)(16)(10)(10)}

我要回帖

更多关于 opencv for ios 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信