【OpenCV】CvCreateImage函数说明以及颜色空间量化之间转换

来源:互联网 发布:网络赚钱项目有哪些 编辑:程序博客网 时间:2024/03/29 21:54

CvCreateImage函数说明以及一些OpenCv中函数的相关说明


cvCreateImage是openCV中的一个函数。OpenCV是Intel公司支持的开源计算机视觉库。
  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
矩形框大小,以像素为精度

typedef struct CvSize
{
int width;
int height;
}
CvSize;

inline CvSize cvSize( int width, int height );

CvRound函数:

openCv中的一个函数:

int cvRound (double value)

对一个double型的数进行四舍五入,并返回一个整型数!

附加:

函数 cvRound, cvFloor, cvCeil 用一种舍入方法将输入浮点数转换成整数。 cvRound 返回和参数最接近的整数值。 cvFloor 返回不大于参数的最大整数值。cvCeil 返回不小于参数的最小整数值。在某些体系结构中该函数 工作起来比标准 C 操作起来还要快。

注意下面的编程技巧:

typedef union Cv32suf
{
int i;
unsigned u;
float f;
}
Cv32suf;

CV_INLINE int cvFloor( double value )
{
#if CV_SSE2
__m128d t = _mm_load_sd( &value );
int i = _mm_cvtsd_si32(t);
return i - _mm_movemask_pd(_mm_cmplt_sd(t,_mm_cvtsi32_sd(t,i)));
#else
int temp = cvRound(value);
Cv32suf diff;
diff.f = (float)(value - temp);
return temp - (diff.i < 0);
#endif
}


CV_INLINE int cvCeil( double value )
{
#if CV_SSE2
__m128d t = _mm_load_sd( &value );
int i = _mm_cvtsd_si32(t);
return i + _mm_movemask_pd(_mm_cmplt_sd(_mm_cvtsi32_sd(t,i),t));
#else
int temp = cvRound(value);
Cv32suf diff;
diff.f = (float)(temp - value);
return temp + (diff.i < 0);
#endif
}

#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)

  Y=0.299*R + 0.587*G + 0.114*B

  Cr=(R-Y)*0.713 + 128

  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

  R G R G R

  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函数:

该算法可以恢复正常亮度增加图像的对比度.

void cvEqualizeHist(

IplImage src,

IplImage dst

);

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.void cvClearMemStorage( CvMemStorage* storage );
storage : 存储存储块
函数 cvClearMemStorage 将存储块的 top 置到存储块的头部(注:清空存储块中的存储内容)。该函数并不释放内存(仅清空内存)。假使该内存块有一个父内存块(即:存在一内存块与其有父子关系),则函数就将所有的块返回给其 parent.
void cvClearMemStorage( CvMemStorage* storage );+;storage : 存储存储块+函数 cvClearMemStorage 将存储块的 top 置到存储块的头部(注:清空存储块中的存储内容)。该函数并不释放内存(仅清空内存)。假使该内存块有一个父内存块(即:存在一内存块与其有父子关系),则函数就将所有的块返回给其 parent.
0 0