不知道大家有沒有注意到OpenCV(包括C和C++版本,根據本人的熟悉程度,以下只對C接口的OpenCV做敘述)中沒有表示顏色的數據結構,而其他的庫如Qt中就有QColor和QRgb,GDI中也有COLORREF和RGBQUAD。不過OpenCV中只是沒有明確的顏色數據結構而已(即無CvColor,CvRgb或CvHsv等),但可以用CvScalar表示顏色,也可以用CV_RGB宏來定義顏色,實際上CV_RGB也是由CvScalar來實現的。
- #define CV_RGB( r, g, b ) cvScalar( (b), (g), (r) )
CvScalar類型變量表示顏色的函數舉例:
- //其中CvScalar color表示線條的顏色
- void cvLine( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color,
- int thickness=1, int line_type=8, int shift=0 );
- //當CvArr為IplImage時,返回的就是指定坐標處的顏色值
- CvScalar cvGet2D( const CvArr* arr, int idx0, int idx1 );
- //當CvArr為IplImage時,就是利用CvScalar value表示的顏色值設置整個圖像
- void cvSet( CvArr* arr, CvScalar value, const CvArr* mask=NULL );
為什麼OpenCV不設計一個單獨CvColor類(CvPixel,Color或Pixel)呢?其可以附件許多的功能,比如可以有如下的成員函數:
- getChannelNumber()
- getTotalDepth()
- getR()
- getG()
- getB()
- getRGB(r,g,b)
- toHSV()
- toGray()
- toXYZ()
- .....
為什麼不設計獨立的顏色類,而用CvScalar代勞,這是一個問題?歡迎回復!
此外還注意到OpenCV中對顏色屬性的一些特點:
- 最大的通道數為512(見CV_CN_MAX),不過OpenCV中大部分的函數只支持1,2,3,4個通道的圖像。
- 每通道的位數(即位深度)相同,另外OpenCV的位深度(IplImage::depth)指的是單一通道的位深度,而GDI中位深度(BITMAPINFOHEADER::biBitCount)指的是所有通道的位深度之和。
- 只支持RGB顏色空間(顏色模型)