使用透视变换矫正扭曲的图(opencv)矩形边缘检测(原生CoreImage框架下CIDetector)

使用透视变换矫正扭曲的图(opencv)和矩形边缘检测(原生CoreImage框架下CIDetector)都是基于iOS版本

之前也找了很多都是vs啊,android啊,运用xcode的.mm混合编译时出现一大堆崩溃问题,无奈跨平台移植demo无果,只好搞原生iOS工程下的

运用场景:手机拍照目标文件往往有一个角度,或者目标文件之外的物体,需要经过处理后只要目标文件,且正视无角度倾斜

主要意思就是手机拍照

摄像头观察一个矩形的图片时往往只能得到一个扭曲的图片:

原图:(处理后的)


使用透视变换矫正扭曲的图(opencv)矩形边缘检测(原生CoreImage框架下CIDetector)_第1张图片

实际情况是摄像头经常从某个角度观察图片:(原始的未处理的)


使用透视变换矫正扭曲的图(opencv)矩形边缘检测(原生CoreImage框架下CIDetector)_第2张图片

方法一.使用opencv的透视变换把图片矫正为正视的角度

大概过程:

1、通过灰度、模糊和二值化得到:


使用透视变换矫正扭曲的图(opencv)矩形边缘检测(原生CoreImage框架下CIDetector)_第3张图片

2、然后对查找图片外包矩形轮廓,并查找角点得到:


使用透视变换矫正扭曲的图(opencv)矩形边缘检测(原生CoreImage框架下CIDetector)_第4张图片

3.通过梯形四个角点和外包矩形的四个顶点得到变换矩阵,进行投射变换,最后得到:


使用透视变换矫正扭曲的图(opencv)矩形边缘检测(原生CoreImage框架下CIDetector)_第5张图片

方法二.原生CoreImage框架下CIDetector进行矩形边缘检测

这是iOS的一个原生api

coreImage framework 组成

apple 已经帮我们把coreImage的处理分类好,来看看它的结构:

使用透视变换矫正扭曲的图(opencv)矩形边缘检测(原生CoreImage框架下CIDetector)_第6张图片

主要分为三部分:

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进行人脸识别

使用透视变换矫正扭曲的图(opencv)矩形边缘检测(原生CoreImage框架下CIDetector)_第7张图片
使用透视变换矫正扭曲的图(opencv)矩形边缘检测(原生CoreImage框架下CIDetector)_第8张图片

至于用那个方法读者自己甄别

参考demo参见:

OpenCVAndCoreImage-CIDetector

链接: https://pan.baidu.com/s/1eSAixhg 密码: jd7i

若是此demo帮助到了你欢迎大赏和start

更多资源学习交流群:群号:224110749

你可能感兴趣的:(使用透视变换矫正扭曲的图(opencv)矩形边缘检测(原生CoreImage框架下CIDetector))