大概介绍

OpenCV (Open Source Computer Vision Library) 是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。

OpenCV用C++和C语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python、Java and MATLAB的接口。如今也提供对于C#、Ch、Ruby,GO的支持。所以该库支持多种语言开发:如C,C++,Object_C,Swift, Windows, Android,Mac OS,Python,Java和 MATLAB等.所以通常用它来做算法的移植,并且OpenCV的代码经过适当改写可以正常的运行在DSP系统和ARM嵌入式系统中

Demo测试

本文主要基于iOS来阐述,测试使用这个框架去给一张图片添加马赛克,简单了解一下大概使用

1.首先得去官网下载它,然后倒入到项目中

opencv2.framework.png

2.先了解一下OpenCV的基本概念:

相信大家都知道:在C++和OC混编中报错,需要将 .m 文件 修改为 .mm 文件;

还有就是C++支持命名空间,所以需要导入C++的命名空间

using namespace cv;

Mat 矩阵 是OPenCV的基本数据结构

马赛克原理 大概其意思就是处理像素点,可以理解为把原先的一个一个像素点按照3 x 3 或者4 x 4划分成一个小方块,这个小方块的像素展示这个小方块最左上角的那个像素点的颜色来展示,这样平铺开来,比如原先展示10 x 10个像素点按照5x 5为一个方块展示,就只展示了4个像素点

(10 x 10) ÷ (5 x 5) = 4,

这样看起来肯定模糊,就是马赛克效果

马赛克原理.png

说那么费劲,看代码怎么实现吧

//自定义UIImageUtils,在UIImageUtils中导入OpenCV的头文件

//倒入OpenCV框架

//核心头文件

#import

//对iOS支持

#import

//导入矩阵帮助类

#import

#import

/*

* 自定义 UIImageUtils.m, 因为和OC混编,所以修改成 UIImageUtils.mm

参数image 是外界传递进来的源图片,就是需要对它进行马赛克处理

参数level 是处理的级别,这个值越小,马赛克就越密,颗粒感越弱.,就是上面马赛克原理说明所说的 5*5 中的 5, level = 5, 或者说上图画 level = 3

*/

+(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里面,有个隐藏的坑,那就是 OpenCV只能支持 处理 RGB,而图片是 ARGB的,则如果不进行图片类型转换是没有效果的

//图片ARGB的, 将ARGB->RGB

// cvtColor的三个参数: 第一个是源图片,第二个参数是目标图片,第三参数是 转换格式 2谐音to,意思是将RGBA转换成RGB的,第四个参数是通道个数,RBG 就是3个通道

Mat mat_image_dst;

cvtColor(mat_image_src, mat_image_dst, CV_RGBA2RGB, 3);

//研究OpenCV时候,如何发现巨坑?

//观察规律

//看到了OpenCV官方网站->每次进行图像处理时候,规律->每一次都会调用cvtColor保持一致(RGB)

//所以:每一次你在进行转换的时候,一定要记得转换类型

//为了不影响原始图片,将处理成RBG 3通道的Mat 进行复制一份

Mat mat_image_clone = mat_image_dst.clone();

//第三步:马赛克处理

//分析马赛克算法原理

//level = 3 -> 3 * 3矩形

//动态的处理

int x = width - level;

int y = height - level;

//双重for循环,一个小方块一个小方块处理

for (int i = 0; i < y; i += level) {

for (int j = 0; j < x; j += level) {

//创建一个矩形区域 (就是那个马赛克小方块)

Rect2i mosaicRect = Rect2i(j, i, level, level);

//给填Rect2i区域->填充数据->原始数据

Mat roi = mat_image_dst(mosaicRect);

//让整个矩形区域颜色值保持一致

//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表示:32位色->ARGB-> 8位 = 1字节 ->所以: 4个字节

//U分析

//两种类型:有符号类型(Sign->有正负->简写"S")、无符号类型(Unsign->正数->"U")

//无符号类型:0-255(通常情况)

//有符号类型:-128-127

//C分析:char类型

//3表示:3个通道->RGB

Mat roiCopy = Mat(mosaicRect.size(), CV_8UC3, scalar);

roiCopy.copyTo(roi);

}

}

//第四步:将OpenCV图片->iOS图片

return MatToUIImage(mat_image_dst);

}

最后看看level不同的效果吧:

等级为80,颗粒感强.png

等级为15,颗粒感弱.png

c语言给图片打码,OpenCV (一):初相识:马赛克处理图片相关推荐

  1. Swift与C++混编 OpenCV初体验 图片打码~

    OpenCV初体验,给图片打码 提到OpenCV,相信大多数人都听说过,应用领域非常广泛,使用C++开发,天生具有跨平台的优势,我们学习一次,就可以在各个平台使用,这个还是很具有诱惑力的. 本文主要记 ...

  2. JAVA 识别图片中二维码 opencv 识别精准

    JAVA 识别图片中二维码 opencv 识别精准 文章目录 JAVA 识别图片中二维码 opencv 识别精准 一.添加依赖 二.依赖配置 三.测试类 四.结果 提示:以下是本篇文章正文内容,下面案 ...

  3. OPENCV图片打码

    @ Fu Xianjun. All Rights Reserved. 这次是opencv的图片打码效果 例如下图,给阿熊打码 首先呢还是一样的,我们需要导入库,和读取图片,这是不管处理啥都必须的 ps ...

  4. C语言实现图片的放大缩小(附完整源码)

    C语言实现图片的放大缩小 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef unsig ...

  5. [2021]Linux下C语言qrencode二维码生成库的基本使用和ARM开发板移植

    文章目录 一.前言 二.准备所用到的环境以及版本信息 1.Ubuntu和内核版本 2.gcc和g++版本 3.交叉编译gcc和g++版本 4.开发板信息 三.开发环境编译&安装qrencode ...

  6. hbilderx 扫一扫_【报Bug】hbuilder 扫一扫从相册中选图的图片扫码识别不出来

    详细问题描述 (DCloud产品不会有明显的bug,所以你遇到的问题大都是在特定环境下才能重现的问题,请仔细描述你的环境和重现方式,否则DCloud很难排查解决你的问题) [内容] 调用扫一扫,从相册 ...

  7. Python&OpenCV自动人脸打马赛克&调色系统[源码&UI操作界面&部署教程]

    1.视频演示: [项目分享]Python&OpenCV自动人脸打马赛克&调色系统[源码&UI操作界面&部署教程] 2.图片演示: 3.图像颜色检索&替换: 4. ...

  8. c调用易语言串口,易语言串口API源码

    易语言串口API源码系统结构:ReadCommPure,BuildCommDCB,CreateFilea,关闭句柄a,SetCommState,ReadFileA,GetCommState,Write ...

  9. 字符串固定长度 易语言_易语言字符串操作源码

    易语言字符串操作源码 系统结构:字符串_取长度,字符串_取中间,字符串_取左边,字符串_取右边,字符串_替换,到宽字符,到多字节,取文本数据地址,取字节集数据地址,MultiByteToWideCha ...

最新文章

  1. list extend 和 append
  2. php文件的标准格式化,PHP获取文件大小并格式化的几种方法
  3. 优化拥有谓词or的子查询
  4. 错误 2 error C2059: 语法错误:“::”
  5. Python如何导入自己编写的py文件
  6. java 与 乱码问题_透彻分析和解决一切javaWeb项目乱码问题
  7. C++中比较两个浮点数是否相等
  8. 强化学习中的各类算法
  9. OFD格式及OFD阅读器
  10. 别了,AlphaGo之魂——黄士杰
  11. 在虚幻引擎5中构建你的首款游戏 - 10[完] - 特效音效镜头震动打包
  12. 【程序包uti1不存在怎么办?】求解答
  13. 【采样算法】拉丁超立方采样
  14. 一种基于加密域的数字图像水印算法的设计与实现(附Matlab源码)
  15. 腾讯云「轻量应用服务器」开放公测!
  16. 2021年研究生入学考试总结和复试冲刺复习计划
  17. 关于我转行嵌入式的那些事
  18. HTML5期末大作业:美妆网页主题网站设计——清新的手工肥皂网站展示(4页)HTML+CSS+JavaScript
  19. 软件生命周期管理系统ALM配置说明(二)
  20. 由JVM深入了解Java的线程安全与锁优化

热门文章

  1. Qt5操作Excel操作的一些心得
  2. linux下批量修改前缀,Linux 中批量修改后缀名
  3. TT 的美梦(SPFA)
  4. 2021-09-13 备份
  5. 信息学奥赛一本通 1273:【例9.17】货币系统
  6. Git Clone时报错解决方法
  7. C语言,有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中
  8. Python 练习实例100-39,有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
  9. FX5U 结构体编程
  10. android 屏幕比例,16:10还是4:3?纵论安卓平板最佳屏幕比例