ios识别人脸自动拍照_利用openCV实现自动抓拍,人脸识别,清晰度的验证等
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实现自动抓拍,人脸识别,清晰度的验证等相关推荐
- 手写字体识别用python实现_利用贝叶斯算法实现手写体识别(Python)
#!/usr/bin/python#-*- coding: utf-8 -*-##########################################Bayes : 用来描述两个条件概率之 ...
- ios识别人脸自动拍照_面部识别是否会自动拍照上传?
谷歌,苹果,微软三家的原生应用是肯定不会的,因为这么做成本太高了. 理论上不越狱的IOS下的摄像头权限管理不会发生这种事,可是呢,IOS下不越狱也能从网页直接安装APP,而且也不是说IOS牢不可破有人 ...
- python自动扫雷_利用Python实现自动扫雷
自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. 一.准备工作 我的版本是 python 3.6.1 python的第三方库: w ...
- python如何自动打印_利用Python每天自动打印练习题
在日常教学工作中,我几乎每天都会给班上的每位同学打印一份口算练习题.为了防止出现抄袭的现象,给每位同学的练习题都不相同. 通过网上下载的一个小软件自动生成的练习题. 之前的操作是通过网上下载的软件,自 ...
- ios识别人脸自动拍照_求助,使用APP开发自动拍照及标记脸部,可以付费
自动拍照并标记需求说明: 背景:由于需要做一个人脸识别功能,需要打开摄像头自动拍照,并且用方框标记出人脸的位置,采用uni app后发现目前还不支持这个功能,需要开发第三方插件.人脸识别的功能类似与钉 ...
- python读取视频流做人脸识别_基于OpenCV和Keras实现人脸识别系列——二、使用OpenCV通过摄像头捕获实时视频并探测人脸、准备人脸数据...
基于OpenCV和Keras实现人脸识别系列手记: 项目完整代码参见Github仓库. 本篇是上面这一系列手记的第二篇. 在Opencv初接触,图片的基本操作这篇手记中,我介绍了一些图片的基本操作,而 ...
- opencv 识别长方形_利用opencv识别并提取图片中的矩形
这次是利用opencv来识别图片中的矩形. 其中遇到的问题主要是识别轮廓时矩形内部的形状导致轮廓不闭合. 过程如下: **1. 对输入灰度图片进行高斯滤波 2. 做灰度直方图,提取阈值,做二值化处理 ...
- python人脸识别理论_使用OpenCV和Python进行人脸识别
介绍 人脸识别是什么?或识别是什么?当你看到一个苹果时,你的大脑会立刻告诉你这是一个苹果.在这个过程中,你的大脑告诉你这是一个苹果水果,用简单的语言来说就是识别.那么什么是人脸识别呢?我肯定你猜对了. ...
- python扫雷脚本_利用 Python 实现 自动扫雷 小脚本
原标题:利用 Python 实现 自动扫雷 小脚本 自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式.一.准备工作1.扫雷游戏 我是 ...
- python如何实现找图_利用OpenCV和Python实现查找图片差异
使用OpenCV和Python查找图片差异 flyfish 方法1 均方误差的算法(Mean Squared Error , MSE) 下面的一些表达与<TensorFlow - 协方差矩阵&g ...
最新文章
- 阿里面试官:接口的幂等性怎么设计?
- 关于微信小程序开发中遇到的缺少game.json问题的解决
- 不努力提高效率,小姐姐都被人追走了:K8S一键部署了解一下?
- 机器学习特征表达——日期与时间特征做离散处理(数字到分类的映射),稀疏类分组(相似特征归档),创建虚拟变量(提取新特征) 本质就是要么多变少,或少变多...
- scrapy详解及主要应用场景
- 蓝桥杯-K好数(java)
- 3亿Docker容器部署的挑战及应对方案
- MapServer应用开发平台示例
- 数据结构杂谈(五)——栈
- laravel log 对象_swoole运行模式加速laravel应用的详细介绍(life)
- 2.跳转到指定的位置
- matplotlib tricks(一)—— 多类别数据的 scatter(cmap)
- 如何将Spring Bean注入到JSF Converter
- WebSphere 安装和配置过程
- LayaAir TTF字体使用
- 论文解读:《Deep-4mcw2v: 基于序列的预测器用于识别大肠桿菌中的 N4- 甲基胞嘧啶(4mC)位点》
- 《哪吒》票房直指40亿,闯中国影史前三!导演饺子:最怕你的梦想只有一腔热血
- centos kvm镜像
- 创建临时文件及文件夹
- 手机计算机怎么恢复出厂设置密码,如何找回手机锁屏密码?