cvvideocameradelegate包含在opencv mat 头文件哪个头文件

OpenCV学习 - 简书
OpenCV学习
OpenCV是开源计算机视觉和机器学习库。包含成千上万优化过的算法。项目地址:。官方文档:。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有几百个类,几个核心类可以参考文档:
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包:
在GitHub下代码自己编译:GitHub地址,编译教程
Objective-C++
OpenCV的API在Objective-C++文件中使用,这里内存管理是需要注意的,ARC是无效的,所以assign需要在dealloc里将C++对象正确释放掉。更多的混用C++和Objective-C的细节参考的教程:
人脸识别器范例
范例源码:。范例是从iPhone摄像头获取视频流进行人脸的持续检测在屏幕上标出。用户点击一个脸孔会识别这个人,结果正确点“Correct”,错误要选择一个人名。人脸识别器
OpenCV的highgui模块有个类CvVideoCamera,这个类把iPhone的摄像机抽象出来,通过一个代理(void)processImage:(cv::Mat&)image来获得视频流。实例可以这样设置:
CvVideoCamera *videoCamera = [[CvVideoCamera alloc] initWithParentView:view];
videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionF
videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset640x480;
videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationP
videoCamera.defaultFPS = 30;
videoCamera.grayscaleMode = NO;
videoCamera.delegate =
用优化过的Core Image提供的CIDetector类。
CIDetector *faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:context options:@{CIDetectorAccuracy: CIDetectorAccuracyHigh}];
NSArray *faces = [faceDetector featuresInImage:image]; //faces中保存着每个面孔的CIFaceFeature实例。这个实例里有这个面孔的位置和宽高,眼睛,嘴位置等
使用OpenCV提供的一套物体检测功能,经过训练能够检测任何需要的物体。这个库自带了可以直接用的检测参数,比如脸,眼睛,嘴,身体,上半身,下半身和笑脸等。这些检测器称为Haar特征检测器。关于训练和检测过程可以参考这个论文
// 正面人脸检测器训练参数的文件路径
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 faceD //这些参数可以在OpenCV包的data/haarcascades文件夹中找到
faceDetector.load(CASCADE_NAME);
//开始人脸检测
vector&cv::Rect& faceR
double scalingFactor = 1.1; //用不同的尺度遍历检测不同大小的人脸,scalingFactor决定每次遍历尺度会变大多少倍。
int minNeighbors = 2; //拥有少于minNeighbors个符合条件的邻居像素人脸区域会被拒绝掉。
int flags = 0; //1.x的遗留物,始终设置为0
cv::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的文档:
下面的代码使用的是LBPH算法,它会根据用户输入自动更新,而不需要在每添加一个人或纠正一次出错的判断都要重新进行一次彻底的训练。
使用Objective-C++先将其封装,封装中暴露以下函数
+ (FJFaceRecognizer *)faceRecognizerWithFile:(NSString *)
- (NSString *)predict:(UIImage*)img confidence:(double *)
- (void)updateWithFace:(UIImage *)img name:(NSString *)
//创建一个实例
+ (FJFaceRecognizer *)faceRecognizerWithFile:(NSString *)path {
FJFaceRecognizer *fr = [FJFaceRecognizer new];
fr-&_faceClassifier = createLBPHFaceRecognizer();
fr-&_faceClassifier-&load(path.UTF8String);
- (NSString *)predict:(UIImage*)img confidence:(double *)confidence {
cv::Mat src = [img cvMatRepresentationGray]; // UIImage 转化为 cv::Mat
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);
预测,反馈,更新循环,这就是监督式学习:
github帐号ming1016,喜欢画画,instagram帐号ming1016,qq:36...OpenCV&iOS&Video&Processing例子的修订
原有文件“OpenCV
iOS - Video Processing — OpenCV 3.0.0.0-dev
documentation”遗漏了一些代码需要补充,否则程序无法运行。以下是完善之后的编写步骤:
1、新建Xcode的single view项目;
2、修改ViewControler.m文件的扩展名,从m改为mm,即ViewControler.mm。这样做的目的是让编译器认识到代码中含有C++代码。(此文件名称将根据你建立的项目前缀名称不同而不同,但文件名称结尾都是ViewControler.m)。
3、添加以下类库到项目中
Accelerate
AssetsLibrary
AVFoundation
CoreGraphics
QuartzCore
Foundation
4、在扩展名为.pch文件中的#ifdef
__OBJC__前面添加以下代码:
#ifdef cplusplus
5、在ViewController.h中,除了在#import
下面,按原文教程添加using
cv;这个外,还要补充添加其他类库,最后的样子是:
using namespace cv;
关于types_c.h和imgproc.hpp,是我自行补丁上去的,原因如下:
在opencv2/imgproc/imgproc.hpp中,存在mm文件所需的cvtColor函数;
在opencv2/imgproc/types_c.h中,存在cvtColor函数里使用到的枚举变量CV_BGRA2BGR和CV_BGR2BGRA
6、修改ViewController.h的@interface,为其添加一个代理引用,修改后的样子是:
@interface
OCV249T02ViewController : UIViewController&&span
style="color:
#408389"&CvVideoCameraDelegate&
7、在ViewController.h中手动添加一个属性,一个方法:
@property(nonatomic, retain) CvVideoCamera*
-(IBAction)actionStart:(id)
8、在storyboard中添加一个Image
View,一个Round Rect Button
9、点击Xcode右上角的小人头标志,调出辅助编辑器,在其中打开ViewController.h。在StoryBorard中按住control键,点击Button按钮,将其拖放到ViewController.h中,在其中命名为button。同样按住control键,点击Button按钮,拖放到First
Responder上,选择刚刚在.h文件中创建的actionStart方法,event选择Touch up inside。
10、同第9条操作相同,为Image
View建立一个属性。全部建立完成的ViewController.h文件的样子如下:
using namespace cv;
@interface
OCV249T02ViewController : UIViewController&&span
style="color:
#408389"&CvVideoCameraDelegate&
@property(nonatomic, retain) CvVideoCamera*
@property (strong, nonatomic) IBOutlet UIImageView *imageV
@property (strong, nonatomic) IBOutlet UIButton *
-(IBAction)actionStart:(id)
11、在ViewController.mm文件中的@implementation
OCV249T02ViewController下面添加:
@synthesize videoCamera =
_videoCamera;
@synthesize imageView =
_imageView;
@synthesize button =
(void)viewDidLoad的[super
viewDidLoad]的下面添加:
self.videoCamera =
[[CvVideoCamera alloc]
initWithParentView:_imageView];
& self.videoCamera.delegate = self;
& self.videoCamera.defaultAVCaptureDevicePosition
= AVCaptureDevicePositionBack;
& self.videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset352x288;
& self.videoCamera.defaultAVCaptureVideoOrientation
= AVCaptureVideoOrientationPortrait;
& self.videoCamera.defaultFPS = 30;
& self.videoCamera.grayscaleMode = NO;
13、在ViewController.mm中添加actionStart的使用:
- (IBAction)actionStart:(id)sender {
[self.videoCamera start];
14、添加一个颜色反转函数。这个函数,我没有在上述代码中发现调用,但是其的确在程序中展示出效果来!Why
(补充:调用其定义,发现其在OpenCV库中会自动调用。)
- (void)processImage:(Mat&)
& // Do some OpenCV stuff with the
& & Mat image_
& & cvtColor(image, image_copy,CV_BGRA2BGR);&
& // CV_BGRA2BGR =
& // invert image
& & cv::bitwise_not(image_copy, image_copy);
& & cvtColor(image_copy, image, CV_BGR2BGRA);
15、最后ViewController.mm文件的样子:
//& OCV249T02ViewController.m
//& OCV249Tst02
//& Created by Raph on 13-9-23.
//& Copyright (c) 2013年
Raph. All rights reserved.
"OCV249T02ViewController.h"
@interface
OCV249T02ViewController ()
@implementation
OCV249T02ViewController
@synthesize videoCamera =
_videoCamera;
@synthesize imageView =
_imageView;
@synthesize button =
- (void)viewDidLoad
viewDidLoad];
// Do any additional setup after loading the view, typically from a
& self.videoCamera =
[[CvVideoCamera alloc]
initWithParentView:_imageView];
& self.videoCamera.delegate = self;
& self.videoCamera.defaultAVCaptureDevicePosition
= AVCaptureDevicePositionBack;
& self.videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset352x288;
& self.videoCamera.defaultAVCaptureVideoOrientation
= AVCaptureVideoOrientationPortrait;
& self.videoCamera.defaultFPS = 30;
& self.videoCamera.grayscaleMode = NO;
- (void)didReceiveMemoryWarning
didReceiveMemoryWarning];
& // Dispose of any resources that can be
recreated.
- (IBAction)actionStart:(id)sender {
[self.videoCamera start];
- (void)processImage:(Mat&)
& // Do some OpenCV stuff with the
& & Mat image_
& & cvtColor(image, image_copy,CV_BGRA2BGR);&
& // CV_BGRA2BGR =
& // invert image
& & cv::bitwise_not(image_copy, image_copy);
& & cvtColor(image_copy, image, CV_BGR2BGRA);
16、如果你是Apple
Developer会员,做到这里,可以运行了。
*******************************************
17、运行后,你会发现视频比例失真,此时请注意这行代码中预设的视频捕获比例:
& & self.videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset352x288;
你的imageView对象的宽高也要设置成这个比例,视频才不会失真。请在storyboard中选中imageView,并在Size
Inspector设置width=352 , height=288。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 opencv头文件包含 的文章

 

随机推荐