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. | ||
