有關OPenCV的幾個庫函數的使用


1) IplImage* cvCreateImage( CvSize size, int depth, int channels );

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

 

2) IplImage* cvCloneImage( const IplImage* image );

 

  在使用函數之前,不用內存,即不用。該函數會自己開一段內存,然后復制好image里面的數據,然后把這段內存中的數據返回.

 

  例如

 

  IplImage *src;

 

  IplImage *dst;

 

  dst = cvCloneImage(src);

 

  就是直接把src這個圖像復制給dst,不用給dst內存空間了,即不用寫dst = cvCreateImage(cvGetSize(src),8,3).

3)void cvErode( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );

 

  src

 

  輸入圖像.

 

  dst

 

  輸出圖像.

 

  element

 

  用於腐蝕的結構元素。若為 NULL, 則使用 3×3 長方形的結構元素

 

  iterations

 

  腐蝕的次數

 

  函數 cvErode 對輸入圖像使用指定的結構元素進行腐蝕,該結構元素決定每個具有最小值象素點的鄰域形狀:

 

  dst=erode(src,element): dst(x,y)=min((x',y') in element))src(x+x',y+y')

 

  函數可以是本地操作,不需另外開辟存儲空間的意思。腐蝕可以重復進行 (iterations) 次. 對彩色圖像,每個彩色通道單獨處理。

 

  CreateStructuringElementEx 創建結構元素;ReleaseStructuringElement 刪除結構元素。

4) void cvAbsDiff( const CvArr* src1, const CvArr* src2, CvArr* dst );

  OpenCV 中計算兩個數組差的絕對值的函數。

 

  void cvAbsDiff( const CvArr* src1, const CvArr* src2, CvArr* dst );

 

  src1

 

  第一個原數組

 

  src2

 

  第二個原數組

 

  dst

 

  輸出數組

 

  函數 cvAbsDiff 計算兩個數組差的絕對值

 

  dst(I)c = abs(src1(I)c - src2(I)c).

 

  所有數組必須有相同的數據類型相同的大小(或ROI大小)

5)void cvThreshold( const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type );

 
   cvThreshold是opencv庫中的一個函數
 
   作用:函數 cvThreshold 對單通道數組應用固定閾值操作。該函數的典型應用是對灰度圖像進行閾值操作得到二值圖像。(cvCmpS 也可以達到此目的) 或者是去掉噪聲,例如過濾很小或很大象素值的圖像點。本函數支持的對圖像取閾值的方法由 threshold_type 確定。
 
   形式:void cvThreshold( const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type );
 
  src:原始數組 (單通道 , 8-bit of 32-bit 浮點數)。dst:輸出數組,必須與 src 的類型一致,或者為 8-bit。
 
  threshold:閾值
 
  max_value:使用 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值。
 
  threshold_type:閾值類型 threshold_type=CV_THRESH_BINARY:
 
  如果 src(x,y)>threshold ,dst(x,y) = max_value; 否則,des(x,y)=0;
 
  threshold_type=CV_THRESH_BINARY_INV:
 
  如果 src(x,y)>threshold,dst(x,y) = 0; 否則,dst(x,y) = max_value.
 
  threshold_typ
6) void cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );
 
  void cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );
 
  src
 
  輸入圖像.
 
  dst
 
  輸出圖像.
 
  element
 
  結構元素。若為 NULL, 則使用默認的3×3 長方形,錨點在中間的結構元素,進行膨脹運算
 
  iterations
 
  膨脹的次數
 
  函數 cvDilate 對輸入 圖像使用指定的結構元進行膨脹,該結構決定每個具有最大值象素點的鄰域形狀。
 
  說明:
 
  使用任意結構元素膨脹圖像,函數在調用中可以在輸入圖像上直接進行操作,如采用如下方式調用:cvDilate (img1, img1);
 
  膨脹可以重復進行 (iterations) 次. 對彩色圖像,每個彩色通道單獨處理。
7)  CreateStructuringElementEx
 
  cvCreateStructuringElementEx
 
  創建結構元素
 
  IplConvKernel* cvCreateStructuringElementEx( int cols, int rows, int anchor_x, int anchor_y,
 
  int shape, int* values=NULL );
 
  cols
 
  結構元素的列數目
 
  rows
 
  結構元素的行數目
 
  anchor_x
 
  錨點的相對水平偏移量
 
  anchor_y
 
  錨點的相對垂直偏移量
 
  shape
 
  結構元素的形狀,可以是下列值:
 
  CV_SHAPE_RECT, 長方形元素;
 
  CV_SHAPE_CROSS, 交錯元素 a cross-shaped element;
 
  CV_SHAPE_ELLIPSE, 橢圓元素;
 
  CV_SHAPE_CUSTOM, 用戶自定義元素。這種情況下參數 values 定義了 mask,即象素的那個鄰域必須考慮。
 
  values
 
  指向結構元素的指針,它是一個平面數組,表示對元素矩陣逐行掃描。(非零點表示該點屬於結構元)。如果指針為空,則表示平面數組中的所有元素都是非零的,即結構元是一個長方形(該參數僅僅當shape參數是 CV_SHAPE_CUSTOM 時才予以考慮)。
 
  函數 cv CreateStructuringElementEx 分配和填充結構 IplConvKernel, 它可作為形態操作中的結構元素。舉個例子比較好說清楚
 
  比如一個圖
 
  00000
 
  01110
 
  00000
 
  用一個cvCreateStructuringElementEx( 3,1,0 0,CV_SHAPE_RECT)的元素來腐蝕,則結果為
 
  00000
 
  01000
 
  00000
 
  而用一個cvCreateStructuringElementEx( 3,1,1 0,CV_SHAPE_RECT)的元素來腐蝕,則結果為
 
  00000
 
  00100
 
  00000
 
  理解:cvCreateStructuringElementEx( 3,1,0 0,CV_SHAPE_RECT)中的3,1表示要腐蝕的對象是一個3列1行的矩陣,如果該矩陣里元素全為非零,則將其轉化為同樣大小只包含一個非零元素,而該非零元素的位置是(0,0)。同理cvCreateStructuringElementEx( 3,1,1 0,CV_SHAPE_RECT)中的3,1表示要腐蝕的對象是一個3列1行的矩陣,如果該矩陣里元素全為非零,則將其轉化為同樣大小只包含一個非零元素,而該非零元素的位置是(1,0)
 
  假如用下面這個去腐蝕圖像,中心是在右下角1 0 01 1 01 1 1 那么應該怎么表示呢?
 
  理論上應該是int mask[9] = {1, 0, 0, 1, 1, 0, 1, 1, 1}; IplConvKernel* strel = cvCreateStructuringElementEx( 3, 3, 0, 2, CV_SHAPE_CUSTOM, mask );其中0,2可按自己要求設置。
8)  cvSetImageROI
 
  功能:
 
  基於給定的矩形設置圖像的ROI(感興趣區域,region of interesting)
 
  格式:
 
  void cvSetImageROI(IplImage* image,CvRect rect);
 
  參數
 
  image 圖像頭,待處理圖像
 
  rect ROI 矩形
 
  說明:
 
  如果ROI為NULL並且參數rect的值不等於整個圖像,則ROI被分配。大多數OpenCV函數都支持ROI,並將它作為一個獨立 圖像進行處理,所有像素坐標都是從ROI的左上角或者左下角(基於圖像結構)開始計算的。
9)  cvResetImageROI
 
  功能: 釋放基於給定的矩形設置圖像的ROI(感興趣區域,region of interesting)
 
  格式: void cvResetImageROI(IplImage* image) 
 
  參數: image 圖像頭,待處理圖像
 
  說明: 釋放圖像image中被設定的感興趣區域ROI,與cvSetImageROI相對應。
10)  cvNot
 
  函數cvNot(const CvArr* src,CvArr* dst)會將src中的每一個元素的每一位取反,然后把結果賦給dst。因此,一個值為0x00的8位圖像將被映射到0xff,而值為0x83的圖像將被映射到0x7c。
 
  void cvNot(
 
  const CvArr* src,
 
  CvArr* dst
 
  );
11)  CvScalar  cvGet2D (const CvArr * arr, int idx0, int idx1);

  對於圖像中的某一像素點 P(x, y), 在我們正常的坐標系中,x代表其橫坐標,y代表其縱坐標,而在opencv的函數 cvGet2D()與cvSet2D() 中,卻行不通。cvGet2D() 的函數原型是 : CvScalar  cvGet2D (const CvArr * arr, int idx0, int idx1); 函數返回的是一個CvScalar 容器,其參數中也有兩個標的目標的坐標,但跟我們通俗習慣的坐標不一樣的是,idx0代表是的行,即高度,對應於我們通俗坐標系的y, idx1代表的是列,即寬度,對應於我們通俗坐標系的x,cvSet2D() 也類似。所以在應用cvSet2D() 與 cvGet2D() 時,切切要重視坐標的次序。

 

 

cvGet?D用於獲取數組中指定下標的元素值,cvSet?D用於為數組中指定下標的元素賦予值。

以cvGet2D和cvSet2D為例:

CvScalar  cvGet2D (const CvArr * arr, int idx0, int idx1);

void cvSet2D (const CvArr * arr, int idx0, int idx1, CvScalar value);

索引值idx0代表數組元素的行下標,idx1代表數組元素的列下標

與OpenCV中圖像坐標系相對應,idx0,idx1表示的是圖像上指定高度和寬度值位置處所對應的像素值。

 

因此,在使用時,需要依照如下的方式進行:

復制代碼
1 for (int y = 0; y < height; y++) {
2 
3 for (int x = 0; x < width; x++)
4 
5 CvScalar cs = cvGet2D(img, y, x);
6 
7 cvSet2D(img, y, x, cs);
8 
9 }
復制代碼

12) cvMat

 
  OpenCV 中重要的矩陣變換函數,使用方法為cvMat* cvCreateMat ( int rows, int cols, int type ); 這里type可以是任何預定義類型,預定義類型的結構如下:CV_<bit_depth> (S|U|F)C<number_of_channels>。於是,矩陣的元素可以是32位浮點型數據(CV_32FC1),或者是無符號的8位三元組的 整型數據(CV_8UC3),或者是無數的其他類型的元素。一個CvMat的元素不一定就是個單一的數字。在矩陣中可以通過單一(簡單)的輸入來表示多值,這樣我們可以在一個三原色圖像上描繪多重色彩通道。對於一個包含RGB通道的簡單圖像,大多數的圖像操作將分別應用於每一個通道(除非另有說明)。
13)  cvGetSubRect
 
  openCV里面用來創建一定的區域
 
  cvGetSubRect(mat,submat,mat_rect);
 
  用法:
 
  第一個mat指的是源矩陣或者圖像
 
  第二個submat用來存儲從原矩陣中提取的區域
 
  第三個mat_rect用來指定區域的范圍
 
  cvGetSubRect作用是從一個圖像中提取出來一部分,比如將一幅圖像的一部分提取加到另外一幅圖像上,就需要先使用這個函數提取源圖像的需要部分。然后利用cvCopy.
14)  cvLoadImage
 
  函數原型:IplImage* cvLoadImage( const char* filename, int flags=CV_LOAD_IMAGE_COLOR );
 
  filename :要被讀入的文件的文件名(包括后綴);
 
  flags :指定讀入圖像的顏色和深度:
 
  指定的顏色可以將輸入的圖片轉為3信道(CV_LOAD_IMAGE_COLOR), 單信道 (CV_LOAD_IMAGE_GRAYSCALE), 或者保持不變(CV_LOAD_IMAGE_ANYCOLOR)。
 
  深度指定輸入的圖像是否轉為每個顏色信道每象素8位,(OpenCV的早期版本一樣),或者同輸入的圖像一樣保持不變。
 
  選中CV_LOAD_IMAGE_ANYDEPTH,則輸入 圖像格式可以為8位無符號,16位無符號,32位有符號或者32位 浮點型
 
  如果輸入有沖突的標志,將采用較小的數字值。比如CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYCOLOR 將載入3信道圖。CV_LOAD_IMAGE_ANYCOLOR和CV_LOAD_IMAGE_UNCHANGED是等值的。但是,CV_LOAD_IMAGE_ANYCOLOR有着可以和CV_LOAD_IMAGE_ANYDEPTH同時使用的優點,所以CV_LOAD_IMAGE_UNCHANGED不再使用了。
 
  如果想要載入最真實的圖像,選擇CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR。
 
  函數cvLoadImage從指定文件讀入圖像,返回讀入圖像的 指針。目前支持如下 文件格式
 
  Windows 位圖文件 - BMP, DIB;
 
  JPEG文件 - JPEG, JPG, JPE;
 
   便攜式網絡圖片- PNG;
 
  便攜式圖像格式 - PBM,PGM,PPM;
 
  Sun rasters - SR,RAS;
 
  TIFF文件 - TIFF,TIF;
 
  OpenEXR HDR 圖片 - EXR;
 
  JPEG 2000 圖片- jp2。
 
  cvSaveImage
 
  保存圖像到文件
 
  int cvSaveImage( const char* filename, const CvArr* image );
 
  filename
 
  文件名。
 
  image
 
  要保存的圖像。
 
  函數cvSaveImage保存圖像到指定文件。圖像格式的的選擇依賴於filename的擴展名,請參考cvLoadImage。只有8位單通道或者3通道(通道順序為'BGR' )可以使用這個函數保存。如果格式,深度或者通道不符合要求,請先用cvCvtScale 和 cvCvtColor轉換;或者使用通用的cvSave保存圖像為XML或者YAML格式。
 
  特別提醒!由於TIFF文件格式比較混亂,難以統一,此函數讀取TIFF圖片可能會失敗。
 
  cvLoadImage( filename, -1 ); 默認讀取圖像的原通道數
 
  cvLoadImage( filename, 0 ); 強制轉化讀取圖像為灰度圖
 
  cvLoadImage( filename, 1 ); 讀取彩色圖
 
  例:將讀入圖像強制轉換為 灰度圖像顯示
 
  
復制代碼
 1 #include <highgui.h>
 2  
 3   #include <cv.h>
 4  
 5   int main(int argc, char **argv)
 6  
 7   {
 8  
 9   if (argc != 2)
10  
11   return -1;
12  
13   /*強制轉換為灰度圖像*/
14  
15   IplImage *img = cvLoadImage(argv[1], 0);
16  
17   cvNamedWindow("example");
18  
19   cvShowImage("example", img);
20  
21   cvWaitKey(0);
22  
23   cvReleaseImage(&img);
24  
25   cvDestroyWindow("example");
26  
27   return 0;
28  
29   }
復制代碼

 

創造改變價值,編程改變人生
 
轉載:http://www.cnblogs.com/zsdydl-Neusoft/archive/2012/09/27/2706168.html


免責聲明!

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



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