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); }感谢分享
时间: 2024-10-10 09:01:08

OpenCV学习-b的相关文章

OpenCV 学习(利用滤波器进行边缘提取)

OpenCV 学习(利用滤波器进行边缘提取) 通过低通滤波器,我们可以将图像平滑,相反的,利用高通滤波器可以提取出图像的边缘. Sobel 滤波器 Sobel 滤波器是一种有方向性的滤波器,可以作用在 X 方向或 Y 方向. 关于这种滤波器的理论介绍可以参考: https://en.wikipedia.org/wiki/Sobel_operator 函数原型如下: void Sobel( InputArray src, OutputArray dst, int ddepth, int dx, i

OpenCV学习之六: 使用方向梯度直方图估计图像旋转角度

在备份ltedecoder程序时,需要把此目录拷由到bak目录下,但decoder目录下有个大文件,不需要备份,还有日志问题,也不需要备份,如何实现呢?? 方法: cd /source-dir find . -name .snapshot -prune -o -print0 | cpio -pmd0 /dest-dir 解释: This command copies the contents of /source-dir to /dest-dir, but omits files and dir

Opencv学习笔记(六)SURF学习笔记

原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details/7392345 本人挺菜的,肯定有非常多错误纰漏之处 ,希望大家不吝指正. 看了harris角点检測之后,開始研究SURF角点检測,发现挺复杂的,一时也仅仅了解了大概,把了解的东西总结下,以便下次深入学习. SURF角点检測算法是对SIFT的一种改进,主要体如今速度上,效率更高.它和SIFT的主要差别是图像多尺度空间的构建方法不同. 在计算视觉领域,尺度空间被象征性的表述

opencv学习笔记(四)投影

opencv学习笔记(四)投影 任选了一张图片用于测试,图片如下所示: 1 #include <cv.h> 2 #include <highgui.h> 3 using namespace std; 4 using namespace cv; 5 int main() 6 { 7 IplImage * src = cvLoadImage("cat.png", 0); //强制转化读取图像为灰度图 8 cvShowImage("灰度图像", s

OpenCV学习笔记(一)安装及运行第一个OpenCV程序

1.下载及安装 OpenCV是一套开源免费的图形库,主要有C/C++语言编写,官网: http://opencv.org/ .在 http://opencv.org/downloads.html 可以找到个版本和各种平台的程序包.OpenCV的Windows平台安装包是放在SourceForge.net网站. 我下了2.4.4版,大概217M.安装包其实就是一个压缩包,安装过程就是解压到某个文件夹.我是安装到 E:\Soft\opencv 目录,安装后文件夹如下: 我们只需要关注“build”文

OpenCV学习之八:RNG类 随机数生成函数的使用

OpenCV学习之八:随机数生成函数 运行结果: OpenCV学习之八:RNG类 随机数生成函数的使用,布布扣,bubuko.com

OpenCV学习笔记(01)我的第一个OpenCV程序(环境配置)

昨天刚刚考完编译原理,私心想着可以做一些与考试无关的东西了.一直想做和图像处理相关的东西,趁这段时间有空学习一下OpenCV,搭建环境真是一件麻烦的事情,搞了近三个小时终于OK了.先来张图: 大致描述一下步骤吧: 一.安装前准备 1.VS2012(网上看到很多用的VS2010,但是基本不影响) 2.OpenCV 安装包(我下载的是最新的2.4.9) 二.安装OpenCV 1.解压OPenCV 说是安装,其实就是解压,OpenCV的Windows安装程序就是一个自解压程序: 这里我解压到C:\Pr

opencv学习笔记(03)——遍历图像(迭代器法)

1 #include <opencv2\highgui\highgui.hpp> 2 #include <opencv2\imgproc\imgproc.hpp> 3 #include <opencv2\core\core.hpp> 4 5 void colorReduce(cv::Mat& img, int div=64); 6 7 8 int main() 9 { 10 cv::Mat img_orginal = cv::imread("F:\\i

OpenCV学习资源整理……

http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/tutorials.html OpenCV(2.3.2)官方教程中文版 http://docs.opencv.org/doc/tutorials/tutorials.html OpenCV(2.4.9)官方教程英文版 http://docs.opencv.org/modules/refman.html OpenCV(2.4.9)API参考 http://www.cnblogs.

OpenCV学习笔记[3]Java Demo人脸识别

OpenCV学习笔记:Java Demo人脸识别 [简介] 我记得在很久以前,CSDN似乎搞过一个活动,给一个橘子林的照片,让程序计算相片里有多少个橘子.之所以对这个问题记忆犹新,是因为在专业学习初期,相比于排序遍历搜索等简单算法而言,"图像识别"算法一直是难以理解的东西,而我偏偏又痴迷于此,不管自己多么无知,对于令我迷惑的问题总是充满着解决的渴望. 通过对OpenCV的初步了解,我发现图像识别的很多问题都可以用它方便的解决,本次将是一个来自官方的人脸识别的实例,我们提供图像,使用内置