c++ opencv mat_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/

2b6d3d7f443882bd0087afff2a901407.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 /* PrefixHeader_pch */

  • 创建图片处理工具类ImageUtils

修改ImageUtils.m文件后缀名为ImageUtils.mm适配C++代码,不然后引发错误error core.hpp header must be compiled as C++

注意:以后在任何.m文件中使用OpenCV都需要修改后缀名为.mm

39d25837c12de21cc991db06da06d018.png

分析马赛克算法原理

如下图,图片中的红色方块代表照片中的一个一个的像素,每个像素都有其所有的RGB值。我们对照片进行马赛克(mosaics)处理,就是让位于3*3矩形中的像素颜色都变化为位于矩形中左上角的像素的颜色。

738b9fc0fb84a6a9231d6f3566e18ab6.png

代码实现

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

4a552b08a6415237b271a028cfef3ae5.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值