iOS OpenCV 相机灰度处理
什么是OpenCV? 百度百科的答案: OpenCV的 全称 是:Open Source Computer Vision Library。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类 构成 ,同时提供了Python、Ruby、MATLAB等语言的接口,实现了 图像处理 和计算机视觉方面的很多通用算法。 OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言 接口 。该库也有大量的Python, Java and MATLAB/OCTAVE (版本2.5)的接口。这些语言的API接口函数可以通过在线 文档 获得。如今也提供对于C#,Ch, Ruby的支持。 所有新的开发和算法都是用C++接口。一个使用CUDA的GPU接口也于2010年9月开始实现。 那么OpenCV的应用领域是什么? 1、人机互动 2、物体识别 3、 图像分割 4、 人脸识别 5、动作识别 6、 运动跟踪 7、机器人 8、运动分析 9、机器视觉 10、结构分析 11、汽车安全驾驶
本文主要说明iOS使用OpenCV对视频的进行灰度处理: 1.我们先新建一个工程 2.下载开发包,并导入到工程中,下载地址:https://nchc.dl.sourceforge.net/project/opencvlibrary/opencv-ios/3.2.0/opencv-3.2.0-ios-framework.zip!(2016.12更新)
现在我们开始写代码 1.首先我们需要引入头文件
#import
2.导入视频同时导入命名空间
#import
需要注意:
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);
}
}
一切准备就绪,运行工程,出现了2个错误,可以定位到错误代码!解决方案:
将报错的代码 :enum { NO, GAIN, GAIN_BLOCKS };
改成: enum { CNO, GAIN, GAIN_BLOCKS };
因为系统存在NO,不允许
出现的2个错误都是因为这个问题
我们需要真机运行,真机运行证书,具体操作大家应该都懂,还有就是相机需要设置全选,否则会崩溃,这些设置都知道,不知道根据报错去设置就可以了!
接下来我们看效果就可以了!
先看原图:
灰度图片:(代理里面有个图片反转的,我先看没有把图片反转的代码注释的效果)正好我家“灯泡”可以完美阐释
灰度图片:注释掉图片反转的代码
这两张灰度图片的区别显而易见!不过多解释( bitwise_not(image_copy, image_copy);这句代码的作用)!
简单的视频灰度处理就完成了!后续会持续更新!
如有错误,欢迎指正,共同学习
本人QQ:353634026
demo的代码比较简单就不传了!后续封装一个简单的视频处理工具类再上传代码!
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
