openCV-初體驗-馬賽克

場景: 傳入一張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);
      }
      
      
  • 調(diào)用函數(shù)

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

    • 打馬的范圍不是整張圖片,還需要最下優(yōu)化
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容