利用OpenCV处理图片-马赛克效果

第一步:下载SDK
下载地址:https://opencv.org
第二步:导入框架-直接拖入工程即可
第三步导入头文件

//导入OpenCV框架
//核心头文件
#import <opencv2/opencv.hpp>
//对iOS的支持
#import <opencv2/imgcodecs/ios.h>
//导入矩阵帮助类
#import <opencv2/highgui.hpp>
#import <opencv2/core/types.hpp>

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

第四步:创建方法:

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

第五步:实现方法

+(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);
    //OpenCV官方->每次进行图像处理的时候,规律->每次都会调用cvtColor保持一致(RGB)
    //所以每一次进行转换的时候,一定要记得转换类型

    //为了不影响原始的图片
    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数组
              mat_image_clone.at<Vec3b>(i,j)[0]  ->R值
              mat_image_clone.at<Vec3b>(i,j)[1]  ->G值
              mat_image_clone.at<Vec3b>(i,j)[2]  ->B值
             */
            Scalar scaler = 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]
            );
            /*
             将处理好的矩形区域->数据->拷贝到上面去->修改后的数据
             CV_8UC3:
             CV:表示框架命名空间
             8表示:32位色->ARGB->8位 = 1字节
             U分析:两种类型(Sign->有正负->简写S),无符号类型(Unsign,正数 ,U)
             无符号类型:0-255
             有符号类型:-128-127
             C分析:char类型
             3表示:3个通道->RGB
             */
            Mat roiCopy = Mat(mosaicRect.size(),CV_8UC3,scaler);
            roiCopy.copyTo(roi);
        }
    }
    //第四步:将OpenCv图片->iOS图片
    return MatToUIImage(mat_image_dst);
}

第七步:把.m文件修改为.mm
第八步:运行效果

这里写图片描述

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_33323291/article/details/80118295