場景: 傳入一張UIImage 轉(zhuǎn)出一張打有馬賽克的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圖片 轉(zhuǎn)化 openCV圖片(Mat矩陣) Mat mat_image_src; UIImageToMat(image, mat_image_src); //第二步:確定寬高 int width = mat_image_src.cols; int height = mat_image_src.rows; //圖片類型->進行轉(zhuǎn)換 ->將ARGB轉(zhuǎn)化成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 矩陣 //動態(tài)處理 int x = width - level; int y = height - level; for (int i=0; i<y; i+= level) { for (int j=0; j<x; j+= level) { //創(chuàng)建一個矩形區(qū)域 Rect2i mosaicRect = Rect2i(j,i,level,level); //給Rect2i區(qū)域 -> 填充數(shù)據(jù)->原始數(shù)據(jù) Mat roi = mat_image_dst(mosaicRect); //讓整個矩形區(qū)域顏色保持一致 //mat_image_clone.at<Vec3b>(i,j) ->像素點(顏色值組成->多個) ->ARGB數(shù)組 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]); //講處理好矩形區(qū)域->數(shù)據(jù)->拷貝到圖片上去->修改后的數(shù)據(jù) Mat roiCopy = Mat(mosaicRect.size(),CV_8UC3,scalar); roiCopy.copyTo(roi); } } // 第四步 將openCV圖片 轉(zhuǎn)化 iOS圖片 return MatToUIImage(mat_image_dst); }
- ImageUtills.h
-
調(diào)用函數(shù)
image = [ImageUtills opencvImage:self.image.image level:50];
-
存在的問題
- 打馬的范圍不是整張圖片,還需要最下優(yōu)化