OpenCV是一个开源跨平台的的计算机视觉和机器学习库,可以用来做图片视频的处理、图形识别、机器学习等应用。本文将介绍OpenCV iOS开发中的Hello World起步。
OpenCV 1.x
OpenCV 最初基于C语言开发,API也都是基于C的,面临内存管理、指针等C语言固有的麻烦。
2.x和3.x:
尽管3相对与2有一些功能上的增加,但是3和2最大的区别还是在速度上。
最关键的不同在于OpenCV 3.x的API。几乎所有的OpenCV 3.X 方法都采用OpenCL加速了。所以所有的能够在GPU上运行的方法在性能上都会有10% - 230%的提升。你的代码所需要做的修改只是用UMat替换Mat。如果你想要在OpenCV 2.X 里面提升性能,你就要分别的触发 cv::ocl::* or cv::gpu::* 这些方法才行。
安装
OpenCV安装的方式有三种:
下载源代码编译
使用CocoaPods安装
使用官方的framework
第一种方式太麻烦,而且我也不熟悉,想要自己编译的可以去github下载编译。
第二种方式很简单,再podfile中加入pod 'OpenCV-iOS', '~> 3.1',然后运行pod install就行,但是问题Cocoapods上面OpenCV的版本只有3.x的,没有我想要的2.x的,而且我尝试安装了几次,都因为坑爹的网络以失败告终。
第三种方式就是去官网下载,我下载的最新的2.4.13,后续的例子都是使用此版本进行开发,不过使用的时候还是有不少的坑,后面会提到。
依赖:
libc++.tbd
AVFoundation.framework
CoreImage.framework
CoreGraphics.framework
QuartzCore.framework
Accelerate.framework
如果要使用摄像头做视频处理,还需要添加以下两个依赖库:
CoreVideo.framework
CoreMedia.framework
AssetsLibrary.framework
如果遇到以下错误:"_jpeg_free_large", referencedfrom:
是缺少了libjpeg.a依赖库,你可以在网上搜索这个a文件,下载后使用lipo -info libjpeg.a查看是否包含armv6 armv7 armv7s arm64支持。当然也可以直接下载libjpeg-turbo,安装后直接从此路径/opt/libjpeg-turbo/lib/libjpeg.a复制加入到项目中。
代码尝试:
#import
#import
@interface ViewController ()
{
UIImageView*cameraView;
CvVideoCamera*videoCamera;
}
@end
- (void)viewDidLoad {
[super viewDidLoad];
cameraView = [[UIImageView alloc] initWithFrame:self.view.frame];
[self.view addSubview:cameraView];
videoCamera = [[CvVideoCamera alloc] initWithParentView:cameraView];
videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionFront;
videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset640x480;
videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait;
videoCamera.defaultFPS = 30;
videoCamera.grayscaleMode = NO;
videoCamera.delegate = self;
}
-(void)viewDidAppear:(BOOL)animated {
[superviewDidAppear:animated];
[videoCamera start];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[videoCamera stop];
}
- (void)processImage:(cv::Mat&)image {
//在这儿我们将要添加图形处理的代码
cv::Matimage_copy;
//首先将图片由RGBA转成GRAY
cv::cvtColor(image, image_copy,cv::COLOR_BGR2GRAY);
//反转图片
cv::bitwise_not(image_copy, image_copy);
//将处理后的图片赋值给image,用来显示
cv::cvtColor(image_copy, image,cv::COLOR_GRAY2BGR);
}