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 <opencv2/opencv.hpp>

2.导入视频同时导入命名空间

 #import <opencv2/video/cap_ios.h>



需要注意:

openCV采用的是C++开发,所以我们使用的时候,需要在使用该文件的.m文件改成.mm后缀名!


准备工作完毕开始正文,我们就按照官网文档来操作,在storyboard里我们拖入 UIImageView 控件,设置约束,这个

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将输出32BGRA

    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的代码比较简单就不传了!后续封装一个简单的视频处理工具类再上传代码!









  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值