天天看點

c++ opencv mat_iOS音視訊—OpenCV初體驗馬賽克的實作什麼是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/

c++ opencv mat_iOS音視訊—OpenCV初體驗馬賽克的實作什麼是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

  • 建立圖檔處理工具類ImageUtils

修改ImageUtils.m檔案字尾名為ImageUtils.mm适配C++代碼,不然後引發錯誤error core.hpp header must be compiled as C++

注意:以後在任何.m檔案中使用OpenCV都需要修改字尾名為.mm

c++ opencv mat_iOS音視訊—OpenCV初體驗馬賽克的實作什麼是OpenCV?馬賽克的實作原理代碼實作

分析馬賽克算法原理

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

c++ opencv mat_iOS音視訊—OpenCV初體驗馬賽克的實作什麼是OpenCV?馬賽克的實作原理代碼實作

代碼實作

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

c++ opencv mat_iOS音視訊—OpenCV初體驗馬賽克的實作什麼是OpenCV?馬賽克的實作原理代碼實作

繼續閱讀