OpenCV学习-b
OpenCV是开源计算机视觉和机器学习库。包含成千上万优化过的算法。项目地址:http://opencv.org/about.html。官方文档:http://docs.opencv.org/modules/core/doc/intro.html。OpenCV已支持OpenCL OpenGL,也支持iOS和Android。OpenCV的API是C++的,所以在iOS中最佳实践是将用到OpenCV功能写一层Objective-C++封装。这些封装把OpenCV的C++API转化为安全的Objective-C API。
模块
core:简洁核心模块,基本函数,基本数据结构
imgproc:图像处理模块,线性和非线性图像滤波,几何图像转换,颜色空间转换,直方图等。
video:视频分析模块,运动估计,背景消除,物体跟踪算法
calib3d:基本多视角几何算法,单体和立体相机的标定,对象姿势估计,双目立体匹配算法和元素的三维重建
features2d:包含了显著特征检测算法,描述算子和算子匹配算法
objdetect:物体检测和一些预定义的物体的检测(如人脸,眼睛,杯子,人,汽车等)
ml:多种机器学习算法,如K均值,支持向量机和神经网络
highgui:简单易用接口,有视频捕捉,图像和视频编码功能,简单UI接口,iOS的是其中一个子集
gpu:GPU加速算法,iOS不可用
ocl:OpenCL通用算法,iOS不可用
其它辅助模块,如用户贡献的算法
基础类和操作
OpenCV有几百个类,几个核心类可以参考文档:http://docs.opencv.org/modules/core/doc/core.html
cv::Mat:核心数据结构,可以用来表示N维矩阵,图像是2维矩阵的,cv::Mat是OpenCV中用的最多的。一个cv::Mat实例作用就是图像数据头,包含图像格式信息。图像中任一像素地址都可通过下面的指针运算得到:
uchar *pixelPtr = cvMat.data + rowIndex * cvMat.step[0] + colIndex * cvMat.step[1]
每个像素的数据格式可以通过type()方法获得,这些数据格式包括:
常用的每通道8位无符号整数的灰度图(1通道,CV_8UC1)
常用的彩色图(3通道,CV_8UC3)
不常用的CV_16SC3(每像素3通道,每通道使用16位有符号整数)
不常用的CV_64FC4(每像素4通道,每通道使用64位浮点数)
cv::Algorithm:很多算法的抽象基类。
iOS中使用OpenCV
添加到自己项目中
CocoaPods:pod “OpenCV"
下载官方iOS包:http://opencv.org/downloads.html
在GitHub下代码自己编译:GitHub地址https://github.com/Itseez/opencv,编译教程http://docs.opencv.org/doc/tutorials/introduction/ios_install/ios_install.html#ios-installation
Objective-C++
OpenCV的API在Objective-C++文件中使用,这里内存管理是需要注意的,ARC是无效的,所以assign需要在dealloc里将C++对象正确释放掉。更多的混用C++和Objective-C的细节参考Matt Galloway的教程:http://www.raywenderlich.com/62989/introduction-c-ios-developers-part-1
人脸识别器范例
范例源码:https://github.com/objcio/issue-21-OpenCV-FaceRec。范例是从iPhone摄像头获取视频流进行人脸的持续检测在屏幕上标出。用户点击一个脸孔会识别这个人,结果正确点“Correct”,错误要选择一个人名。人脸识别器
视频拍摄
OpenCV的highgui模块有个类CvVideoCamera,这个类把iPhone的摄像机抽象出来,通过一个代理(void)processImage:(cv::Mat&)image来获得视频流。实例可以这样设置:
CvVideoCamera *videoCamera = [[CvVideoCamera alloc] initWithParentView:view];
videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionFront;
videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset640x480;
videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait;
videoCamera.defaultFPS = 30;
videoCamera.grayscaleMode = NO;
videoCamera.delegate = self;
人脸检测
用优化过的Core Image提供的CIDetector类。
CIDetector *faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:context options:@{CIDetectorAccuracy: CIDetectorAccuracyHigh}];NSArray *faces = [faceDetector featuresInImage:image]; //faces中保存着每个面孔的CIFaceFeature实例。这个实例里有这个面孔的位置和宽高,眼睛,嘴位置等
使用OpenCV提供的一套物体检测功能,经过训练能够检测任何需要的物体。这个库自带了可以直接用的检测参数,比如脸,眼睛,嘴,身体,上半身,下半身和笑脸等。这些检测器称为Haar特征检测器。关于训练和检测过程可以参考这个论文http://www.multimedia-computing.de/mediawiki//images/5/52/MRL-TR-May02-revised-Dec02.pdf
// 正面人脸检测器训练参数的文件路径
NSString *faceCascadePath = [[NSBundle mainBundle] pathForResource:@"haarcascade_frontalface_alt2"ofType:@"xml"];
const CFIndex CASCADE_NAME_LEN = 2048;char *CASCADE_NAME = (char *) malloc(CASCADE_NAME_LEN);
CFStringGetFileSystemRepresentation( (CFStringRef)faceCascadePath, CASCADE_NAME, CASCADE_NAME_LEN);
CascadeClassifier faceDetector; //这些参数可以在OpenCV包的data/haarcascades文件夹中找到
faceDetector.load(CASCADE_NAME);//开始人脸检测cv::Mat img;vector<cv::Rect> faceRects;double scalingFactor = 1.1; //用不同的尺度遍历检测不同大小的人脸,scalingFactor决定每次遍历尺度会变大多少倍。int minNeighbors = 2; //拥有少于minNeighbors个符合条件的邻居像素人脸区域会被拒绝掉。int flags = 0; //1.x的遗留物,始终设置为0cv::Size minimumSize(30,30); //寻找的人脸区域大小的最小值//faceRects向量会包含对识别获得的所有人脸区域。识别的人脸图像可以通过cv::Mat的()运算符提取出,方式为:cv::Mat faceImg = img(aFaceRect)faceDetector.detectMultiScale(img, faceRects, scalingFactor, minNeighbors, flags cv::Size(30, 30) );
人脸识别
OpenCV自带三个人脸识别算法:Eigenfaces,Fisherfaces和局部二值模式直方图(LBPH)。详细参考OpenCV的文档:http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html#local-binary-patterns-histograms
下面的代码使用的是LBPH算法,它会根据用户输入自动更新,而不需要在每添加一个人或纠正一次出错的判断都要重新进行一次彻底的训练。
使用Objective-C++先将其封装,封装中暴露以下函数
+ (FJFaceRecognizer *)faceRecognizerWithFile:(NSString *)path;
- (NSString *)predict:(UIImage*)img confidence:(double *)confidence;
- (void)updateWithFace:(UIImage *)img name:(NSString *)name;//创建一个实例+ (FJFaceRecognizer *)faceRecognizerWithFile:(NSString *)path {
FJFaceRecognizer *fr = [FJFaceRecognizer new];
fr->_faceClassifier = createLBPHFaceRecognizer();
fr->_faceClassifier->load(path.UTF8String);
return fr; }//预测
- (NSString *)predict:(UIImage*)img confidence:(double *)confidence {
cv::Mat src = [img cvMatRepresentationGray]; // UIImage 转化为 cv::Mat
int label;
self->_faceClassifier->predict(src, label, *confidence);
return _labelsArray[label]; //_labelsArray是int和string对应关系数组}//通过用户的选择更新人脸识别器- (void)updateWithFace:(UIImage *)img name:(NSString *)name {
cv::Mat src = [img cvMatRepresentationGray];
NSInteger label = [_labelsArray indexOfObject:name];
if (label == NSNotFound) {
[_labelsArray addObject:name];
label = [_labelsArray indexOfObject:name];
}
vector<cv::Mat> images = vector<cv::Mat>();
images.push_back(src);
vector<int> labels = vector<int>();
labels.push_back((int)label);
self->_faceClassifier->update(images, labels); }
感谢分享
OpenCV学习-b的更多相关文章
- opencv学习笔记(七)SVM+HOG
opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子 ...
- opencv学习笔记(六)直方图比较图片相似度
opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...
- opencv学习笔记(五)镜像对称
opencv学习笔记(五)镜像对称 设图像的宽度为width,长度为height.(x,y)为变换后的坐标,(x0,y0)为原图像的坐标. 水平镜像变换: 代码实现: #include <ios ...
- opencv学习笔记(四)投影
opencv学习笔记(四)投影 任选了一张图片用于测试,图片如下所示: #include <cv.h> #include <highgui.h> using namespace ...
- opencv学习笔记(三)基本数据类型
opencv学习笔记(三)基本数据类型 类:DataType 将C++数据类型转换为对应的opencv数据类型 OpenCV原始数据类型的特征模版.OpenCV的原始数据类型包括unsigned ch ...
- opencv学习笔记(二)寻找轮廓
opencv学习笔记(二)寻找轮廓 opencv中使用findContours函数来查找轮廓,这个函数的原型为: void findContours(InputOutputArray image, O ...
- opencv学习笔记(一)IplImage, CvMat, Mat 的关系
opencv学习笔记(一)IplImage, CvMat, Mat 的关系 opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,M ...
- paper 93:OpenCV学习笔记大集锦
整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址: ...
- (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU
首页 视界智尚 算法技术 每日技术 来打我呀 注册 OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...
- OpenCV学习笔记(一)安装及运行第一个OpenCV程序
1.下载及安装 OpenCV是一套开源免费的图形库,主要有C/C++语言编写,官网: http://opencv.org/ .在 http://opencv.org/downloads.html 可以 ...
随机推荐
- 键盘工具栏的快速集成--HcCustomKeyboard
源项目地址:HcCustomKeyboard HcCustomKeyboard是一个键盘工具栏控件: 效果: HcCustomKeyboard使用很方便: 三部: 添加控件->操作处理-> ...
- WebSocket实时异步通信
WebSocket实时异步通信 [一]WebSocket简介 WebSocket是HTML5推出一个协议规范,用来B/S模式中服务器端和客户端之间进行实时异步通信. 众所周知,传统的HTTP协议中,服 ...
- DHCP 服务器
简介: DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作,主要用途:给内部网络或网络服务供应商自动分配 I ...
- 移动平台3G手机网站前端开发布局技巧
本文转载至:移动平台3G手机网站前端开发布局技巧汇总 - 前端开发-武方博 您或许正在或准备参与一个WepApp项目,您或许正在Google搜索mobile development相 关的文章,您或许 ...
- asp中的几个取整函数fix(),int(),round()的用法
asp中的几个取整函数是:fix(),int(),round(); Int(number).Fix(number)函数返回数字的整数部分.number 参数可以是任意有效的数值表达式.如果 numbe ...
- ArrayList、Vector、LinkedList的区别及其优缺点? (转载)
原文链接:http://blog.csdn.net/wangzff/article/details/7296648 ArrayList,LinkedList,Vestor这三个类都实现了java.ut ...
- PRINTDLG 结构体
//包含 PrintDlg 函数用来初始化Print Dialog Box的信息,在用户关闭窗口后,返回用户选择的信息typedef struct tagPD { DWORD lStructSize; ...
- IO流详解之代码详解
前面呢已经发了一些理解,整理了注释,整体来说IO这里难度不是很大,代码呢没有详细敲,只写了一个大概总结的内容如下: /** 一切皆文件:文件是所有操作系统保存数据和处理逻辑的唯一方式:不管是.exe, ...
- SC命令---安装、开启、配置、关闭 cmd命令行和bat批处理操作windows服务
一.cmd命令行---进行Windows服务操作 1.安装服务 sc create 服务名 binPath= "C:\Users\Administrator\Desktop\win32s ...
- iOS block的使用
明明知道block是一个很重要的知识点,很久不用就又忘了,这是在网上看到的一个例子.(晚上回去整理另外的一个) 在视图A上有一个按钮(用来在点击的时候推出视图b)和一个label(用来显示从b传回来的 ...