场景: 传入一张UIImage 转出一张打有马赛克的UIImage
-
导入framework
- opencv2.framework
-
写工具类
- ImageUtills.h
//核心头文件 #import <opencv2/opencv.hpp> //对iOS支持 #import <opencv2/imgcodecs/ios.h> //导入矩阵帮助类 #import <opencv2/highgui.hpp> #import <opencv2/core/types.hpp> using namespace cv; @interface ImageUtills : NSObject + (UIImage *)opencvImage:(UIImage *)image level:(int)level; @end
- ImageUtills.mm
+ (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; //图片类型->进行转换 ->将ARGB转化成RBG 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 * 3 矩阵 //动态处理 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 mosaicRect = Rect2i(j,i,level,level); //给Rect2i区域 -> 填充数据->原始数据 Mat roi = mat_image_dst(mosaicRect); //让整个矩形区域颜色保持一致 //mat_image_clone.at<Vec3b>(i,j) ->像素点(颜色值组成->多个) ->ARGB数组 Scalar scalar = Scalar(mat_image_clone.at<Vec3b>(i,j)[0], mat_image_clone.at<Vec3b>(i,j)[1], mat_image_clone.at<Vec3b>(i,j)[2]); //讲处理好矩形区域->数据->拷贝到图片上去->修改后的数据 Mat roiCopy = Mat(mosaicRect.size(),CV_8UC3,scalar); roiCopy.copyTo(roi); } } // 第四步 将openCV图片 转化 iOS图片 return MatToUIImage(mat_image_dst); }
- ImageUtills.h
-
调用函数
image = [ImageUtills opencvImage:self.image.image level:50];
-
存在的问题
- 打马的范围不是整张图片,还需要最下优化