CvCreateImage函数说明
CvCreateImage函数说明
cvCreateImage:
创建头并分配数据
IplImage* cvCreateImage( CvSize size, int depth, int channels );
参数说明:
size 图像宽、高.
depth 图像元素的位深度,可以是下面的其中之一:
IPL_DEPTH_8U - 无符号8位整型
IPL_DEPTH_8S - 有符号8位整型
IPL_DEPTH_16U - 无符号16位整型
IPL_DEPTH_16S - 有符号16位整型
IPL_DEPTH_32S - 有符号32位整型
IPL_DEPTH_32F - 单精度浮点数
IPL_DEPTH_64F - 双精度浮点数
channels:
每个元素(像素)通道号.可以是 1, 2, 3 或 4.通道是交叉存取的,例如通常的彩色图像数据排列是:b0 g0 r0 b1 g1 r1 ... 虽然通常 IPL 图象格式可以存贮非交叉存取的图像,并且一些OpenCV 也能处理他, 但是这个函数只能创建交叉存取图像.
函数 cvCreateImage 创建头并分配数据,这个函数是下列的缩写型式:
header = cvCreateImageHeader(size,depth,channels);
cvCreateData(header);
注:
CvSize
矩形框大小,以像素为精度
1 typedef struct CvSize 2 { 3 int width; 4 int height; 5 } 6 CvSize;
inline CvSize cvSize( int width, int height );
CvRound函数:
openCv中的一个函数:int cvRound (double value)
对一个double型的数进行四舍五入,并返回一个整型数!
附加:
函数 cvRound, cvFloor, cvCeil 用一种舍入方法将输入浮点数转换成整数。 cvRound 返回和参数最接近的整数值。 cvFloor 返回不大于参数的最大整数值。cvCeil 返回不小于参数的最小整数值。在某些体系结构中该函数 工作起来比标准 C 操作起来还要快。
注意下面的编程技巧:
1 typedef union Cv32suf 2 { 3 int i; 4 unsigned u; 5 float f; 6 } 7 Cv32suf;
1 CV_INLINE int cvFloor( double value ) 2 { 3 #if CV_SSE2 4 __m128d t = _mm_load_sd( &value ); 5 int i = _mm_cvtsd_si32(t); 6 return i - _mm_movemask_pd(_mm_cmplt_sd(t,_mm_cvtsi32_sd(t,i))); 7 #else 8 int temp = cvRound(value); 9 Cv32suf diff; 10 diff.f = (float)(value - temp); 11 return temp - (diff.i < 0); 12 #endif 13 }
1 CV_INLINE int cvCeil( double value ) 2 { 3 #if CV_SSE2 4 __m128d t = _mm_load_sd( &value ); 5 int i = _mm_cvtsd_si32(t); 6 return i + _mm_movemask_pd(_mm_cmplt_sd(_mm_cvtsi32_sd(t,i),t)); 7 #else 8 int temp = cvRound(value); 9 Cv32suf diff; 10 diff.f = (float)(temp - value); 11 return temp + (diff.i < 0); 12 #endif 13 }
#if CV_SSE2 可见,如果支持IPP,则会加速。
diff.f = (float)(value - temp);
return temp - (diff.i < 0);
这两句话的技巧:用diff.f保存浮点数。因为是联合体定义的diff,因此当再用diff.i解释那块内存时,可能数值会变化,但数值的正负不会变。
////////////////////////////////////////////////////////////////////////////////////////////
cvCvtColor函数:
cvCvtColor(...),
参数CV_BGR2GRAY 是RGB到gray,
参数 CV_GRAY2BGR 是gray 到RGB.
处理结果是彩色的,则转灰色就是了:
cvCvtColor( inputImg, grayImg, CV_BGR2GRAY);
void cvCvtColor( const CvArr* src, CvArr* dst, int code );
src
输入的 8-bit , 16-bit 或 32-bit 单倍精度浮点数影像。
dst
输出的 8-bit , 16-bit 或 32-bit 单倍精度浮点数影像。
code
色彩空间转换,通过定义 CV_<src_color_space>2<dst_color_space> 常数(见下面)。
函数 cvCvtColor 将输入图像从一个色彩空间转换为另外一个色彩空间。函数忽略 IplImage 头中定义的 colorModel 和 channelSeq 域,所以输入图像的色彩空间应该正确指定 (包括通道的顺序,对RGB空间而言,BGR 意味着布局为 B0 G0 R0 B1 G1 R1 ... 层叠的 24-位格式,而 RGB 意味着布局为 R0 G0 B0 R1 G1 B1 ... 层叠的24-位格式.
函数做如下变换:
RGB空间内部的变换,如增加/删除 alpha 通道,反相通道顺序,到16位 RGB彩色或者15位RGB彩色的正逆转换(Rx5:Gx6:Rx5),以及到灰度图像的正逆转换,使用:
RGB[A]->Gray: Y=0.212671*R + 0.715160*G + 0.072169*B + 0*A
Gray->RGB[A]: R=Y G=Y B=Y A=0
所有可能的图像色彩空间的相互变换公式列举如下:
RGB<=>XYZ (CV_BGR2XYZ, CV_RGB2XYZ, CV_XYZ2BGR, CV_XYZ2RGB):
|X| |0.412411 0.357585 0.180454| |R|
|Y| = |0.212649 0.715169 0.072182|*|G|
|Z| |0.019332 0.119195 0.950390| |B|
|R| | 3.240479 -1.53715 -0.498535| |X|
|G| = |-0.969256 1.875991 0.041556|*|Y|
|B| | 0.055648 -0.204043 1.057311| |Z|
RGB<=>YCrCb (CV_BGR2YCrCb, CV_RGB2YCrCb, CV_YCrCb2BGR, CV_YCrCb2RGB)
Cb=(B-Y)*0.564 + 128
R=Y + 1.403*(Cr - 128)
G=Y - 0.344*(Cr - 128) - 0.714*(Cb - 128)
B=Y + 1.773*(Cb - 128)
RGB=>HSV (CV_BGR2HSV,CV_RGB2HSV)
V=max(R,G,B)
if V!=0 then S=(V-min(R,G,B))*255/V;
else S = 0;
if V=R then H = (G - B)*60/S;
if V=G then H = 180+(B - R)*60/S;
if V=B then H = 240+(R - G)*60/S;
if H<0 then H=H+360;
使用上面从 0° 到 360° 变化的公式计算色调(hue)值,确保它们被 2 除后能适用于8位。
RGB=>Lab (CV_BGR2Lab, CV_RGB2Lab)
|X| |0.433910 0.376220 0.189860| |R/255|
|Y| = |0.212649 0.715169 0.072182|*|G/255|
|Z| |0.017756 0.109478 0.872915| |B/255|
L = 116*Y1/3 for Y>0.008856
L = 903.3*Y for Y<=0.008856
a = 500*(f(X)-f(Y))
b = 200*(f(Y)-f(Z))
where f(t)=t1/3 for t>0.008856
f(t)=7.787*t+16/116 for t<=0.008856
Bayer=>RGB (CV_BayerBG2BGR, CV_BayerGB2BGR, CV_BayerRG2BGR, CV_BayerGR2BGR, CV_BayerBG2RGB, CV_BayerRG2BGR, CV_BayerGB2RGB, CV_BayerGR2BGR, CV_BayerRG2RGB, CV_BayerBG2BGR, CV_BayerGR2RGB, CV_BayerGB2BGR)
像素点安排
Bayer 模式被广泛应用于 CCD 和 CMOS 摄像头. 它允许从一个单独平面中得到彩色图像,该平面中的 R/G/B 象素点被安排如下:
R G R G R
G B G B G
G B G B G
R G R G R
G B G B G
对像素输出的RGB份量由该像素的1、2或者4邻域中具有相同颜色的点插值得到。以上的模式可以通过向左或者向上平移一个像素点来作一些修改。转换常量CV_BayerC1C22{RGB|RGB}中的两个字母C1和C2表示特定的模式类型:颜色份量分别来自于第二行,第二和第三列。比如说,上述的模式具有很流行的"BG"类型。
cvEqualizeHist函数:
该算法可以恢复正常亮度,增加图像的对比度.
1 void cvEqualizeHist( 2 3 IplImage src, 4 5 IplImage dst 6 7 );
src
The input 8-bit single-channel image
dst
The output image of the same size and the same data type as
cvClearMemStorage:
void cvClearMemStorage( CvMemStorage* storage ); | |||
+ | |||
+ | ;storage : 存储存储块 | ||
+ | |||
+ | 函数 cvClearMemStorage 将存储块的 top 置到存储块的头部(注:清空存储块中的存储内容)。该函数并不释放内存(仅清空内存)。假使该内存块有一个父内存块(即:存在一内存块与其有父子关系),则函数就将所有的块返回给其 parent. |
storage : 存储存储块
函数 cvClearMemStorage 将存储块的 top 置到存储块的头部(注:清空存储块中的存储内容)。该函数并不释放内存(仅清空内存)。假使该内存块有一个父内存块(即:存在一内存块与其有父子关系),则函数就将所有的块返回给其 parent.
void cvClearMemStorage( CvMemStorage* storage ); | |||
+ | |||
+ | ;storage : 存储存储块 | ||
+ | |||
+ | 函数 cvClearMemStorage 将存储块的 top 置到存储块的头部(注:清空存储块中的存储内容)。该函数并不释放内存(仅清空内存)。假使该内存块有一个父内存块(即:存在一内存块与其有父子关系),则函数就将所有的块返回给其 parent. |