作者:teeyohuang
本文系交流学习使用,转载请注明出处,谢谢
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的转换类似,不复制数据,只创建矩阵头。