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/
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yNwQTMwkTYyYmZmF2N4ADMkJmM4gzM0QjZ3Q2MkZjYy8CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
- 環境配置
直接導入下載下傳好的代碼包
建立PrefixHeader.pch并在build Setting中配置
#ifndef PrefixHeader_pch
#define PrefixHeader_pch
#ifdef __cplusplus
#include "opencv2/opencv.hpp"
// include other opencv2 headers if needed.
#endif
#endif
- 建立圖檔處理工具類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
//導入openCV架構
//核心頭檔案
#import
//對iOS支援
#import
//導入矩形幫助類
#import
#import
//導入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(i,j) ->像素點(顔色值組成-》多個) ->ARGB ->數組
//mat_image_clone.at(i,j)[0] R值
//mat_image_clone.at(i,j)[1] G值
//mat_image_clone.at(i,j)[2] B值
Scalar scalar = Scalar(
mat_image_clone.at(i,j)[0],
mat_image_clone.at(i,j)[1],
mat_image_clone.at(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