CvCreateImage函數說明


CvCreateImage函數說明

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

矩形框大小,以像素為精度

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)

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

該算法可以恢復正常亮度增加圖像的對比度.

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.
void cvClearMemStorage( CvMemStorage* storage );
 storage : 存儲存儲塊 
   函數 cvClearMemStorage 將存儲塊的 top 置到存儲塊的頭部(注:清空存儲塊中的存儲內容)。該函數並不釋放內存(僅清空內存)。假使該內存塊有一個父內存塊(即:存在一內存塊與其有父子關系),則函數就將所有的塊返回給其 parent.
void cvClearMemStorage( CvMemStorage* storage );
  +  
  + ;storage : 存儲存儲塊
  +  
  + 函數 cvClearMemStorage 將存儲塊的 top 置到存儲塊的頭部(注:清空存儲塊中的存儲內容)。該函數並不釋放內存(僅清空內存)。假使該內存塊有一個父內存塊(即:存在一內存塊與其有父子關系),則函數就將所有的塊返回給其 parent.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM