我的opencv之旅:ios人脸识别
学习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里添加头:
- #import <opencv2/opencv.hpp>
- #import <opencv2/imgproc/types_c.h>
- #import <opencv2/imgcodecs/ios.h>
- #import <opencv2/objdetect/objdetect_c.h>
好了直接上代码:
- - (void) opencvFaceDetect {
- UIImage * img = [UIImage imageNamed:@"honger1"];
- if(img) {
- cvSetErrMode(CV_ErrModeParent);
- IplImage *image = [self CreateIplImageFromUIImage:img];
- IplImage *grayImg = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, ); //先转为灰度图
- cvCvtColor(image, grayImg, CV_BGR2GRAY);
- //将输入图像缩小4倍以加快处理速度
- int scale = ;
- IplImage *small_image = cvCreateImage(cvSize(image->width/scale,image->height/scale), IPL_DEPTH_8U, );
- cvResize(grayImg, small_image);
- //加载分类器
- NSString *path = [[NSBundle mainBundle] pathForResource:@"haarcascade_frontalface_alt2" ofType:@"xml"];
- CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad([path cStringUsingEncoding:NSASCIIStringEncoding], NULL, NULL, NULL);
- CvMemStorage* storage = cvCreateMemStorage();
- cvClearMemStorage(storage);
- //关键部分,使用cvHaarDetectObjects进行检测,得到一系列方框
- CvSeq* faces = cvHaarDetectObjects(small_image, cascade, storage ,1.1, , CV_HAAR_DO_CANNY_PRUNING, cvSize(,), cvSize(, ));
- NSLog(@"faces:%d",faces->total);
- cvReleaseImage(&small_image);
- cvReleaseImage(&image);
- cvReleaseImage(&grayImg);
- //创建画布将人脸部分标记出
- CGImageRef imageRef = img.CGImage;
- CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
- CGContextRef contextRef = CGBitmapContextCreate(NULL, img.size.width, img.size.height,, img.size.width * ,colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault);
- CGContextDrawImage(contextRef, CGRectMake(, , img.size.width, img.size.height), imageRef);
- CGContextSetLineWidth(contextRef, );
- CGContextSetRGBStrokeColor(contextRef, 1.0, 0.0, 0.0, );
- //对人脸进行标记,如果isDoge为Yes则在人脸上贴图
- for(int i = ; i < faces->total; i++) {// Calc the rect of faces
- CvRect cvrect = *(CvRect*)cvGetSeqElem(faces, i);
- CGRect face_rect = CGContextConvertRectToDeviceSpace(contextRef, CGRectMake(cvrect.x*scale, cvrect.y*scale , cvrect.width*scale, cvrect.height*scale));
- CGContextStrokeRect(contextRef, face_rect);
- }
- self.opencvImageView.image = [UIImage imageWithCGImage:CGBitmapContextCreateImage(contextRef)];
- CGContextRelease(contextRef);
- CGColorSpaceRelease(colorSpace);
- cvReleaseMemStorage(&storage);
- cvReleaseHaarClassifierCascade(&cascade);
- }
- }
- -(IplImage *)CreateIplImageFromUIImage:(UIImage *)image
- {
- CGImageRef imageRef = image.CGImage;
- CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
- IplImage *iplimage = cvCreateImage(cvSize(image.size.width, image.size.height), IPL_DEPTH_8U, );
- CGContextRef contextRef = CGBitmapContextCreate(iplimage->imageData, iplimage->width, iplimage->height,
- iplimage->depth, iplimage->widthStep,
- colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault);
- CGContextDrawImage(contextRef, CGRectMake(, , image.size.width, image.size.height), imageRef);
- CGContextRelease(contextRef);
- CGColorSpaceRelease(colorSpace);
- return iplimage;
- }
这是检测图片honger1的人脸有多少个,并且把它框出来的Demo
效果如下图:
完整代码放在我的github上:https://github.com/panxiaochun/AFaceRecognizerOpenCVDemoForIOS
我的opencv之旅:ios人脸识别的更多相关文章
- OpenCV学习 物体检测 人脸识别 填充颜色
介绍 OpenCV是开源计算机视觉和机器学习库.包含成千上万优化过的算法.项目地址:http://opencv.org/about.html.官方文档:http://docs.opencv.org/m ...
- python与opencv的结合之人脸识别值
首先还是要感谢http://www.jb51.net/article/67392.htm这位大神的无私奉献,开源的代码,让我省去了很多事,但是就光系统环境的配置就花去了我将近一个星期的时间,真是不容易 ...
- 使用OpenCV和Python进行人脸识别
介绍 人脸识别是什么?或识别是什么?当你看到一个苹果时,你的大脑会立刻告诉你这是一个苹果.在这个过程中,你的大脑告诉你这是一个苹果水果,用简单的语言来说就是识别.那么什么是人脸识别呢?我肯定你猜对了. ...
- 利用face_recognition,dlib与OpenCV调用摄像头进行人脸识别
用已经搭建好 face_recognition,dlib 环境来进行人脸识别 未搭建好环境请参考:https://www.cnblogs.com/guihua-pingting/p/12201077. ...
- opencv+python3.4的人脸识别----2017-7-19
opencv3.1 + python3.4 第一回合(抄代码,可实现):人脸识别涉及一个级联表,目前能力还无法理解. 流程:1.读取图像---2.转换为灰度图---3.创建级联表---4.对灰度图 ...
- ios OpenCv的配置和人脸识别技术
作为一个好奇心非常重的人,面对未知的世界都想去一探到底. 于是做了个人脸识别的demo. 眼下国内的关于opencv技术文章非常少.都是互相抄袭.关键是抄个一小部分还不全.时间又是非常久之前的了,和如 ...
- opencv SVM多分类 人脸识别
上一篇介绍了OPENCV中SVM的简单使用,以及自带的一个二分类问题. 例子中的标签是程序手动写的,输入也是手动加的二维坐标点. 对于复杂问题就必须使用数据集中的图片进行训练,标签使用TXT文件或程序 ...
- iOS人脸识别(CoreImage)
1.从初始UIImage获取一个CIImage对象. 2.创建一个用于分析对象的CIContext. 3.通过type和options参数创建一个CIDetector实例. type参数指定了要识别的 ...
- java+opencv+intellij idea实现人脸识别
首先当然是需要安装opencv了,我用的是opencv2.4.13.下载完之后就可以直接安装了,安装过程也很简单,直接下一步下一步就好,我就不上图了. 接下来在opencv下找到jar包,比如我直接安 ...
随机推荐
- mbps
Mbps=Mbit/s即兆比特每秒.Million bits per second的缩写 传输速率是指设备的的数据交换能力,也叫“带宽”,单位是Mbps(兆位/秒),目前主流的集线器带宽主要有10Mb ...
- 无法打开Android SDK Manager的解决办法
不知道从什么时候开始,打开Android的SDK Manager.exe时,命令行窗口一闪就自动关掉了. 想更新一些Android的东西都更新不了. 查了一下,解决办法是: 环境变量的系统变量Path ...
- ACdrea 1217---Cracking' RSA(高斯消元)
ACdrea 1217---高斯消元 Description The following problem is somehow related to the final stage of many ...
- java注释指导手册
译文出处: Toien Liu 原文出处:Dani Buiza 编者的话:注解是java的一个主要特性且每个java开发者都应该知道如何使用它. 我们已经在Java Code Geeks提供了丰富 ...
- ASP.NET Web API 数据提供系统相关类型及其关系
- 为什么不推崇复杂的ORM
上一篇文章写完,回复的人很多,有的说的很中肯,有的貌似只是看到文章的标题就进来写评论的!还有人问为什么我要屏蔽掉[反对]按钮,因为谁写文章都是为了分享,都在说出自己的心得体会.不过由于大家遇到的项目, ...
- uploadify API
apifunctionjavascriptflashsecurity服务器 属性: uploader : uploadify.swf 文件的相对路径,该swf文件是一个带有文字BROWSE的按钮,点击 ...
- windows下启动mongodb
http://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/#mongodb-as-a-windows-service C:\ ...
- 响应式SharePoint模版页
一张好的皮肤显然的会给你的项目加分不少.特别是大部分的项目,UI甚至可以决定成败. SharePoint在这方面一直都做得不好,曾经我有好多项目都是坐在美工旁边来一起修改样式.痛苦的经历. 不久以前, ...
- Python数据结构与算法--数据类型
从数据类型开始 Python支持面向对象的编程范式,这意味着Python把数据看成解决问题的关键. 在Python中,类似其他的面向对象的编程语言, 我们定义一个类,用来描述数据是什么 (状态) 和数 ...