OpenCV 学习日记(三)--- 常见数据类型

OpenCV基本数据类型:

CvPoint,这些结构中最简单的一个,包含两个整型变量x和y。

CvPoint还有两个兄弟:CvPoint2D32f 和 CvPoint3D32f。

前者包含两个相同的变量x和y,它们都是浮点型的;后者包含第三个浮点型变量z。

CvSize,含有两个整型变量width 和 height。如果需要浮点型的数据,使用CvSize的近亲CvSize2D32f。

CvRect,派生于CvPoint 和 CvSize,它含有4个变量:x、y、width、height。

CvScalar,包含一组4个双精度浮点型数。当内存空间不成问题时,CvScalar通常有来表示1、2或3个浮点型数(这种情况下其它不需要的部分被简单的忽略)。CvScalar只有一个变量val,它是一个包含4个双精度浮点型数的指针。 所有这些数据类型都有一个类似cvSize()的构造方法,通常这些构造方法和类型名相同,但是它的第一个字母不是大写的。

cvScalar(…)接受1、2、3或4个参数,并把它们赋值给相应的元素,cvScalarAll(double)接受一个参数,把所有val[]中4个数都赋相同的值,cvRealScalar(double)把val[0]赋值,其它三个统一赋零值。

如果你想在图像中(5, 10)点和(20, 30)点之间画一个白色的矩形,你只需简单的调用:cvRectangle(myImg, cvPoint(5, 10), cvPoint(20, 30), cvScalar(255, 255, 255));

图像的像素(pixel):

从定义上来看,像素是指基本原色素及其灰度的基本编码。[1]  像素是构成数码影像的基本单元,通常以像素每英寸PPI(pixels per inch)为单位来表示影像分辨率的大小。 例如300x300PPI分辨率,即表示水平方向与垂直方向上每英寸长度上的像素数都是300,也可表示为一平方英寸内有9万(300x300)像素。

图像的深度(depth): 

图片是由一个个像素点构成的,所有不同颜色的像素点构成了一副完整的图像,计算机存储图片是以二进制来进行的。 

1 bit : 用一位来存储,那么这个像素点的取值范围就是0或者1,那么我们看来这幅图片要么是黑色要么是白色。 

4 bit : 取值范围为 0 到 2 的4次方 

8 bit : 来存储像素点的取值范围为 0 到 2 的8次方   

 以此类推,我们把计算机存储单个像素点所用到的bit为称之为图像的深度.

图像的通道(channel):

Color digital images are made ofpixels, and pixels are made of combinations of primary colors represented by aseries of code. A channel in this context is the grayscale image of the samesize as a color image, made of just one of these primary colors. For instance,an image from a standard digital camera will have a red, green and bluechannel. A grayscale image has just one channel.----Wikipedia

⑴复合通道(Compound Channel)  复合通道不包含任何信息,实际上它只是同时预览并编辑所有颜色通道的一个快捷方式。它通常被用来在单独编辑完一个或多个颜色通道后使通道面板返回到它的默认状态。对于不同模式的图象,其通道的数量是不一样的。在photoshop之中,通道涉及三个模式。对于一个RGB图象,有RGB、R、G、B四个通道;对于一个CMYK 图象,有CMYK、C、M、Y、K五个通道;对于一个Lab模式的图象,有Lab、L、a、b四个通道。 

 ⑵ 颜色通道(ColorChannel)  当你在photoshop中编辑图象时,实际上就是在编辑颜色通道。这些通道把图象分解成一个或多个色彩成分,图象的模式决定了颜色通道的数量,RGB模式有3个颜色通道,CMYK图象有4个颜色通道,灰度图只有一个颜色通道,它们包含了所有将被打印或显示的颜色。 

 ⑶ 专色通道(SpotChannel)  专色通道是一种特殊的颜色通道,它可以使用除了青色、洋红(有人叫品红)、黄色、黑色以外的颜色来绘制图象。因为专色通道一般人用的较少且多与打印相关,所以我把它放在后面的内容中讲述。 

 ⑷ Alpha通道(Alpha Channel)  Alpha 通道是计算机图形学中的术语,指的是特别的通道。有时,它特指透明信息,但通常的意思是“非彩色”通道。这是我们真正需要了解的通道,可以说我们在 photoshop中制作出的各种特殊效果都离不开Alpha通道,它最基本的用处在于保存选取范围,并不会影响图象的显示和印刷效果。当图象输出到视频,Alpha通道也可以用来决定显示区域。如果你曾经稍微深入到After Effects这类非线性编辑软件中去过,就会更加清楚。

 ⑸ 单色通道  这种通道的产生比较特别,也可以说是非正常的。试一下,如果你在通道面板中随便删除其中一个通道,就会发现所有的通道都变成“黑白”的,原有的彩色通道即使不删除也变成灰度的了。

opencv中的几种常见的图像类型:

CvArr :  老版本的结构了。是一个抽象基类,在函数原型中,常见到CvArr(CvArr*),这就允许吧CvMar*或者IplImage* 传递到程序或函数参数中了。 

CvMat :  矩阵结构,cvMat *cvCreateMat(int rows, int cols, int type) 

Type可以是任何预定义类型,预定义类型的结构如下:CV_<bit_depth>(S|U|F)C<number_of_channels>

S = 符号整型  U = 无符号整型  F = 浮点型

E.g.: CV_8UC1 是指一个8位无符号整型单通道矩阵, CV_32FC2是指一个32位浮点型双通道矩阵

IplImage :  是较老版本的一种类型了,对图像进行”编码“的基本结构。这些图像可能是灰度,彩色,4通道的(RGB+ alpha),其中,每个通道可以包含任意的整数或浮点数。

 Mat(cv::Mat,当写了using namespace cv时,就直接用Mat): 新版本中的强大的一个图像容器,是和Matlab中的函数对应的。基本上讲 Mat 是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同矩阵可以是不同的维数)的指针。矩阵头的尺寸是常数值,但矩阵本身的尺寸会依图像的不同而不同,通常比矩阵头的尺寸大数个数量级。

CvMat 和cv::Mat之间的区别: cv::Mat是一个类(Class),而CvMat是一个Struct,从类型上就可以知道二者存在很大区别。前者除了几个成员变量之外还有很多的成员函数和重载函数,可以实现很多的图像数据处理功能,而后者只有几个成员变量,要对其成员进行一些处理,需要借用别的函数

opencv中存储图像类型转换 :

(1)将IplImage类型转换到Mat类型 

范例程序:

#include<highgui.h>
#include<opencv2\opencv.hpp>
 #include<core\core.hpp>
usingnamespace cv;
 int main(){
IplImage* img1 = cvLoadImage("D:/Documents/C_Language/视频和图片库/晓月.jpg");     
Mat img2(img1);      
cvShowImage("img1",img1);      
imshow("img2",img2);
cvWaitKey(0);
return 0;

}

(2)将Mat类型转换到IplImage类型  同样只是创建图像头,而没有复制数据。 

int main(){
Matimg1=imread("D:/Documents/C_Language/视频和图片库/晓月.jpg");             
IplImage img2(img1);      
cvShowImage("img2",&img2);
imshow("img1",img1);    
cvWaitKey(0);      
return 0;
 }

(3)将CvMat类型转换为Mat类型  与IplImage的转换类似,可以选择是否复制数据。  Mat::Mat(const CvMat* m,bool copyData=false); 

(4)将Mat类型转换为CvMat类型  与IplImage的转换类似,不复制数据,只创建矩阵头。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CNN

Android OpenGL 显示基本图形及相关概念解读

转载请注明出处:【huachao1001的专栏:http://blog.csdn.net/huachao1001】

732
来自专栏一“技”之长

Cocos2d-x-v3动作体系 原

        cocos2d-x-v3版本v2的版本有的很大的改动,最直观的是在一些函数的改动和类名的改动上,首先以CC开头的类,都不再使用CC。在我个人的理...

551
来自专栏walterlv - 吕毅的博客

从 Matrix 解构出 Translate/Scale/Rotate(平移/缩放/旋转)

发布于 2017-11-20 16:20 更新于 2017-11...

351
来自专栏Python中文社区

Python用Pillow(PIL)进行简单的图像操作

專 欄 ❈ sunhaiyu,Python中文社区专栏作者 专栏地址: http://www.jianshu.com/u/4943cb2c6ea4 ❈ Pyt...

26810
来自专栏贾志刚-OpenCV学堂

Python OpenCV像素操作

Python OpenCV像素操作 环境声明 : Python3.6 + OpenCV3.3 + PyCharm IDE 首先要引入OpenCV和Numpy支持...

40811
来自专栏数据科学与人工智能

【Python环境】数据科学之5个最佳Python库,为初学者定制的教程

如果你已经决定把Python作为你的编程语言,那么,你脑海中的下一个问题会是:“进行数据分析有哪些Python库可用?” Python有很多库可用来进行数据分析...

1935
来自专栏我爱编程

Matplotlib入门

qiangbo.space/2018-04-06/matplotlib_l1/ 入门代码示例 import matplotlib.pyplot as plt ...

3629
来自专栏PPV课数据科学社区

【学习】请速度收藏,Excel常用电子表格公式大全

1、查找重复内容公式:=IF(COUNTIF(A:A,A2)>1,”重复”,””)。 2、用出生年月来计算年龄公式:=TRUNC((DAYS360(H6,”2...

3438
来自专栏机器之心

业界 | 探索Siri背后的技术:将逆文本标准化(ITN)转化为标签问题

2724
来自专栏PPV课数据科学社区

Excel公式大全,高手进阶必备!

第一部分:常用函数和公式 查找重复内容公式:=IF(COUNTIF(A:A,A2)>1,"重复","")。 用出生年月来计算年龄公式:=TRUNC((DAYS3...

2992

扫码关注云+社区