使用透视变换矫正扭曲的图(opencv)和矩形边缘检测(原生CoreImage框架下CIDetector)都是基于iOS版本
之前也找了很多都是vs啊,android啊,运用xcode的.mm混合编译时出现一大堆崩溃问题,无奈跨平台移植demo无果,只好搞原生iOS工程下的
运用场景:手机拍照目标文件往往有一个角度,或者目标文件之外的物体,需要经过处理后只要目标文件,且正视无角度倾斜
主要意思就是手机拍照
摄像头观察一个矩形的图片时往往只能得到一个扭曲的图片:
原图:(处理后的)
实际情况是摄像头经常从某个角度观察图片:(原始的未处理的)
方法一.使用opencv的透视变换把图片矫正为正视的角度
大概过程:
1、通过灰度、模糊和二值化得到:
2、然后对查找图片外包矩形轮廓,并查找角点得到:
3.通过梯形四个角点和外包矩形的四个顶点得到变换矩阵,进行投射变换,最后得到:
方法二.原生CoreImage框架下CIDetector进行矩形边缘检测
这是iOS的一个原生api
coreImage framework 组成
apple 已经帮我们把coreImage的处理分类好,来看看它的结构:
主要分为三部分:
1)定义部分:CoreImage 何CoreImageDefines。见名思义,代表了CoreImage 这个框架和它的定义。
2)操作部分:
滤镜(CIFliter):CIFilter 产生一个CIImage。典型的,接受一到多的图片作为输入,经过一些过滤操作,产生指定输出的图片。
检测(CIDetector):CIDetector 检测处理图片的特性,如使用来检测图片中人脸的眼睛、嘴巴、等等。(这里我们将用到这个CIDetector进行矩形边框的检测,不仅仅局限于人脸的检测)
特征(CIFeature):CIFeature 代表由 detector处理后产生的特征。
3)图像部分:
画布(CIContext):画布类可被用与处理Quartz 2D 或者OpenGL。可以用它来关联CoreImage类。如滤镜、颜色等渲染处理。
颜色(CIColor): 图片的关联与画布、图片像素颜色的处理。
向量(CIVector): 图片的坐标向量等几何方法处理。
图片(CIImage): 代表一个图像,可代表关联后输出的图像。
iOS的人脸识别从iOS 5(2011)就有了,不过一直没怎么被关注过。人脸识别API允许开发者不仅可以检测人脸,也可以检测到面部的一些特殊属性,比如说微笑或眨眼。
人脸识别过程一般分为以下3个步骤:
1.首先建立人脸的面纹数据库.可以通过照相机或摄像机采集人脸的面相图片,将这些面相图片生成面纹编码保存到数据库中.
2.获取当前人脸面相图片.即通过照相机或摄像机采集人脸的面相图片,将当前的面相文件生成面纹编码
3.用当前的面纹编码与数据库中的面纹编码进行对比
在iOS5之后提供人脸识别的API,通过提供的CIDetector类可以进行人脸特征识别,CIDetector是CoreImage框架中的一个特征识别滤镜,CIDetector主要用于人脸特征识别.通过它还可以获得眼睛和嘴的特征信息.但是CIDetector并不包括面纹编码提取,面纹编码处理还需要更为复杂的算法处理.也就是说使用CIDetector类可以找到一张图片中的人脸,但这张脸是谁,CIDetector无法判断,这需要有一个面纹数据库,把当前人脸提取面纹编码然后与数据库进行对比.(openCV FACE.COM)
CIContext *context = [CIContext contextWithOptions:nil];
UIImage *imageInput = [_inputImageView image];
CIImage *image = [CIImage imageWithCGImage:imageInput.CGImage];
//设置识别参数
NSDictionary *param = [NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh
forKey:CIDetectorAccuracy];
//声明一个CIDetector,并设定识别类型
CIDetector* faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace
context:context options:param];
//取得识别结果
NSArray *detectResult = [faceDetector featuresInImage:image];
UIView *resultView = [[UIView alloc] initWithFrame:_inputImageView.frame];
[self.view addSubview:resultView];
for(CIFaceFeature* faceFeature in detectResult) {
//脸部
UIView* faceView = [[UIView alloc] initWithFrame:faceFeature.bounds];
faceView.layer.borderWidth =1;
faceView.layer.borderColor = [UIColor orangeColor].CGColor;
[resultView addSubview:faceView];
[faceView release];
//左眼
if(faceFeature.hasLeftEyePosition) {
}
//右眼
if(faceFeature.hasRightEyePosition) {
}
//嘴巴
if(faceFeature.hasMouthPosition) {
}
}
[resultView setTransform:CGAffineTransformMakeScale(1, -1)];
[resultView release];
也就是说,你去银行办理银行卡出银行卡的机器(现在都是类似于ATM一样的机器出卡,不用在人工窗口进行办卡出卡了)对你进行拍照,最后形成面纹数据库从而永久保存,一直到你over掉这个数据库依然永久存在,这一点是多么的可怕,办卡且行且珍惜吧。。。。
这里只是进行矩形边框的识别,至于人脸的识别参见:
iOS之使用CoreImage进行人脸识别
至于用那个方法读者自己甄别
参考demo参见:
OpenCVAndCoreImage-CIDetector
链接: https://pan.baidu.com/s/1eSAixhg 密码: jd7i
若是此demo帮助到了你欢迎大赏和start
更多资源学习交流群:群号:224110749