#import <opencv2/opencv.hpp>
2.导入视频同时导入命名空间
#import <opencv2/video/cap_ios.h>
需要注意:
openCV采用的是C++开发,所以我们使用的时候,需要在使用该文件的.m文件改成.mm后缀名!
UIImageView是用来呈现图像的,我们再拖入1个UIButton,用来切换原图像和灰度图像!将UIImageView拖成属性,Button拖为方法!
接下来我们需要将CvVideoCamera类设为全局属性
//4,使用opencv需要导入系统库:
opencv2
Accelerate
AssetsLibrary
AVFoundation
CoreGraphics
CoreImage
CoreMedia
CoreVideo
QuartzCore
UIKit
Foundatio
//相机(opencv视频处理框架类,相机或视频都可以进行处理)
@property(nonatomic,strong)CvVideoCamera * videoCamera;
我们在ViewDidLoad初始化图像处理的类
// 参数:initWithParentView:指定相机预览画面
self.videoCamera = [[CvVideoCameraalloc]initWithParentView:self.imageView];
//指定摄像机的摄像头方向(后置和前置)
self.videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionBack;
//指定图像大小
self.videoCamera.defaultAVCaptureSessionPreset =AVCaptureSessionPreset1280x720;
//设置相机方向
self.videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait;
// 设置defaultFPS设置为摄像机的FPS,如果处理少于预期的FPS,帧被自动丢弃。
self.videoCamera.defaultFPS =30;
// 属性grayscale=YES使用不同的颜色空间,即 “YUV (YpCbCr 4:2:0)”,而grayscale=NO将输出32位BGRA。
self.videoCamera.grayscaleMode =NO;
1。首先需要添加帧回调监听(添加delegate)需要遵循协议<CvVideoCameraDelegate>
2.当我们在预览相机的时候,会实时回调delegate,然后客户端进行帧处理,
self.videoCamera.delegate=self;
官网文档是建立一个打开相机的按钮,点击按钮开启相机!起初我是在ViewDidLoad里将CvVideoCamera初始化完毕后,就开启相机,但是出现了一个问题,就是我无论怎么设置相机方向,图像显示的都是不对的!如图:
只有这一点与文档不同,我猜测是view加载时机问题导致,所以我在ViewDidAppear里开始了摄像头,完美解决!
我们为了实现切换原图与灰度的切换,设置一个全局的BOOL 值,isGray;
- (IBAction)grayBtn:(id)sender {
self.isGray = !isGary;
}
实现代理,
//当我们相机在预览的时候,或者在视频播放的时候实时回调方法
-(void)processImage:(cv::Mat &)image{
if(!self.isGray){
/*是一个矩阵,是一种数据结构 理解为图片就可以了*/
cv::Mat image_copy;
/*
参数:原图
2 矩阵
3 转换类型COLOR_BGR2GRAY
*/
//将RGB-GRay
cvtColor(image, image_copy, cv::COLOR_BGR2GRAY);
//图片反转(会将黑色的像素点转成黑色,黑色显示成白色)
bitwise_not(image_copy, image_copy);
cv::Mat bgr;
//原图为3原色(3个通道)转成4个通道
//转换过程 gray-> RGB -> ARGB
//原来RGB->ARGB
cvtColor(image_copy, bgr, cv::COLOR_GRAY2BGR);
//从新给我们的原始图片设置数据
//将我们修改后的帧画面,显示在预览图片
//将Gray->RGB
cvtColor(bgr, image, cv::COLOR_BGR2BGRA);
}
}
将报错的代码 :enum { NO, GAIN, GAIN_BLOCKS };
改成: enum { CNO, GAIN, GAIN_BLOCKS };
因为系统存在NO,不允许
出现的2个错误都是因为这个问题
我们需要真机运行,真机运行证书,具体操作大家应该都懂,还有就是相机需要设置全选,否则会崩溃,这些设置都知道,不知道根据报错去设置就可以了!
接下来我们看效果就可以了!
先看原图:
灰度图片:(代理里面有个图片反转的,我先看没有把图片反转的代码注释的效果)正好我家“灯泡”可以完美阐释
灰度图片:注释掉图片反转的代码
这两张灰度图片的区别显而易见!不过多解释( bitwise_not(image_copy, image_copy);这句代码的作用)!
简单的视频灰度处理就完成了!后续会持续更新!
如有错误,欢迎指正,共同学习
本人QQ:353634026
demo的代码比较简单就不传了!后续封装一个简单的视频处理工具类再上传代码!