iOS音视频—OpenCV初体验马赛克的实现

To like someone is to run wild,but to love someone is to restrain.
喜欢就会放肆,但爱就会克制。


什么是OpenCV?

跨平台图像处理技术

1、跨平台开源框架
2、C/C++、Java、Python、OC、Swift等
3、Window平台、Mac平台、iOS平台、Android平台
4、开源稳定-》1999年发布1.0版本-》更新到了2018年,整整19年
5、支持模块非常多(例如:机器学习、无人驾驶技术、人脸识别、人脸检测、物体追踪、图像分割、图像拼接、视频处理技术等…)

马赛克的实现原理

  • 下载OpenCV代码包

https://opencv.org/

iOS音视频—OpenCV初体验马赛克的实现_第1张图片

  • 环境配置

直接导入下载好的代码包

创建PrefixHeader.pch并在build Setting中配置

#ifndef PrefixHeader_pch
#define PrefixHeader_pch

#ifdef __cplusplus
#include "opencv2/opencv.hpp"
// include other opencv2 headers if needed.
#endif

#endif /* PrefixHeader_pch */
  • 创建图片处理工具类ImageUtils

修改ImageUtils.m文件后缀名为ImageUtils.mm适配C++代码,不然后引发错误error core.hpp header must be compiled as C++

注意:以后在任何.m文件中使用OpenCV都需要修改后缀名为.mm

iOS音视频—OpenCV初体验马赛克的实现_第2张图片

分析马赛克算法原理

如下图,图片中的红色方块代表照片中的一个一个的像素,每个像素都有其所有的RGB值。我们对照片进行马赛克(mosaics)处理,就是让位于3*3矩形中的像素颜色都变化为位于矩形中左上角的像素的颜色。

iOS音视频—OpenCV初体验马赛克的实现_第3张图片

代码实现

ImageUtils.h

//
//  ImageUtils.h
//  OpenCV_Mosaics
//
//  Created by mac on 2018/9/10.
//  Copyright © 2018年 WT. All rights reserved.
//

#import 
//导入openCV框架
//核心头文件
#import 
//对iOS支持
#import 
//导入矩形帮助类
#import 
#import 

//导入C++命名空间
using namespace cv;

@interface ImageUtils : NSObject

//定义方法:处理图片
+(UIImage *)openCVImage:(UIImage *)image level:(int)level;

@end

ImageUtils.mm

//
//  ImageUtils.m
//  OpenCV_Mosaics
//
//  Created by mac on 2018/9/10.
//  Copyright © 2018年 WT. All rights reserved.
//

#import "ImageUtils.h"

@implementation ImageUtils

+(UIImage *)openCVImage:(UIImage *)image level:(int)level{
    //实现功能
    //第一步:将iOS图片转换为openCV图片(Mat矩阵)
    Mat mat_image_src;
    UIImageToMat(image, mat_image_src);

    //第二步:确定宽高
    int width = mat_image_src.cols;
    int height = mat_image_src.rows;


    //图片类型->进行转换
    //在OpenCV里面
    //坑隐藏
    //支持->RGB处理
    //图片ARGB
    //将ARGB转换为RGB
    Mat mat_image_dst;
    cvtColor(mat_image_src,mat_image_dst,CV_RGBA2RGB,3);

    //克隆一张图片 为了不影响原始图片
    Mat mat_image_clone = mat_image_dst.clone();
    //第三步:马赛克处理
    //分析马赛克算法原理
    //level => 3*3矩形
    //我们可以设置level 进行动态处理
    int x= width - level;
    int y = height - level;

    //一个矩形一个矩形去处理
    for (int i = 0; i < y; i += level) {
        for (int j = 0; j < x; j += level) {
            //创建矩形区域
            Rect2i mosaicsRect = Rect2i(j,i,level,level);
            //原始数据:给Rect2i区域->填充数据
            Mat roi = mat_image_dst(mosaicsRect);

            //让整个Rect2i区域颜色值保持一致
            //mat_image_clone.at(i,j) ->像素点(颜色值组成-》多个) ->ARGB ->数组
            //mat_image_clone.at(i,j)[0] R值
            //mat_image_clone.at(i,j)[1] G值
            //mat_image_clone.at(i,j)[2] B值
            Scalar scalar = Scalar(
                   mat_image_clone.at(i,j)[0],
                   mat_image_clone.at(i,j)[1],
                   mat_image_clone.at(i,j)[2]);
            //修改后的数据:将处理好的矩形区域->数据->拷贝到图片上
            //CV_8UC3
            //CV_表示:框架的命名空间
            //8表示:每个颜色值是8位
            //U表示:有符号类型(sign -> 有正负 ->简写"S") -128->127、无符号类型(Unsign->只有正数 ->简写"U") 0->255
            //C表示:char类型
            //3表示:3个通道 RGB
            Mat roiCopy = Mat(mosaicsRect.size(),CV_8UC3,scalar);
            roiCopy.copyTo(roi);
        }
    }
    //第四步:将OpenCV格式图片转换为iOS图片格式
    return MatToUIImage(mat_image_dst);
}
@end

iOS音视频—OpenCV初体验马赛克的实现_第4张图片

https://github.com/Goddreamwt/iOS_AudioVideoProcessing

因为gitHub无法上传超过100M的文件,所以需要自己下载并导入OpenCV架包。

你可能感兴趣的:(iOS音视频)