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/
- 环境配置
直接导入下载好的代码包
创建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
分析马赛克算法原理
如下图,图片中的红色方块代表照片中的一个一个的像素,每个像素都有其所有的RGB值。我们对照片进行马赛克(mosaics)处理,就是让位于3*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