#import "ViewController.h"
#import <opencv2/opencv.hpp>
#import <opencv2/imgproc/types_c.h>
#import <opencv2/highgui/ios.h>
#import <opencv2/highgui/cap_ios.h>
@interface ViewController ()<CvVideoCameraDelegate>
{
cv::Mat cvImage;
cv::CascadeClassifier faceDetector;
}
@property (strong, nonatomic) UIImageView *imageView;
@property (nonatomic,strong) CvVideoCamera*videoCamera;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.imageView = [[UIImageViewalloc]initWithFrame:self.view.frame];
self.videoCamera = [[CvVideoCamera alloc]initWithParentView:self.imageView];
self.videoCamera.delegate = self;
self.videoCamera.defaultAVCaptureDevicePosition =AVCaptureDevicePositionBack;
self.videoCamera.defaultAVCaptureSessionPreset =AVCaptureSessionPreset640x480;
self.videoCamera.defaultFPS = 30;
[self.view addSubview:self.imageView];
UIButton *btn = [[UIButtonalloc]initWithFrame:CGRectMake(10, 50, 100, 100)];
[btn addTarget:self action:@selector(start)forControlEvents:UIControlEventTouchUpInside];
[btn setBackgroundColor:[UIColor redColor]];
[self.view addSubview:btn];
}
- (void)start{
[self.videoCamera start];
}
- (void)processImage:(cv::Mat &)image
{
cv::Mat gray;
// 将图像转换为灰度显示
cv::cvtColor(image, gray, CV_RGBA2GRAY);
// 应用高斯滤波器去除小的边缘
cv::GaussianBlur(gray, gray, cv::Size(5,5),1.2,1.2);
//计算与画布边缘
cv::Mat edges;
cv::Canny(gray, edges, 0, 50);
//使用白色填充
image.setTo(cv::Scalar::all(255));
// 修改边缘颜色
image.setTo(cv::Scalar(0,128,255,255),edges);
// 将Mat转换为Xcode的UIImageView显示
self.imageView.image = MatToUIImage(image);
}
直接上代码,用到了类CvVideoCamera,这个类可以调用设备摄像头,在viewDidLoad中创建这个类,并将其view指向imageView.这样镜头返回的每一帧都会转成image对象,设置代理为控制器本身,设置镜头为后置摄像头,创建了一个按钮,点击按钮开启摄像头,可以实现每一帧的检测,这样我们就完成了用opencv对于设备摄像头的使用,代理中的每一句代码都有注释。