Open CV 学习开发笔记之图像的输入、输出(二)
来源:互联网 发布:国外视频软件 编辑:程序博客网 时间:2024/06/05 03:17
图像的表示
日常开发中,我们可以看到各种各样的美丽图像,但是在计算机看来,这幅图像只是一堆亮度各异的点。例如:一副尺寸为M×N的图像可以用一个M×N的矩阵来表示,矩阵元素的值表示这个位置上的像素的亮度,一般来说像素值越大表示该点越亮。
一般来说,灰度图用2维矩阵表示:
灰度图像的存储示意图
lij 表示第i行j列的像素值
彩色(多通道)图像用3维矩阵表示,目前大部分设备都是用无符号8位整数(类型为 CV_8U)表示像素亮度。
多通道图像,比如RGB图像,则每个像素用三个字节表示,RGB图像的通道顺序为BGR。存储示意图如下:
图像的显示
构建Mat对象,创建图像
/* 创建一个行数为320,列数为480,图像元素是8位无符号整数类型,且有三个通道。图像的初始值为(255,0,0) 图像的实际尺寸为宽480 高320 */ cvImage = Mat(320, 480, CV_8UC3,Scalar(255, 0, 0)); UIImage * tmpImage = MatToUIImage(cvImage); self.imageV.image = tmpImage; [self.view addSubview:self.imageV];
- Mat::Mat() 无参数构造方法
- Mat::Mat(int rows,int cols,int type) 创建行数为rows,列数为cols,类型为type的图像
- Mat::Mat(Size size,int type) 创建大小为size ,类型为type的图像。
- Mat::Mat(int rows,int cols, int type, const Scalar &s) 创建行数为rows,列数为cols,类型为type的图像,并将所有的元素值初始化为s.
备注:在这些构造函数中,很多设计到类型type. type可以是CV_8UC1、CV_16SC1,…CV_64FC4等。里面的8U表示8位无符号整数,16S表示16位有符号整数,64F表示浮点数。C后面跟的数字表示是通道数,例如C1表示一个通道的图像,C4表示的4个通道的图像,一次类推。
如果你需要更多的通道数,可以用上宏CV_8UC(n). n为整数。
图片的读取,以及显示
UIImage* image = [UIImage imageNamed:@"lena.png"]; UIImageToMat(image, cvImage); UIImage * tmpImage = MatToUIImage(cvImage); self.imageV.image = tmpImage; [self.view addSubview:self.imageV];
效果如下:
其他读取方式:
UIImage* image = [UIImage imageNamed:@"lena.png"]; NSData* data = UIImagePNGRepresentation(image); /* InputArray buf :输入图像 int flags flags > 0 该函数返回3通道图像,如果磁盘上的图像文件时单通道的灰度图像,则会被强制转为3通道 flags = 0 该函数返回单通道图像,如果磁盘的图像文件时多通道图像,则会被强制转换为单通道 flags < 0 该函数下不对图像进行通道转换 CV_LOAD_IMAGE_UNCHANGED,这个标识在新版本中被废置了,可以忽略。 CV_LOAD_IMAGE_ANYDEPTH , 如果取这个标识的话,若载入的图像的深度为16位或者32位,就返回对应深度的图像,否则,就转换为8位图像再返回 CV_LOAD_IMAGE_COLOR, 如果取这个标识的话,总是转换图像到彩色一体 CV_LOAD_IMAGE_GRAYSCALE, 如果取这个标识的话,始终将图像转换成灰度1 如果输入有冲突的标志,将采用较小的数字值。比如CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYCOLOR 将载入3通道图。 如果想要载入最真实的图像,选择CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR。 输出的图像默认情况下是不载入Alpha通道进来的。如果我们需要载入Alpha通道的话呢,这里就需要取负值。 */ cvImage = cv::imdecode(Mat(1, [data length], CV_8UC1,(void*)data.bytes),CV_LOAD_IMAGE_UNCHANGED); UIImage * tmpImage = MatToUIImage(cvImage); self.imageV.image = tmpImage; [self.view addSubview:self.imageV];
图像的输出
引用示例
UIImage* image = [UIImage imageNamed:@"lena.png"]; UIImageToMat(image, cvImage); UIImage * tmpImage = MatToUIImage(cvImage); self.imageV.image = tmpImage; //图像的输出 BOOL isSussess = imwrite("/Users/BruceLv/Desktop/demo/lena.png", cvImage); [self.view addSubview:self.imageV];
/* filename: 文件的格式由filename参数指定的文件的扩展名。推荐使用png文件格式。 bmp格式是无损格式,但是一般不进行压缩,文件尺寸非常大。 jpeg格式的文件较小,但是属于有损压缩,会丢失一些信息。png是无损压缩,推荐使用。 image 输入图像 params 可以指定文件格式的一些信息。 这个参数的数值跟文件的格式有关系。 jpeg:表示图像的质量。取值范围是0-100.数值越大表示图像的质量越高,当然文件也就越大。默认是95 png 表示压缩的级别 取值范围是0-9 数值越大表示的文件就越小,但是花费的压缩的时间就越长 默认是3 ppm pgm pbm 表示文件是以二进制还是纯文本方式存储,取值为0或1.如果取值为1,则表示以二进制方式存储。默认值是1. 并不是所有的Mat对象都可以存储为图像文件,目前支持的格式只有8U类型的单通道和3通道矩阵。如果需要保存16U格式图像,只能使用png jpeg tiff格式。如果希望其他的格式可以保存为图像文件,可以先用Mat::convertTo()函数或者是cvtColor函数将矩阵转换为可以保存的格式 */bool imwrite( const String& filename, InputArray img, const std::vector<int>& params = std::vector<int>());
阅读全文
0 0
- Open CV 学习开发笔记之图像的输入、输出(二)
- Open CV 学习开发笔记之概述(一)
- Open CV 学习笔记: 初级图像混合
- Open CV 学习笔记: 形态学图像处理
- Open CV 学习开发笔记之ROI(Region Of Interest)感兴趣区域(三)
- Open CV 学习笔记:多通道图像混合
- Open CV学习记录(二)——图像翻转、锐化、亮度和对比度
- Open CV学习记录(二十二)—图像处理基本知识
- Open CV 学习笔记:访问图像中像素的几种方法
- Open CV学习记录(六)——图像的翻转
- Open CV学习记录(二十)—Mat的运算和Rect
- Open CV学习记录(二十一)—鼠标回调函数的使用
- Open CV 学习笔记:鼠标操作(回调函数)
- 《C++ primer plus》第十七章 输入、输出和文件(二):文件的输入和输出 学习笔记
- Open CV 学习笔记:基本图形绘制
- Open CV 学习笔记: 边缘检测
- CV-openCV学习笔记二
- MapReduce学习笔记之输入(二)
- 腾讯内推面试基本情况
- 排列组合 概率 贝叶斯理解
- Linux系统下脚本对虚拟机的安装重置
- 算法学习系列2.1
- Linux 下的mysql安装配置
- Open CV 学习开发笔记之图像的输入、输出(二)
- vscode列选择 快速选择
- 数据库中Select For update语句的解析
- 聊聊Linux fork多进程并发服务器模型
- 跨域解决方案
- OpenSL ES
- python学习记录(三)
- 记正式踏入软件行业的第一天
- 布隆过滤器(Bloom Filter)原理以及应用