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代碼包
- 環境配置
直接導入下載好的代碼包
創建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架包。