CV參考手冊.doc
《CV參考手冊.doc》由會員分享,可在線閱讀,更多相關(guān)《CV參考手冊.doc(127頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、CV 參考手冊
HUNNISH 注:
本翻譯是直接根據(jù) OpenCV Beta 4.0 版本的用戶手冊翻譯的,原文件是:
2、 梯度, 邊緣和角點 o 采樣 差值和幾何變換 o 形態(tài)學(xué)操作 o 濾波和彩色變換 o 金字塔及其應(yīng)用 o 連接組件 o 圖像和輪廓矩 o 特殊圖像變換 o 直方圖 o 匹配 結(jié)構(gòu)分析 o 輪廓處理 o 計算幾何 o 平面劃分 運動分析和對象跟蹤 o 背景統(tǒng)計量的累積 o 運動模板 o 對象跟蹤 o 光流 o 預(yù)估器 模式識別 o 目標檢測 照相機定標和三維重建 o 照相機定標 o 姿態(tài)估計 o 極線幾何 函數(shù)列表 參考 圖像處理 注意: 本章描述圖像處理和分析
3、的一些函數(shù)。其中大多數(shù)函數(shù)都是針對兩維象素數(shù)組的,這里,我們稱這些數(shù)組為“圖像”,但是它們不一定非得是IplImage 結(jié)構(gòu),也可以是CvMat或者CvMatND結(jié)構(gòu)。 梯度、邊緣和角點 Sobel 使用擴展 Sobel 算子計算一階、二階、三階或混合圖像差分 void cvSobel( const CvArr* src, CvArr* dst, int xorder, int yorder, int aperture_size=3 ); src 輸入圖像. dst 輸出圖像. xorder x 方向上的差分階數(shù) yorder y 方向上的差分階
4、數(shù) aperture_size 擴展 Sobel 核的大小,必須是 1, 3, 5 或 7。 除了尺寸為 1, 其它情況下, aperture_size aperture_size 可分離內(nèi)核將用來計算差分。對 aperture_size=1的情況, 使用 3x1 或 1x3 內(nèi)核 (不進行高斯平滑操作)。這里有一個特殊變量 CV_SCHARR (=-1),對應(yīng) 3x3 Scharr 濾波器,可以給出比 3x3 Sobel 濾波更精確的結(jié)果。Scharr 濾波器系數(shù)是: | -3 0 3| |-10 0 10| | -3 0 3| 對 x-方向 以及轉(zhuǎn)置矩陣對 y-方向。
5、 函數(shù) cvSobel 通過對圖像用相應(yīng)的內(nèi)核進行卷積操作來計算圖像差分: dst(x,y) = dxorder+yodersrc/dxxorder?dyyorder |(x,y) 由于Sobel 算子結(jié)合了 Gaussian 平滑和微分,所以,其結(jié)果或多或少對噪聲有一定的魯棒性。通常情況,函數(shù)調(diào)用采用如下參數(shù) (xorder=1, yorder=0, aperture_size=3) 或 (xorder=0, yorder=1, aperture_size=3) 來計算一階 x- 或 y- 方向的圖像差分。第一種情況對應(yīng): |-1 0 1| |-2 0 2|
6、 |-1 0 1| 核。第二種對應(yīng) |-1 -2 -1| | 0 0 0| | 1 2 1| or | 1 2 1| | 0 0 0| |-1 -2 -1| 核的選則依賴于圖像原點的定義 (origin 來自 IplImage 結(jié)構(gòu)的定義)。由于該函數(shù)不進行圖像尺度變換,所以和輸入圖像(數(shù)組)相比,輸出圖像(數(shù)組)的元素通常具有更大的絕對數(shù)值(譯者注:即象素的深度)。為防止溢出,當輸入圖像是 8 位的,要求輸出圖像是 16 位的。當然可以用函數(shù)函數(shù) cvConvertScale 或 cvConvertScaleAbs 轉(zhuǎn)換為 8
7、位的。除了 8-比特 圖像,函數(shù)也接受 32-位 浮點數(shù)圖像。所有輸入和輸出圖像都必須是單通道的,并且具有相同的圖像尺寸或者ROI尺寸。 Laplace 計算圖像的 Laplacian變換 void cvLaplace( const CvArr* src, CvArr* dst, int aperture_size=3 ); src 輸入圖像. dst 輸出圖像. aperture_size 核大小 (與 cvSobel 中定義一樣). 函數(shù) cvLaplace 計算輸入圖像的 Laplacian變換,方法是先用 sobel 算子計算二階 x- 和 y-
8、差分,再求和: dst(x,y) = d2src/dx2 + d2src/dy2 對 aperture_size=1 則給出最快計算結(jié)果,相當于對圖像采用如下內(nèi)核做卷積: |0 1 0| |1 -4 1| |0 1 0| 類似于 cvSobel 函數(shù),該函數(shù)也不作圖像的尺度變換,所支持的輸入、輸出圖像類型的組合和cvSobel一致。 Canny 采用 Canny 算法做邊緣檢測 void cvCanny( const CvArr* image, CvArr* edges, double threshold1, double thr
9、eshold2, int aperture_size=3 ); image 輸入圖像. edges 輸出的邊緣圖像 threshold1 第一個閾值 threshold2 第二個閾值 aperture_size Sobel 算子內(nèi)核大小 (見 cvSobel). 函數(shù) cvCanny 采用 CANNY 算法發(fā)現(xiàn)輸入圖像的邊緣而且在輸出圖像中標識這些邊緣。threshold1和threshold2 當中的小閾值用來控制邊緣連接,大的閾值用來控制強邊緣的初始分割。 PreCornerDetect 計算用于角點檢測的特征圖, void cvPreC
10、ornerDetect( const CvArr* image, CvArr* corners, int aperture_size=3 ); image 輸入圖像. corners 保存候選角點的特征圖 aperture_size Sobel 算子的核大小(見cvSobel). 函數(shù) cvPreCornerDetect 計算函數(shù) Dx2Dyy+Dy2Dxx - 2DxDyDxy 其中 D? 表示一階圖像差分,D?? 表示二階圖像差分。 角點被認為是函數(shù)的局部最大值: // 假設(shè)圖像格式為浮點數(shù) IplImage* corners = cvCloneImage(i
11、mage); IplImage* dilated_corners = cvCloneImage(image); IplImage* corner_mask = cvCreateImage( cvGetSize(image), 8, 1 ); cvPreCornerDetect( image, corners, 3 ); cvDilate( corners, dilated_corners, 0, 1 ); cvSubS( corners, dilated_corners, corners ); cvCmpS( corners, 0, corner_mask, CV_CMP_GE )
12、; cvReleaseImage( &corners ); cvReleaseImage( &dilated_corners ); CornerEigenValsAndVecs 計算圖像塊的特征值和特征向量,用于角點檢測 void cvCornerEigenValsAndVecs( const CvArr* image, CvArr* eigenvv, int block_size, int aperture_size=3 ); image 輸入圖像. eigenvv 保存結(jié)果的數(shù)組。必須比輸入圖像寬
13、6 倍。 block_size 鄰域大小 (見討論). aperture_size Sobel 算子的核尺寸(見 cvSobel). 對每個象素,函數(shù) cvCornerEigenValsAndVecs 考慮 block_size block_size 大小的鄰域 S(p),然后在鄰域上計算圖像差分的相關(guān)矩陣: | sumS(p)(dI/dx)2 sumS(p)(dI/dx?dI/dy)| M = | | | sumS(p)(dI/dx?dI/dy) sumS(p)(dI/dy)2
14、| 然后它計算矩陣的特征值和特征向量,并且按如下方式(λ1, λ2, x1, y1, x2, y2)存儲這些值到輸出圖像中,其中 λ1, λ2 - M 的特征值,沒有排序 (x1, y1) - 特征向量,對 λ1 (x2, y2) - 特征向量,對 λ2 CornerMinEigenVal 計算梯度矩陣的最小特征值,用于角點檢測 void cvCornerMinEigenVal( const CvArr* image, CvArr* eigenval, int block_size, int aperture_size=3 ); image 輸入圖像. eige
15、nval 保存最小特征值的圖像. 與輸入圖像大小一致 block_size 鄰域大小 (見討論 cvCornerEigenValsAndVecs). aperture_size Sobel 算子的核尺寸(見 cvSobel). 當輸入圖像是浮點數(shù)格式時,該參數(shù)表示用來計算差分固定的浮點濾波器的個數(shù). 函數(shù) cvCornerMinEigenVal 與 cvCornerEigenValsAndVecs 類似,但是它僅僅計算和存儲每個象素點差分相關(guān)矩陣的最小特征值,即前一個函數(shù)的 min(λ1, λ2) FindCornerSubPix 精確角點位置 void c
16、vFindCornerSubPix( const CvArr* image, CvPoint2D32f* corners, int count, CvSize win, CvSize zero_zone, CvTermCriteria criteria ); image 輸入圖像. corners 輸入角點的初始坐標,也存儲精確的輸出坐標 count 角點數(shù)目 win 搜索窗口的一半尺寸。如果 win=(5,5) 那么使用 5*2+1 5*2+1 = 11
17、11 大小的搜索窗口 zero_zone 死區(qū)的一半尺寸,死區(qū)為不對搜索區(qū)的中央位置做求和運算的區(qū)域。它是用來避免自相關(guān)矩陣出現(xiàn)的某些可能的奇異性。當值為 (-1,-1) 表示沒有死區(qū)。 criteria 求角點的迭代過程的終止條件。即角點位置的確定,要么迭代數(shù)大于某個設(shè)定值,或者是精確度達到某個設(shè)定值。 criteria 可以是最大迭代數(shù)目,或者是設(shè)定的精確度,也可以是它們的組合。 函數(shù) cvFindCornerSubPix 通過迭代來發(fā)現(xiàn)具有子象素精度的角點位置,或如圖所示的放射鞍點(radial saddle points)。 子象素級角點定位的實現(xiàn)是基于對向量
18、正交性的觀測而實現(xiàn)的,即從中央點q到其鄰域點p 的向量和p點處的圖像梯度正交(服從圖像和測量噪聲)。考慮以下的表達式: εi=DIpiT?(q-pi) 其中,DIpi表示在q的一個鄰域點pi處的圖像梯度,q的值通過最小化εi得到。通過將εi設(shè)為0,可以建立系統(tǒng)方程如下: sumi(DIpi?DIpiT)?q - sumi(DIpi?DIpiT?pi) = 0 其中q的鄰域(搜索窗)中的梯度被累加。調(diào)用第一個梯度參數(shù)G和第二個梯度參數(shù)b,得到: q=G-1?b 該算法將搜索窗的中心設(shè)為新的中心q,然后迭代,直到找到低于某個閾值點的中心位置。 GoodFeaturesToT
19、rack 確定圖像的強角點 void cvGoodFeaturesToTrack( const CvArr* image, CvArr* eig_image, CvArr* temp_image, CvPoint2D32f* corners, int* corner_count, double quality_level, double min_distance, const CvArr* mask=NULL );
20、image 輸入圖像,8-位或浮點32-比特,單通道 eig_image 臨時浮點32-位圖像,尺寸與輸入圖像一致 temp_image 另外一個臨時圖像,格式與尺寸與 eig_image 一致 corners 輸出參數(shù),檢測到的角點 corner_count 輸出參數(shù),檢測到的角點數(shù)目 quality_level 最大最小特征值的乘法因子。定義可接受圖像角點的最小質(zhì)量因子。 min_distance 限制因子。得到的角點的最小距離。使用 Euclidian 距離 mask ROI:感興趣區(qū)域。函數(shù)在ROI中計算角點,如果 mask
21、為 NULL,則選擇整個圖像。 函數(shù) cvGoodFeaturesToTrack 在圖像中尋找具有大特征值的角點。該函數(shù),首先用cvCornerMinEigenVal 計算輸入圖像的每一個象素點的最小特征值,并將結(jié)果存儲到變量 eig_image 中。然后進行非最大值抑制(僅保留3x3鄰域中的局部最大值)。下一步將最小特征值小于 quality_level?max(eig_image(x,y)) 排除掉。最后,函數(shù)確保所有發(fā)現(xiàn)的角點之間具有足夠的距離,(最強的角點第一個保留,然后檢查新的角點與已有角點之間的距離大于 min_distance )。 采樣、差值和幾何變換 Init
22、LineIterator 初始化線段迭代器 int cvInitLineIterator( const CvArr* image, CvPoint pt1, CvPoint pt2, CvLineIterator* line_iterator, int connectivity=8 ); image 帶采線段的輸入圖像. pt1 線段起始點 pt2 線段結(jié)束點 line_iterator 指向線段迭代器狀態(tài)結(jié)構(gòu)的指針 connectivity 被掃描線段的連通數(shù),4 或 8. 函數(shù) cvInitLi
23、neIterator 初始化線段迭代器,并返回兩點之間的象素點數(shù)目。兩個點必須在圖像內(nèi)。當?shù)鞒跏蓟?,連接兩點的光柵線上所有點,都可以連續(xù)通過調(diào)用 CV_NEXT_LINE_POINT 來得到。線段上的點是使用 4-連通或8-連通利用 Bresenham 算法逐點計算的。 例子:使用線段迭代器計算彩色線上象素值的和 CvScalar sum_line_pixels( IplImage* image, CvPoint pt1, CvPoint pt2 ) { CvLineIterator iterator; int blue_sum
24、= 0, green_sum = 0, red_sum = 0; int count = cvInitLineIterator( image, pt1, pt2, &iterator, 8 ); for( int i = 0; i < count; i++ ){ blue_sum += [0]; green_sum += [1]; red_sum += [2]; CV_NEXT_LINE_POINT(iterator);
25、/* print the pixel coordinates: demonstrates how to calculate the coordinates */ { int offset, x, y; /* assume that ROI is not set, otherwise need to take it into account. */ offset = - (uchar*)(image->imageData); y = offset/image->wi
26、dthStep; x = (offset - y*image->widthStep)/(3*sizeof(uchar) /* size of pixel */); printf("(%d,%d)\n", x, y ); } } return cvScalar( blue_sum, green_sum, red_sum ); } SampleLine 將光柵線讀入緩沖區(qū) int cvSampleLine( const CvArr* image, CvPoint p
27、t1, CvPoint pt2, void* buffer, int connectivity=8 ); image 帶采線段的輸入圖像 pt1 起點 pt2 終點 buffer 存儲線段點的緩存區(qū),必須有足夠大小來存儲點 max( |pt2.x-pt1.x|+1, |pt2.y-pt1.y|+1 ) :8-連通情況下,或者 |pt2.x-pt1.x|+|pt2.y-pt1.y|+1 : 4-連通情況下. connectivity 線段的連通方式, 4 or 8. 函數(shù) cvSampleLine 實現(xiàn)了線段迭代器的
28、一個特殊應(yīng)用。它讀取由兩點 pt1 和 pt2 確定的線段上的所有圖像點,包括終點,并存儲到緩存中。 GetRectSubPix 從圖像中提取象素矩形,使用子象素精度 void cvGetRectSubPix( const CvArr* src, CvArr* dst, CvPoint2D32f center ); src 輸入圖像. dst 提取的矩形. center 提取的象素矩形的中心,浮點數(shù)坐標。中心必須位于圖像內(nèi)部. 函數(shù) cvGetRectSubPix 從圖像 src 中提取矩形: dst(x, y) = src(x + center.x -
29、(width(dst)-1)*0.5, y + center.y - (height(dst)-1)*0.5) 其中非整數(shù)象素點坐標采用雙線性差值提取。對多通道圖像,每個通道獨立單獨完成提取。盡管函數(shù)要求矩形的中心一定要在輸入圖像之中,但是有可能出現(xiàn)矩形的一部分超出圖像邊界的情況,這時,該函數(shù)復(fù)制邊界的模識(hunnish:即用于矩形相交的圖像邊界線段的象素來代替矩形超越部分的象素)。 GetQuadrangleSubPix 提取象素四邊形,使用子象素精度 void cvGetQuadrangleSubPix( const CvArr* src, CvArr* dst, cons
30、t CvMat* map_matrix, int fill_outliers=0, CvScalar fill_value=cvScalarAll(0) ); src 輸入圖像. dst 提取的四邊形. map_matrix 3 2 變換矩陣 [A|b] (見討論). fill_outliers 該標志位指定是否對原始圖像邊界外面的象素點使用復(fù)制模式(fill_outliers=0)進行差值或者將其設(shè)置為指定值(fill_outliers=1)。 fill_value 對超出圖像邊界的矩形象素設(shè)定
31、的值(當 fill_outliers=1時的情況). 函數(shù) cvGetQuadrangleSubPix 以子象素精度從圖像 src 中提取四邊形,使用子象素精度,并且將結(jié)果存儲于 dst ,計算公式是: dst(x+width(dst)/2, y+height(dst)/2)= src( A11x+A12y+b1, A21x+A22y+b2), w其中 A和 b 均來自映射矩陣(譯者注:A, b為幾何形變參數(shù)) map_matrix | A11 A12 b1 | map_matrix = | | |
32、A21 A22 b2 | 其中在非整數(shù)坐標 A?(x,y)T+b 的象素點值通過雙線性變換得到。多通道圖像的每一個通道都單獨計算. 例子:使用 cvGetQuadrangleSubPix 進行圖像旋轉(zhuǎn) #include "cv.h" #include "highgui.h" #include "math.h" int main( int argc, char** argv ) { IplImage* src; /* the first command line parameter must be image file name */ if( a
33、rgc==2 && (src = cvLoadImage(argv[1], -1))!=0) { IplImage* dst = cvCloneImage( src ); int delta = 1; int angle = 0; cvNamedWindow( "src", 1 ); cvShowImage( "src", src ); for(;;) { float m[6]; double fac
34、tor = (cos(angle*CV_PI/180.) + 1.1)*3; CvMat M = cvMat( 2, 3, CV_32F, m ); int w = src->width; int h = src->height; m[0] = (float)(factor*cos(-angle*2*CV_PI/180.)); m[1] = (float)(factor*sin(-angle*2*CV_PI/180.)); m[2] =
35、 w*0.5f; m[3] = -m[1]; m[4] = m[0]; m[5] = h*0.5f; cvGetQuadrangleSubPix( src, dst, &M, 1, cvScalarAll(0)); cvNamedWindow( "dst", 1 ); cvShowImage( "dst", dst ); if( cvWaitKey(5) == 27 )
36、 break; angle = (angle + delta) % 360; } } return 0; } Resize 圖像大小變換 void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR ); src 輸入圖像. dst 輸出圖像. interpolation 差值方法: CV_INTER_NN - 最近鄰差值, CV_INTER_LINEAR - 雙線性差值 (缺省使用)
37、 CV_INTER_AREA - 使用象素關(guān)系重采樣。當圖像縮小時候,該方法可以避免波紋出現(xiàn)。當圖像放大時,類似于 CV_INTER_NN 方法.. CV_INTER_CUBIC - 立方差值. 函數(shù) cvResize 將圖像 src 改變尺寸得到與 dst 同樣大小。若設(shè)定 ROI,函數(shù)將按常規(guī)支持 ROI. WarpAffine 對圖像做仿射變換 void cvWarpAffine( const CvArr* src, CvArr* dst, const CvMat* map_matrix, int flags=CV_INTE
38、R_LINEAR+CV_WARP_FILL_OUTLIERS, CvScalar fillval=cvScalarAll(0) ); src 輸入圖像. dst 輸出圖像. map_matrix 23 變換矩陣 flags 插值方法和以下開關(guān)選項的組合: CV_WARP_FILL_OUTLIERS - 填充所有縮小圖像的象素。如果部分象素落在輸入圖像的邊界外,那么它們的值設(shè)定為 fillval. CV_WARP_INVERSE_MAP - 指定 matrix 是輸出圖像到輸入圖像的反變換,因此可以直接用來做象素差
39、值。否則, 函數(shù)從 map_matrix 得到反變換。 fillval 用來填充邊界外面的值 函數(shù) cvWarpAffine 利用下面指定的矩陣變換輸入圖像: dst(x',y')<-src(x,y) 如果沒有指定 CV_WARP_INVERSE_MAP , (x',y')T=map_matrix?(x,y,1)T+b , 否則, (x, y)T=map_matrix?(x',y&apos,1)T+b 函數(shù)與 cvGetQuadrangleSubPix 類似,但是不完全相同。 cvWarpAffine 要求輸入和輸出圖像具有
40、同樣的數(shù)據(jù)類型,有更大的資源開銷(因此對小圖像不太合適)而且輸出圖像的部分可以保留不變。而 cvGetQuadrangleSubPix 可以精確地從8位圖像中提取四邊形到浮點數(shù)緩存區(qū)中,具有比較小的系統(tǒng)開銷,而且總是全部改變輸出圖像的內(nèi)容。 要變換稀疏矩陣,使用 cxcore 中的函數(shù) cvTransform 。 2DRotationMatrix 計算二維旋轉(zhuǎn)的仿射變換矩陣 CvMat* cv2DRotationMatrix( CvPoint2D32f center, double angle, double scale,
41、CvMat* map_matrix ); center 輸入圖像的旋轉(zhuǎn)中心坐標 angle 旋轉(zhuǎn)角度(度)。正值表示逆時針旋轉(zhuǎn)(坐標原點假設(shè)在左上角). scale 各項同性的尺度因子 map_matrix 輸出 23 矩陣的指針 函數(shù) cv2DRotationMatrix 計算矩陣: [ α β | (1-α)*center.x - β*center.y ] [ -β α | β*center.x + (1-α)*center.y ] where α=scale*cos(angle), β=scale*sin(angle) 該變換并
42、不改變原始旋轉(zhuǎn)中心點的坐標,如果這不是操作目的,則可以通過調(diào)整平移量改變其坐標(譯者注:通過簡單的推導(dǎo)可知,放射變換的實現(xiàn)是首先將旋轉(zhuǎn)中心置為坐標原點,再進行旋轉(zhuǎn)和尺度變換,最后重新將坐標原點設(shè)定為輸入圖像的左上角,這里的平移量是center.x, center.y). WarpPerspective 對圖像進行透視變換 void cvWarpPerspective( const CvArr* src, CvArr* dst, const CvMat* map_matrix, int flags=CV_INTER_LINEAR+CV_
43、WARP_FILL_OUTLIERS, CvScalar fillval=cvScalarAll(0) ); src 輸入圖像. dst 輸出圖像. map_matrix 33 變換矩陣 flags 插值方法和以下開關(guān)選項的組合: CV_WARP_FILL_OUTLIERS - 填充所有縮小圖像的象素。如果部分象素落在輸入圖像的邊界外,那么它們的值設(shè)定為 fillval. CV_WARP_INVERSE_MAP - 指定 matrix 是輸出圖像到輸入圖像的反變換,因此可以直接用來做象素差值。否則, 函
44、數(shù)從 map_matrix 得到反變換。 fillval 用來填充邊界外面的值 函數(shù) cvWarpPerspective 利用下面指定矩陣變換輸入圖像: dst(x',y')<-src(x,y) 若指定 CV_WARP_INVERSE_MAP, (tx',ty',t)T=map_matrix?(x,y,1)T+b 否則, (tx, ty, t)T=map_matrix?(x',y&apos,1)T+b 要變換稀疏矩陣,使用 cxcore 中的函數(shù) cvTransform 。 WarpPerspectiveQMatrix
45、 用4個對應(yīng)點計算透視變換矩陣 CvMat* cvWarpPerspectiveQMatrix( const CvPoint2D32f* src, const CvPoint2D32f* dst, CvMat* map_matrix ); src 輸入圖像的四邊形的4個點坐標 dst 輸出圖像的對應(yīng)四邊形的4個點坐標 map_matrix 輸出的 33 矩陣 函數(shù) cvWarpPerspectiveQMatrix 計算透視變換矩陣
46、,使得: (tixi,tiyi,ti)T=matrix?(xi,yi,1)T 其中 dst(i)=(xi,yi), src(i)=(xi,yi), i=0..3. 形態(tài)學(xué)操作 CreateStructuringElementEx 創(chuàng)建結(jié)構(gòu)元素 IplConvKernel* cvCreateStructuringElementEx( int cols, int rows, int anchor_x, int anchor_y, int shape, int* values=NULL )
47、; cols 結(jié)構(gòu)元素的列數(shù)目 rows 結(jié)構(gòu)元素的行數(shù)目 anchor_x 錨點的相對水平偏移量 anchor_y 錨點的相對垂直便宜量 shape 結(jié)構(gòu)元素的形狀,可以是下列值: CV_SHAPE_RECT, 長方形元素; CV_SHAPE_CROSS, 交錯元素 a cross-shaped element; CV_SHAPE_ELLIPSE, 橢圓元素; CV_SHAPE_CUSTOM, 用戶自定義元素。這種情況下參數(shù) values 定義了 mask,即象素的那個鄰域必須考慮。 values 指向結(jié)構(gòu)元素的指針,它是
48、一個平面數(shù)組,表示對元素矩陣逐行掃描。(非零點表示該點屬于結(jié)構(gòu)元)。如果指針為空,則表示平面數(shù)組中的所有元素都是非零的,即結(jié)構(gòu)元是一個長方形(該參數(shù)僅僅當shape參數(shù)是 CV_SHAPE_CUSTOM 時才予以考慮)。 函數(shù) cv CreateStructuringElementEx 分配和填充結(jié)構(gòu) IplConvKernel, 它可作為形態(tài)操作中的結(jié)構(gòu)元素。 ReleaseStructuringElement 刪除結(jié)構(gòu)元素 void cvReleaseStructuringElement( IplConvKernel** element ); element 被刪除的結(jié)
49、構(gòu)元素的指針 函數(shù) cvReleaseStructuringElement 釋放結(jié)構(gòu) IplConvKernel 。如果 *element 為 NULL, 則函數(shù)不作用。 Erode 使用任意結(jié)構(gòu)元素腐蝕圖像 void cvErode( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 ); src 輸入圖像. dst 輸出圖像. element 用于腐蝕的結(jié)構(gòu)元素。若為 NULL, 則使用 33 長方形的結(jié)構(gòu)元素 iterations 腐蝕的次數(shù)
50、 函數(shù) cvErode 對輸入圖像使用指定的結(jié)構(gòu)元素進行腐蝕,該結(jié)構(gòu)元素決定每個具有最小值象素點的鄰域形狀: dst=erode(src,element): dst(x,y)=min((x,y) in element))src(x+x,y+y) 函數(shù)可能是本地操作,不需另外開辟存儲空間的意思。腐蝕可以重復(fù)進行 (iterations) 次. 對彩色圖像,每個彩色通道單獨處理。 Dilate 使用任意結(jié)構(gòu)元素膨脹圖像 void cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int ite
51、rations=1 ); src 輸入圖像. dst 輸出圖像. element 用于膨脹的結(jié)構(gòu)元素。若為 NULL, 則使用 33 長方形的結(jié)構(gòu)元素 iterations 膨脹的次數(shù) 函數(shù) cvDilate 對輸入圖像使用指定的結(jié)構(gòu)元進行膨脹,該結(jié)構(gòu)決定每個具有最小值象素點的鄰域形狀: dst=dilate(src,element): dst(x,y)=max((x,y) in element))src(x+x,y+y) 函數(shù)支持(in-place)模式。膨脹可以重復(fù)進行 (iterations) 次. 對彩色圖像,每個彩色通道單獨處理。 Mor
52、phologyEx 高級形態(tài)學(xué)變換 void cvMorphologyEx( const CvArr* src, CvArr* dst, CvArr* temp, IplConvKernel* element, int operation, int iterations=1 ); src 輸入圖像. dst 輸出圖像. temp 臨時圖像,某些情況下需要 element 結(jié)構(gòu)元素 operation 形態(tài)操作的類型: CV_MOP_OPEN - 開運算 CV_MOP_CLOSE - 閉運算 CV_MOP
53、_GRADIENT - 形態(tài)梯度 CV_MOP_TOPHAT - "頂帽" CV_MOP_BLACKHAT - "黑帽" iterations 膨脹和腐蝕次數(shù). 函數(shù) cvMorphologyEx 在膨脹和腐蝕基本操作的基礎(chǔ)上,完成一些高級的形態(tài)變換: 開運算: dst=open(src,element)=dilate(erode(src,element),element) 閉運算: dst=close(src,element)=erode(dilate(src,element),element) 形態(tài)梯度 dst=morph_grad(src,element
54、)=dilate(src,element)-erode(src,element) "頂帽": dst=tophat(src,element)=src-open(src,element) "黑帽": dst=blackhat(src,element)=close(src,element)-src 臨時圖像 temp 在形態(tài)梯度以及對“頂帽”和“黑帽”操作時的 in-place 模式下需要。 濾波器與彩色變換 Smooth 各種方法的圖像平滑 void cvSmooth( const CvArr* src, CvArr* dst,
55、 int smoothtype=CV_GAUSSIAN, int param1=3, int param2=0, double param3=0 ); src 輸入圖像. dst 輸出圖像. smoothtype 平滑方法: CV_BLUR_NO_SCALE (簡單不帶尺度變換的模糊) - 對每個象素的 param1param2 領(lǐng)域求和。如果鄰域大小是變化的,可以事先利用函數(shù) cvIntegral 計算積分圖像。 CV_BLUR (simple blur) - 對每個象素param1param2鄰域 求和并做尺度變換 1/(p
56、aram1?param2). CV_GAUSSIAN (gaussian blur) - 對圖像進行核大小為 param1param2 的高斯卷積 CV_MEDIAN (median blur) - 對圖像進行核大小為param1param1 的中值濾波 (i.e. 鄰域是方的). CV_BILATERAL (雙向濾波) - 應(yīng)用雙向 3x3 濾波,彩色 sigma=param1,空間 sigma=param2. 關(guān)于雙向濾波,可參考 param1 平滑操作的第一個參數(shù). param2 平滑操作的第二個參數(shù). 對于簡單/非尺度變換的高斯模糊的情況,如果par
57、am2的值 為零,則表示其被設(shè)定為param1。 param3 對應(yīng)高斯參數(shù)的 Gaussian sigma (標準差). 如果為零,則標準差由下面的核尺寸計算: sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 對應(yīng)水平核, n=param2 對應(yīng)垂直核. 對小的卷積核 (33 to 77) 使用如上公式所示的標準 sigma 速度會快。如果 param3 不為零,而 param1 和 par
58、am2 為零,則核大小有 sigma 計算 (以保證足夠精確的操作). 函數(shù) cvSmooth 可使用上面任何一種方法平滑圖像。每一種方法都有自己的特點以及局限。 沒有縮放的圖像平滑僅支持單通道圖像,并且支持8位到16位的轉(zhuǎn)換(與cvSobel和cvaplace相似)和32位浮點數(shù)到32位浮點數(shù)的變換格式。 簡單模糊和高斯模糊支持 1- 或 3-通道, 8-比特 和 32-比特 浮點圖像。這兩種方法可以(in-place)方式處理圖像。 中值和雙向濾波工作于 1- 或 3-通道, 8-位圖像,但是不能以 in-place 方式處理圖像. Filter2D 對圖像做卷積 vo
59、id cvFilter2D( const CvArr* src, CvArr* dst, const CvMat* kernel, CvPoint anchor=cvPoint(-1,-1)); #define cvConvolve2D cvFilter2D src 輸入圖像. dst 輸出圖像. kernel 卷積核, 單通道浮點矩陣. 如果想要應(yīng)用不同的核于不同的通道,先用 cvSplit 函數(shù)分解圖像到單個色彩通道上,然后單獨處理。 anchor 核的錨點表示一個被濾波的點在核內(nèi)的位置
60、。 錨點應(yīng)該處于核內(nèi)部。缺省值 (-1,-1) 表示錨點在核中心。 函數(shù) cvFilter2D 對圖像進行線性濾波,支持 In-place 操作。當核運算部分超出輸入圖像時,函數(shù)從最近鄰的圖像內(nèi)部象素差值得到邊界外面的象素值。 Integral 計算積分圖像 void cvIntegral( const CvArr* image, CvArr* sum, CvArr* sqsum=NULL, CvArr* tilted_sum=NULL ); image 輸入圖像, WH, 單通道,8位或浮點 (32f 或 64f). sum 積分圖像, W+1H+1(譯者注:原
61、文的公式應(yīng)該寫成(W+1)(H+1),避免誤會), 單通道,32位整數(shù)或 double 精度的浮點數(shù)(64f).
sqsum
對象素值平方的積分圖像,W+1H+1(譯者注:原文的公式應(yīng)該寫成(W+1)(H+1),避免誤會), 單通道,32位整數(shù)或 double 精度的浮點數(shù) (64f).
tilted_sum
旋轉(zhuǎn)45度的積分圖像,單通道,32位整數(shù)或 double 精度的浮點數(shù) (64f).
函數(shù) cvIntegral 計算一次或高次積分圖像:
sum(X,Y)=sumx 62、)2
tilted_sum(X,Y)=sumy 63、de );
src
輸入的 8-比特 或浮點圖像.
dst
輸出的 8-比特 或浮點圖像.
code
色彩空間轉(zhuǎn)換,通過定義 CV_ 64、為 R0 G0 B0 R1 G1 B1 ... 層疊的24-位格式. 函數(shù)做如下變換:
RGB 空間內(nèi)部的變換,如增加/刪除 alpha 通道,反相通道順序,到16位 RGB彩色或者15位RGB彩色的正逆轉(zhuǎn)換(Rx5:Gx6:Rx5),以及到灰度圖像的正逆轉(zhuǎn)換,使用:
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_XYZ 65、2BGR, 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 66、(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)
S=(V-min(R,G,B))*255/V if V!=0, 0 otherwise
(G - B)*60/S, if V=R
H= 180+(B - R)*60/S, if V=G
240+(R -
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023年六年級數(shù)學(xué)下冊6整理和復(fù)習(xí)2圖形與幾何第7課時圖形的位置練習(xí)課件新人教版
- 2023年六年級數(shù)學(xué)下冊6整理和復(fù)習(xí)2圖形與幾何第1課時圖形的認識與測量1平面圖形的認識練習(xí)課件新人教版
- 2023年六年級數(shù)學(xué)下冊6整理和復(fù)習(xí)1數(shù)與代數(shù)第10課時比和比例2作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)下冊4比例1比例的意義和基本性質(zhì)第3課時解比例練習(xí)課件新人教版
- 2023年六年級數(shù)學(xué)下冊3圓柱與圓錐1圓柱第7課時圓柱的體積3作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)下冊3圓柱與圓錐1圓柱第1節(jié)圓柱的認識作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)下冊2百分數(shù)(二)第1節(jié)折扣和成數(shù)作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)下冊1負數(shù)第1課時負數(shù)的初步認識作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)上冊期末復(fù)習(xí)考前模擬期末模擬訓(xùn)練二作業(yè)課件蘇教版
- 2023年六年級數(shù)學(xué)上冊期末豐收園作業(yè)課件蘇教版
- 2023年六年級數(shù)學(xué)上冊易錯清單十二課件新人教版
- 標準工時講義
- 2021年一年級語文上冊第六單元知識要點習(xí)題課件新人教版
- 2022春一年級語文下冊課文5識字測評習(xí)題課件新人教版
- 2023年六年級數(shù)學(xué)下冊6整理和復(fù)習(xí)4數(shù)學(xué)思考第1課時數(shù)學(xué)思考1練習(xí)課件新人教版