学习opencv有一年多了,这本来是我的毕业设计的一部分,但是因为不能突出专业重点,所以换了个课题。

opencv在vc、android、ios下都能用,其中vc和android下的教程和主题贴最多,ios最少了。

今天就来谈谈如何在ios下使用opencv,并做个人脸识别的Demo。

要使用opencv,可以自行编译库,也可以直接去官网下载编译好的库:http://opencv.org/downloads.html

把解压出来的文件夹直接拖进工程里就能用了,也可以在Build Phases 里面的link Binary With Librarises里面添加;

添加完把用到opencv的地方的.m文件改为.mm文件,因为opencv是c++写的,要让xcode知道这里既用到OC也用到C++。

然后在viewController里添加头:

  1. #import <opencv2/opencv.hpp>
  2. #import <opencv2/imgproc/types_c.h>
  3. #import <opencv2/imgcodecs/ios.h>
  4. #import <opencv2/objdetect/objdetect_c.h>

好了直接上代码:

  1. - (void) opencvFaceDetect {
  2. UIImage * img = [UIImage imageNamed:@"honger1"];
  3. if(img) {
  4. cvSetErrMode(CV_ErrModeParent);
  5. IplImage *image = [self CreateIplImageFromUIImage:img];
  6.  
  7. IplImage *grayImg = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, ); //先转为灰度图
  8. cvCvtColor(image, grayImg, CV_BGR2GRAY);
  9.  
  10. //将输入图像缩小4倍以加快处理速度
  11. int scale = ;
  12. IplImage *small_image = cvCreateImage(cvSize(image->width/scale,image->height/scale), IPL_DEPTH_8U, );
  13. cvResize(grayImg, small_image);
  14.  
  15. //加载分类器
  16. NSString *path = [[NSBundle mainBundle] pathForResource:@"haarcascade_frontalface_alt2" ofType:@"xml"];
  17. CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad([path cStringUsingEncoding:NSASCIIStringEncoding], NULL, NULL, NULL);
  18. CvMemStorage* storage = cvCreateMemStorage();
  19. cvClearMemStorage(storage);
  20.  
  21. //关键部分,使用cvHaarDetectObjects进行检测,得到一系列方框
  22. CvSeq* faces = cvHaarDetectObjects(small_image, cascade, storage ,1.1, , CV_HAAR_DO_CANNY_PRUNING, cvSize(,), cvSize(, ));
  23.  
  24. NSLog(@"faces:%d",faces->total);
  25. cvReleaseImage(&small_image);
  26. cvReleaseImage(&image);
  27. cvReleaseImage(&grayImg);
  28.  
  29. //创建画布将人脸部分标记出
  30. CGImageRef imageRef = img.CGImage;
  31. CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  32. CGContextRef contextRef = CGBitmapContextCreate(NULL, img.size.width, img.size.height,, img.size.width * ,colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault);
  33.  
  34. CGContextDrawImage(contextRef, CGRectMake(, , img.size.width, img.size.height), imageRef);
  35.  
  36. CGContextSetLineWidth(contextRef, );
  37. CGContextSetRGBStrokeColor(contextRef, 1.0, 0.0, 0.0, );
  38.  
  39. //对人脸进行标记,如果isDoge为Yes则在人脸上贴图
  40. for(int i = ; i < faces->total; i++) {// Calc the rect of faces
  41. CvRect cvrect = *(CvRect*)cvGetSeqElem(faces, i);
  42. CGRect face_rect = CGContextConvertRectToDeviceSpace(contextRef, CGRectMake(cvrect.x*scale, cvrect.y*scale , cvrect.width*scale, cvrect.height*scale));
  43.  
  44. CGContextStrokeRect(contextRef, face_rect);
  45. }
  46.  
  47. self.opencvImageView.image = [UIImage imageWithCGImage:CGBitmapContextCreateImage(contextRef)];
  48. CGContextRelease(contextRef);
  49. CGColorSpaceRelease(colorSpace);
  50.  
  51. cvReleaseMemStorage(&storage);
  52. cvReleaseHaarClassifierCascade(&cascade);
  53. }
  54. }
  55. -(IplImage *)CreateIplImageFromUIImage:(UIImage *)image
  56. {
  57. CGImageRef imageRef = image.CGImage;
  58.  
  59. CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  60. IplImage *iplimage = cvCreateImage(cvSize(image.size.width, image.size.height), IPL_DEPTH_8U, );
  61. CGContextRef contextRef = CGBitmapContextCreate(iplimage->imageData, iplimage->width, iplimage->height,
  62. iplimage->depth, iplimage->widthStep,
  63. colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault);
  64. CGContextDrawImage(contextRef, CGRectMake(, , image.size.width, image.size.height), imageRef);
  65. CGContextRelease(contextRef);
  66. CGColorSpaceRelease(colorSpace);
  67.  
  68. return iplimage;
  69. }

这是检测图片honger1的人脸有多少个,并且把它框出来的Demo

效果如下图:

完整代码放在我的github上:https://github.com/panxiaochun/AFaceRecognizerOpenCVDemoForIOS

我的opencv之旅:ios人脸识别的更多相关文章

  1. OpenCV学习 物体检测 人脸识别 填充颜色

    介绍 OpenCV是开源计算机视觉和机器学习库.包含成千上万优化过的算法.项目地址:http://opencv.org/about.html.官方文档:http://docs.opencv.org/m ...

  2. python与opencv的结合之人脸识别值

    首先还是要感谢http://www.jb51.net/article/67392.htm这位大神的无私奉献,开源的代码,让我省去了很多事,但是就光系统环境的配置就花去了我将近一个星期的时间,真是不容易 ...

  3. 使用OpenCV和Python进行人脸识别

    介绍 人脸识别是什么?或识别是什么?当你看到一个苹果时,你的大脑会立刻告诉你这是一个苹果.在这个过程中,你的大脑告诉你这是一个苹果水果,用简单的语言来说就是识别.那么什么是人脸识别呢?我肯定你猜对了. ...

  4. 利用face_recognition,dlib与OpenCV调用摄像头进行人脸识别

    用已经搭建好 face_recognition,dlib 环境来进行人脸识别 未搭建好环境请参考:https://www.cnblogs.com/guihua-pingting/p/12201077. ...

  5. opencv+python3.4的人脸识别----2017-7-19

    opencv3.1  +  python3.4 第一回合(抄代码,可实现):人脸识别涉及一个级联表,目前能力还无法理解. 流程:1.读取图像---2.转换为灰度图---3.创建级联表---4.对灰度图 ...

  6. ios OpenCv的配置和人脸识别技术

    作为一个好奇心非常重的人,面对未知的世界都想去一探到底. 于是做了个人脸识别的demo. 眼下国内的关于opencv技术文章非常少.都是互相抄袭.关键是抄个一小部分还不全.时间又是非常久之前的了,和如 ...

  7. opencv SVM多分类 人脸识别

    上一篇介绍了OPENCV中SVM的简单使用,以及自带的一个二分类问题. 例子中的标签是程序手动写的,输入也是手动加的二维坐标点. 对于复杂问题就必须使用数据集中的图片进行训练,标签使用TXT文件或程序 ...

  8. iOS人脸识别(CoreImage)

    1.从初始UIImage获取一个CIImage对象. 2.创建一个用于分析对象的CIContext. 3.通过type和options参数创建一个CIDetector实例. type参数指定了要识别的 ...

  9. java+opencv+intellij idea实现人脸识别

    首先当然是需要安装opencv了,我用的是opencv2.4.13.下载完之后就可以直接安装了,安装过程也很简单,直接下一步下一步就好,我就不上图了. 接下来在opencv下找到jar包,比如我直接安 ...

随机推荐

  1. mbps

    Mbps=Mbit/s即兆比特每秒.Million bits per second的缩写 传输速率是指设备的的数据交换能力,也叫“带宽”,单位是Mbps(兆位/秒),目前主流的集线器带宽主要有10Mb ...

  2. 无法打开Android SDK Manager的解决办法

    不知道从什么时候开始,打开Android的SDK Manager.exe时,命令行窗口一闪就自动关掉了. 想更新一些Android的东西都更新不了. 查了一下,解决办法是: 环境变量的系统变量Path ...

  3. ACdrea 1217---Cracking' RSA(高斯消元)

    ACdrea  1217---高斯消元 Description The following problem is somehow related to the final stage of many ...

  4. java注释指导手册

    译文出处: Toien Liu   原文出处:Dani Buiza 编者的话:注解是java的一个主要特性且每个java开发者都应该知道如何使用它. 我们已经在Java Code Geeks提供了丰富 ...

  5. ASP.NET Web API 数据提供系统相关类型及其关系

  6. 为什么不推崇复杂的ORM

    上一篇文章写完,回复的人很多,有的说的很中肯,有的貌似只是看到文章的标题就进来写评论的!还有人问为什么我要屏蔽掉[反对]按钮,因为谁写文章都是为了分享,都在说出自己的心得体会.不过由于大家遇到的项目, ...

  7. uploadify API

    apifunctionjavascriptflashsecurity服务器 属性: uploader : uploadify.swf 文件的相对路径,该swf文件是一个带有文字BROWSE的按钮,点击 ...

  8. windows下启动mongodb

    http://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/#mongodb-as-a-windows-service C:\ ...

  9. 响应式SharePoint模版页

    一张好的皮肤显然的会给你的项目加分不少.特别是大部分的项目,UI甚至可以决定成败. SharePoint在这方面一直都做得不好,曾经我有好多项目都是坐在美工旁边来一起修改样式.痛苦的经历. 不久以前, ...

  10. Python数据结构与算法--数据类型

    从数据类型开始 Python支持面向对象的编程范式,这意味着Python把数据看成解决问题的关键. 在Python中,类似其他的面向对象的编程语言, 我们定义一个类,用来描述数据是什么 (状态) 和数 ...