OpenCV中颜色漫谈


不知道大家有没有注意到OpenCV(包括C和C++版本,根据本人的熟悉程度,以下只对C接口的OpenCV做叙述)中没有表示颜色的数据结构,而其他的库如Qt中就有QColor和QRgb,GDI中也有COLORREF和RGBQUAD。不过OpenCV中只是没有明确的颜色数据结构而已(即无CvColor,CvRgb或CvHsv等),但可以用CvScalar表示颜色,也可以用CV_RGB宏来定义颜色,实际上CV_RGB也是由CvScalar来实现的。

  1. #define CV_RGB( r, g, b )  cvScalar( (b), (g), (r) )  
CvScalar类型变量表示颜色的函数举例:
  1. //其中CvScalar color表示线条的颜色   
  2. void cvLine( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color,   
  3.            int thickness=1, int line_type=8, int shift=0 );  
  4. //当CvArr为IplImage时,返回的就是指定坐标处的颜色值   
  5. CvScalar cvGet2D( const CvArr* arr, int idx0, int idx1 );  
  6. //当CvArr为IplImage时,就是利用CvScalar value表示的颜色值设置整个图像   
  7. void cvSet( CvArr* arr, CvScalar value, const CvArr* mask=NULL );  

为什么OpenCV不设计一个单独CvColor类(CvPixel,Color或Pixel)呢?其可以附件许多的功能,比如可以有如下的成员函数:

  1. getChannelNumber()  
  2. getTotalDepth()  
  3. getR()  
  4. getG()  
  5. getB()  
  6. getRGB(r,g,b)  
  7. toHSV()  
  8. toGray()  
  9. toXYZ()  
  10. .....  
为什么不设计独立的颜色类,而用CvScalar代劳,这是一个问题?欢迎回复!

此外还注意到OpenCV中对颜色属性的一些特点:

  1. 最大的通道数为512(见CV_CN_MAX),不过OpenCV中大部分的函数只支持1,2,3,4个通道的图像。
  2. 每通道的位数(即位深度)相同,另外OpenCV的位深度(IplImage::depth)指的是单一通道的位深度,而GDI中位深度(BITMAPINFOHEADER::biBitCount)指的是所有通道的位深度之和。
  3. 只支持RGB颜色空间(颜色模型)

相关内容