iOS音視頻—OpenCV初體驗馬賽克的實現

To like someone is to run wild,but to love someone is to restrain.
喜歡就會放肆,但愛就會剋制。


什麼是OpenCV?

跨平臺圖像處理技術

1、跨平臺開源框架
2、C/C++、Java、Python、OC、Swift等
3、Window平臺、Mac平臺、iOS平臺、Android平臺
4、開源穩定-》1999年發佈1.0版本-》更新到了2018年,整整19年
5、支持模塊非常多(例如:機器學習、無人駕駛技術、人臉識別、人臉檢測、物體追蹤、圖像分割、圖像拼接、視頻處理技術等…)

馬賽克的實現原理

  • 下載OpenCV代碼包

https://opencv.org/

這裏寫圖片描述

  • 環境配置

直接導入下載好的代碼包

創建PrefixHeader.pch並在build Setting中配置

#ifndef PrefixHeader_pch
#define PrefixHeader_pch

#ifdef __cplusplus
#include "opencv2/opencv.hpp"
// include other opencv2 headers if needed.
#endif

#endif /* PrefixHeader_pch */
  • 創建圖片處理工具類ImageUtils

修改ImageUtils.m文件後綴名爲ImageUtils.mm適配C++代碼,不然後引發錯誤error core.hpp header must be compiled as C++

注意:以後在任何.m文件中使用OpenCV都需要修改後綴名爲.mm

這裏寫圖片描述

分析馬賽克算法原理

如下圖,圖片中的紅色方塊代表照片中的一個一個的像素,每個像素都有其所有的RGB值。我們對照片進行馬賽克(mosaics)處理,就是讓位於3*3矩形中的像素顏色都變化爲位於矩形中左上角的像素的顏色。

這裏寫圖片描述

代碼實現

ImageUtils.h

//
//  ImageUtils.h
//  OpenCV_Mosaics
//
//  Created by mac on 2018/9/10.
//  Copyright © 2018年 WT. All rights reserved.
//

#import <UIKit/UIKit.h>
//導入openCV框架
//核心頭文件
#import <opencv2/opencv.hpp>
//對iOS支持
#import <opencv2/imgcodecs/ios.h>
//導入矩形幫助類
#import <opencv2/highgui.hpp>
#import <opencv2/core/types.hpp>

//導入C++命名空間
using namespace cv;

@interface ImageUtils : NSObject

//定義方法:處理圖片
+(UIImage *)openCVImage:(UIImage *)image level:(int)level;

@end

ImageUtils.mm

//
//  ImageUtils.m
//  OpenCV_Mosaics
//
//  Created by mac on 2018/9/10.
//  Copyright © 2018年 WT. All rights reserved.
//

#import "ImageUtils.h"

@implementation ImageUtils

+(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);

    //克隆一張圖片 爲了不影響原始圖片
    Mat mat_image_clone = mat_image_dst.clone();
    //第三步:馬賽克處理
    //分析馬賽克算法原理
    //level => 3*3矩形
    //我們可以設置level 進行動態處理
    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 mosaicsRect = Rect2i(j,i,level,level);
            //原始數據:給Rect2i區域->填充數據
            Mat roi = mat_image_dst(mosaicsRect);

            //讓整個Rect2i區域顏色值保持一致
            //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 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]);
            //修改後的數據:將處理好的矩形區域->數據->拷貝到圖片上
            //CV_8UC3
            //CV_表示:框架的命名空間
            //8表示:每個顏色值是8位
            //U表示:有符號類型(sign -> 有正負 ->簡寫"S") -128->127、無符號類型(Unsign->只有正數 ->簡寫"U") 0->255
            //C表示:char類型
            //3表示:3個通道 RGB
            Mat roiCopy = Mat(mosaicsRect.size(),CV_8UC3,scalar);
            roiCopy.copyTo(roi);
        }
    }
    //第四步:將OpenCV格式圖片轉換爲iOS圖片格式
    return MatToUIImage(mat_image_dst);
}
@end

這裏寫圖片描述

https://github.com/Goddreamwt/iOS_AudioVideoProcessing

因爲gitHub無法上傳超過100M的文件,所以需要自己下載並導入OpenCV架包。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章