openCV-初体验-马赛克

场景: 传入一张UIImage 转出一张打有马赛克的UIImage

  • 导入framework

    • opencv2.framework
  • 写工具类

    • ImageUtills.h
        //核心头文件
        #import 
        //对iOS支持
        #import 
        
        //导入矩阵帮助类
        #import 
        #import 
      
        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 填充数据->原始数据
              Mat roi = mat_image_dst(mosaicRect);
              
              //让整个矩形区域颜色保持一致
              //mat_image_clone.at(i,j) ->像素点(颜色值组成->多个) ->ARGB数组
              Scalar scalar = Scalar(mat_image_clone.at(i,j)[0],
                                     mat_image_clone.at(i,j)[1],
                                     mat_image_clone.at(i,j)[2]);
              
              //讲处理好矩形区域->数据->拷贝到图片上去->修改后的数据 
              Mat roiCopy = Mat(mosaicRect.size(),CV_8UC3,scalar);
              roiCopy.copyTo(roi);
            }
        }
        // 第四步 将openCV图片 转化 iOS图片
        return MatToUIImage(mat_image_dst);
      }
      
      
  • 调用函数

     image = [ImageUtills opencvImage:self.image.image level:50];
    
  • 存在的问题

    • 打马的范围不是整张图片,还需要最下优化

你可能感兴趣的:(openCV-初体验-马赛克)