1、本文主要涉及到opencv的视频帧抓拍和验证的相关问题,不包含如何集成opencv

2、主要讲解涉及到opencv中的关键类及一些常用的方法

3、着重讲解代理方法:

- (void)processImage:(cv::Mat &)image

4、集成过程中的注意事项

5、附上抓拍的小demo的下载地址

6、扩展,验证抓拍的图片中是否包含人脸

=====================================分割线==========================================

以下为正文

一、集成opencv需要添加的framework和静态库

二、OpenCV使用过程中的关键类及一些常用的方法

1、cap_ios.h、以下为此类的原始代码

/* For iOS video I/O

* by Eduard Feicho on 29/07/12

* Copyright 2012. All rights reserved.

*

* Redistribution and use in source and binary forms, with or without

* modification, are permitted provided that the following conditions are met:

*

* 1. Redistributions of source code must retain the above copyright notice,

* this list of conditions and the following disclaimer.

* 2. Redistributions in binary form must reproduce the above copyright notice,

* this list of conditions and the following disclaimer in the documentation

* and/or other materials provided with the distribution.

* 3. The name of the author may not be used to endorse or promote products

* derived from this software without specific prior written permission.

*

* THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED

* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF

* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO

* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,

* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,

* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;

* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,

* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR

* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF

* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

*

*/

#import

#import

#import

#import

#include "opencv2/core.hpp"

//! @addtogroup videoio_ios

//! @{

/// CvAbstractCamera /

@class CvAbstractCamera;

CV_EXPORTS @interface CvAbstractCamera : NSObject

{

UIDeviceOrientation currentDeviceOrientation;

BOOL cameraAvailable;

}

@property (nonatomic, strong) AVCaptureSession* captureSession;

@property (nonatomic, strong) AVCaptureConnection* videoCaptureConnection;

@property (nonatomic, readonly) BOOL running;

@property (nonatomic, readonly) BOOL captureSessionLoaded;

@property (nonatomic, assign) int defaultFPS;

@property (nonatomic, readonly) AVCaptureVideoPreviewLayer *captureVideoPreviewLayer;

@property (nonatomic, assign) AVCaptureDevicePosition defaultAVCaptureDevicePosition;

@property (nonatomic, assign) AVCaptureVideoOrientation defaultAVCaptureVideoOrientation;

@property (nonatomic, assign) BOOL useAVCaptureVideoPreviewLayer;

@property (nonatomic, strong) NSString *const defaultAVCaptureSessionPreset;

@property (nonatomic, assign) int imageWidth;

@property (nonatomic, assign) int imageHeight;

@property (nonatomic, strong) UIView* parentView;

- (void)start;

- (void)stop;

- (void)switchCameras;

- (id)initWithParentView:(UIView*)parent;

- (void)createCaptureOutput;

- (void)createVideoPreviewLayer;

- (void)updateOrientation;

- (void)lockFocus;

- (void)unlockFocus;

- (void)lockExposure;

- (void)unlockExposure;

- (void)lockBalance;

- (void)unlockBalance;

@end

/ CvVideoCamera ///

@class CvVideoCamera;

CV_EXPORTS @protocol CvVideoCameraDelegate

#ifdef __cplusplus

// delegate method for processing image frames

- (void)processImage:(cv::Mat&)image;

#endif

@end

CV_EXPORTS @interface CvVideoCamera : CvAbstractCamera

{

AVCaptureVideoDataOutput *videoDataOutput;

dispatch_queue_t videoDataOutputQueue;

CALayer *customPreviewLayer;

CMTime lastSampleTime;

}

@property (nonatomic, weak) id delegate;

@property (nonatomic, assign) BOOL grayscaleMode;

@property (nonatomic, assign) BOOL recordVideo;

@property (nonatomic, assign) BOOL rotateVideo;

@property (nonatomic, strong) AVAssetWriterInput* recordAssetWriterInput;

@property (nonatomic, strong) AVAssetWriterInputPixelBufferAdaptor* recordPixelBufferAdaptor;

@property (nonatomic, strong) AVAssetWriter* recordAssetWriter;

- (void)adjustLayoutToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation;

- (void)layoutPreviewLayer;

- (void)saveVideo;

- (NSURL *)videoFileURL;

- (NSString *)videoFileString;

@end

/ CvPhotoCamera ///

@class CvPhotoCamera;

CV_EXPORTS @protocol CvPhotoCameraDelegate

- (void)photoCamera:(CvPhotoCamera*)photoCamera capturedImage:(UIImage *)image;

- (void)photoCameraCancel:(CvPhotoCamera*)photoCamera;

@end

CV_EXPORTS @interface CvPhotoCamera : CvAbstractCamera

{

AVCaptureStillImageOutput *stillImageOutput;

}

@property (nonatomic, weak) id delegate;

- (void)takePicture;

@end

//! @} videoio_ios

以上方法从名知意,且命名简洁明了,无需过多的注释说明 ,此为值得我等ITboy学习和观摩的地方

2、关键方法说明

此处不对CvPhotoCamera做说明,主要针对 CvVideoCameraDelegate 的代理方法进行说明

- (void)processImage:(cv::Mat&)image;

此方法视频帧的抓取代理,其中的image对象为非正常的RGB对象,为一个灰度对象,在使用过程中,需要进行色值的转换

- (void)processImage:(cv::Mat &)image

{

cv::Mat outCopyImg;

image.copyTo(outCopyImg);

cv::cvtColor(outCopyImg, outCopyImg, CV_BGR2RGB);

//此处说明:cv::cvtColor为颜色转换方法,最后一个参数即为我们常用的RGB色值if([self whetherTheImageBlurry:image]) {

//此为一个清晰度的验证,也是来自于网上的摘录,下方会贴出代码

[self.videoCamera stop];

keepMatImg=outCopyImg;if (isNeedToCut ==YES) {

CGFloat mianW=UIScreen.mainScreen.bounds.size.width;

CGFloat NH= mianW * 1920 / 1080;

cv::Rect rect(0,(1920 - NH)/2,1080,NH);

cv::Mat image_roi=outCopyImg(rect);

self.keepImageAlive=MatToUIImage(image_roi);

//说明:网上有很多将cv::Mat类型的数据转换为UIimage的方法 ,但是OpenCV本身就提供了此方法 MatToUIImage(),所以此处不再引用其他方法

}else{

self.keepImageAlive=MatToUIImage(outCopyImg);

}

NSLog(@"keepImageAlive.size = %@",NSStringFromCGSize(self.keepImageAlive.size));

dispatch_async(dispatch_get_main_queue(),^{if(self.keepImageAlive) {

self.fuzzyText.text= @"清晰";

self.resultImageView.image=self.keepImageAlive;

self.resultImageView.hidden=NO;

}

});

}else{

dispatch_sync(dispatch_get_main_queue(),^{

self.fuzzyText.text= @"模糊";

});

}

}

3、清晰度的验证的方法

- (BOOL)whetherTheImageBlurry:(cv::Mat)mat{

unsigned char *data;

int height,width,step;

int Iij;

double Iave = 0, Idelta = 0;

// cv::Mat mat = [OpenCVExtension cvMatFromUIImage:image];

if(!mat.empty()){

cv::Mat gray;

cv::Mat outGray;

// 将图像转换为灰度显示

cv::cvtColor(mat,gray,CV_RGB2GRAY);

cv::Laplacian(gray, outGray, gray.depth());

// cv::convertScaleAbs( outGray, outGray );

IplImage ipl_image(outGray);

data = (uchar*)ipl_image.imageData;

height = ipl_image.height;

width = ipl_image.width;

step = ipl_image.widthStep;

for(int i=0;i

{

for(int j=0;j

{

Iij = (int) data

[i*width+j];

Idelta = Idelta + (Iij-Iave)*(Iij-Iave);

}

}

Idelta = Idelta/(width*height);

std::cout<

}

return (Idelta > IdeltaCount) ? YES : NO;

}

demo下载地址:https://tianlin106@github.com/tianlin106/OpencvAutoTakeImage.git

三、人脸识别的扩展- (void)processImage:(cv::Mat &)image

{

cv::Mat outCopyImg;

image.copyTo(outCopyImg);

cv::cvtColor(outCopyImg, outCopyImg, CV_BGR2RGB);

if ([self isPhotoContainsFeature:MatToUIImage(outCopyImg)]) {

if ([self isPhotoIsBrightness:image] == YES) {

[self disposeCamare];

keepMatImg = outCopyImg;

UIImage * resultImage = MatToUIImage(outCopyImg);

//需要上传

[self uploadImage:resultImage];

dispatch_async(dispatch_get_main_queue(), ^{

[self.imageView removeFromSuperview];

});

}

}

}

- (BOOL)isPhotoContainsFeature:(UIImage *)image{

CIContext * context = [CIContext contextWithOptions:nil];

NSDictionary * param = [NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh forKey:CIDetectorAccuracy];

CIDetector * faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:context options:param];

//此类为Core Image Framework 中的类 ,主要用于识别某些外貌特性,以下语言为其API的描述

//An image processor that identifies notable features (such as faces and barcodes) in a still image or video.

CIImage * ciimage = [CIImage imageWithCGImage:image.CGImage];

NSArray * detectResult = [faceDetector featuresInImage:ciimage];

return detectResult.count;

}

//此方法计算图像的亮度是否符合要求

- (BOOL)isPhotoIsBrightness:(cv::Mat &)image

{

cv::Mat imageSobel;

Sobel(image, imageSobel, CV_16U, 1, 1);

//图像的平均灰度

double meanValue = 0.0;

meanValue = mean(imageSobel)[0];

if (meanValue > 1.3) {

return YES;

}

return NO;

}

四:集成主要事项:

1、导入OpenCV类目的文件的控制器必须为.mm的C++混编的文件

2、在方法命名和定义形参时,尽量避免使用关键字开头或直接使用关键字,由于OC对此项的检查不是很严格,一旦包含C++的文件以后,对关键字的检测会很强,此为需要注意的事项

ios识别人脸自动拍照_利用openCV实现自动抓拍,人脸识别,清晰度的验证等相关推荐

  1. 手写字体识别用python实现_利用贝叶斯算法实现手写体识别(Python)

    #!/usr/bin/python#-*- coding: utf-8 -*-##########################################Bayes : 用来描述两个条件概率之 ...

  2. ios识别人脸自动拍照_面部识别是否会自动拍照上传?

    谷歌,苹果,微软三家的原生应用是肯定不会的,因为这么做成本太高了. 理论上不越狱的IOS下的摄像头权限管理不会发生这种事,可是呢,IOS下不越狱也能从网页直接安装APP,而且也不是说IOS牢不可破有人 ...

  3. python自动扫雷_利用Python实现自动扫雷

    自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. 一.准备工作 我的版本是 python 3.6.1 python的第三方库: w ...

  4. python如何自动打印_利用Python每天自动打印练习题

    在日常教学工作中,我几乎每天都会给班上的每位同学打印一份口算练习题.为了防止出现抄袭的现象,给每位同学的练习题都不相同. 通过网上下载的一个小软件自动生成的练习题. 之前的操作是通过网上下载的软件,自 ...

  5. ios识别人脸自动拍照_求助,使用APP开发自动拍照及标记脸部,可以付费

    自动拍照并标记需求说明: 背景:由于需要做一个人脸识别功能,需要打开摄像头自动拍照,并且用方框标记出人脸的位置,采用uni app后发现目前还不支持这个功能,需要开发第三方插件.人脸识别的功能类似与钉 ...

  6. python读取视频流做人脸识别_基于OpenCV和Keras实现人脸识别系列——二、使用OpenCV通过摄像头捕获实时视频并探测人脸、准备人脸数据...

    基于OpenCV和Keras实现人脸识别系列手记: 项目完整代码参见Github仓库. 本篇是上面这一系列手记的第二篇. 在Opencv初接触,图片的基本操作这篇手记中,我介绍了一些图片的基本操作,而 ...

  7. opencv 识别长方形_利用opencv识别并提取图片中的矩形

    这次是利用opencv来识别图片中的矩形. 其中遇到的问题主要是识别轮廓时矩形内部的形状导致轮廓不闭合. 过程如下: **1. 对输入灰度图片进行高斯滤波 2. 做灰度直方图,提取阈值,做二值化处理 ...

  8. python人脸识别理论_使用OpenCV和Python进行人脸识别

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

  9. python扫雷脚本_利用 Python 实现 自动扫雷 小脚本

    原标题:利用 Python 实现 自动扫雷 小脚本 自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式.一.准备工作1.扫雷游戏 我是 ...

  10. python如何实现找图_利用OpenCV和Python实现查找图片差异

    使用OpenCV和Python查找图片差异 flyfish 方法1 均方误差的算法(Mean Squared Error , MSE) 下面的一些表达与<TensorFlow - 协方差矩阵&g ...

最新文章

  1. 阿里面试官:接口的幂等性怎么设计?
  2. 关于微信小程序开发中遇到的缺少game.json问题的解决
  3. 不努力提高效率,小姐姐都被人追走了:K8S一键部署了解一下?
  4. 机器学习特征表达——日期与时间特征做离散处理(数字到分类的映射),稀疏类分组(相似特征归档),创建虚拟变量(提取新特征) 本质就是要么多变少,或少变多...
  5. scrapy详解及主要应用场景
  6. 蓝桥杯-K好数(java)
  7. 3亿Docker容器部署的挑战及应对方案
  8. MapServer应用开发平台示例
  9. 数据结构杂谈(五)——栈
  10. laravel log 对象_swoole运行模式加速laravel应用的详细介绍(life)
  11. 2.跳转到指定的位置
  12. matplotlib tricks(一)—— 多类别数据的 scatter(cmap)
  13. 如何将Spring Bean注入到JSF Converter
  14. WebSphere 安装和配置过程
  15. LayaAir TTF字体使用
  16. 论文解读:《Deep-4mcw2v: 基于序列的预测器用于识别大肠桿菌中的 N4- 甲基胞嘧啶(4mC)位点》
  17. 《哪吒》票房直指40亿,闯中国影史前三!导演饺子:最怕你的梦想只有一腔热血
  18. centos kvm镜像
  19. 创建临时文件及文件夹
  20. 手机计算机怎么恢复出厂设置密码,如何找回手机锁屏密码?

热门文章

  1. 深度解读央行数字货币 DCEP
  2. LR证书过期解决办法
  3. 碰撞检测之OBB-OBB检测
  4. 路由器450m和1200m有什么区别
  5. 工具说明书 - 输入汉语拼音
  6. ubuntu内存不足时,扩展内存方法(亲测有效)
  7. 基于法律裁判文书的法律判决大数据预测
  8. Profinet 与 EtherCAT 网关使用方法
  9. qpython3电脑版下载_qpython3官方版下载
  10. 鲁迅《狂人日记》全文