CV參考手冊(cè).doc
《CV參考手冊(cè).doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《CV參考手冊(cè).doc(127頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、CV 參考手冊(cè)
HUNNISH 注:
本翻譯是直接根據(jù) OpenCV Beta 4.0 版本的用戶手冊(cè)翻譯的,原文件是:
2、 梯度, 邊緣和角點(diǎn) o 采樣 差值和幾何變換 o 形態(tài)學(xué)操作 o 濾波和彩色變換 o 金字塔及其應(yīng)用 o 連接組件 o 圖像和輪廓矩 o 特殊圖像變換 o 直方圖 o 匹配 結(jié)構(gòu)分析 o 輪廓處理 o 計(jì)算幾何 o 平面劃分 運(yùn)動(dòng)分析和對(duì)象跟蹤 o 背景統(tǒng)計(jì)量的累積 o 運(yùn)動(dòng)模板 o 對(duì)象跟蹤 o 光流 o 預(yù)估器 模式識(shí)別 o 目標(biāo)檢測(cè) 照相機(jī)定標(biāo)和三維重建 o 照相機(jī)定標(biāo) o 姿態(tài)估計(jì) o 極線幾何 函數(shù)列表 參考 圖像處理 注意: 本章描述圖像處理和分析
3、的一些函數(shù)。其中大多數(shù)函數(shù)都是針對(duì)兩維象素?cái)?shù)組的,這里,我們稱這些數(shù)組為“圖像”,但是它們不一定非得是IplImage 結(jié)構(gòu),也可以是CvMat或者CvMatND結(jié)構(gòu)。 梯度、邊緣和角點(diǎn) Sobel 使用擴(kuò)展 Sobel 算子計(jì)算一階、二階、三階或混合圖像差分 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 擴(kuò)展 Sobel 核的大小,必須是 1, 3, 5 或 7。 除了尺寸為 1, 其它情況下, aperture_size aperture_size 可分離內(nèi)核將用來(lái)計(jì)算差分。對(duì) aperture_size=1的情況, 使用 3x1 或 1x3 內(nèi)核 (不進(jìn)行高斯平滑操作)。這里有一個(gè)特殊變量 CV_SCHARR (=-1),對(duì)應(yīng) 3x3 Scharr 濾波器,可以給出比 3x3 Sobel 濾波更精確的結(jié)果。Scharr 濾波器系數(shù)是: | -3 0 3| |-10 0 10| | -3 0 3| 對(duì) x-方向 以及轉(zhuǎn)置矩陣對(duì) y-方向。
5、 函數(shù) cvSobel 通過(guò)對(duì)圖像用相應(yīng)的內(nèi)核進(jìn)行卷積操作來(lái)計(jì)算圖像差分: dst(x,y) = dxorder+yodersrc/dxxorder?dyyorder |(x,y) 由于Sobel 算子結(jié)合了 Gaussian 平滑和微分,所以,其結(jié)果或多或少對(duì)噪聲有一定的魯棒性。通常情況,函數(shù)調(diào)用采用如下參數(shù) (xorder=1, yorder=0, aperture_size=3) 或 (xorder=0, yorder=1, aperture_size=3) 來(lái)計(jì)算一階 x- 或 y- 方向的圖像差分。第一種情況對(duì)應(yīng): |-1 0 1| |-2 0 2|
6、 |-1 0 1| 核。第二種對(duì)應(yīng) |-1 -2 -1| | 0 0 0| | 1 2 1| or | 1 2 1| | 0 0 0| |-1 -2 -1| 核的選則依賴于圖像原點(diǎn)的定義 (origin 來(lái)自 IplImage 結(jié)構(gòu)的定義)。由于該函數(shù)不進(jìn)行圖像尺度變換,所以和輸入圖像(數(shù)組)相比,輸出圖像(數(shù)組)的元素通常具有更大的絕對(duì)數(shù)值(譯者注:即象素的深度)。為防止溢出,當(dāng)輸入圖像是 8 位的,要求輸出圖像是 16 位的。當(dāng)然可以用函數(shù)函數(shù) cvConvertScale 或 cvConvertScaleAbs 轉(zhuǎn)換為 8
7、位的。除了 8-比特 圖像,函數(shù)也接受 32-位 浮點(diǎn)數(shù)圖像。所有輸入和輸出圖像都必須是單通道的,并且具有相同的圖像尺寸或者ROI尺寸。 Laplace 計(jì)算圖像的 Laplacian變換 void cvLaplace( const CvArr* src, CvArr* dst, int aperture_size=3 ); src 輸入圖像. dst 輸出圖像. aperture_size 核大小 (與 cvSobel 中定義一樣). 函數(shù) cvLaplace 計(jì)算輸入圖像的 Laplacian變換,方法是先用 sobel 算子計(jì)算二階 x- 和 y-
8、差分,再求和: dst(x,y) = d2src/dx2 + d2src/dy2 對(duì) aperture_size=1 則給出最快計(jì)算結(jié)果,相當(dāng)于對(duì)圖像采用如下內(nèi)核做卷積: |0 1 0| |1 -4 1| |0 1 0| 類似于 cvSobel 函數(shù),該函數(shù)也不作圖像的尺度變換,所支持的輸入、輸出圖像類型的組合和cvSobel一致。 Canny 采用 Canny 算法做邊緣檢測(cè) void cvCanny( const CvArr* image, CvArr* edges, double threshold1, double thr
9、eshold2, int aperture_size=3 ); image 輸入圖像. edges 輸出的邊緣圖像 threshold1 第一個(gè)閾值 threshold2 第二個(gè)閾值 aperture_size Sobel 算子內(nèi)核大小 (見(jiàn) cvSobel). 函數(shù) cvCanny 采用 CANNY 算法發(fā)現(xiàn)輸入圖像的邊緣而且在輸出圖像中標(biāo)識(shí)這些邊緣。threshold1和threshold2 當(dāng)中的小閾值用來(lái)控制邊緣連接,大的閾值用來(lái)控制強(qiáng)邊緣的初始分割。 PreCornerDetect 計(jì)算用于角點(diǎn)檢測(cè)的特征圖, void cvPreC
10、ornerDetect( const CvArr* image, CvArr* corners, int aperture_size=3 ); image 輸入圖像. corners 保存候選角點(diǎn)的特征圖 aperture_size Sobel 算子的核大小(見(jiàn)cvSobel). 函數(shù) cvPreCornerDetect 計(jì)算函數(shù) Dx2Dyy+Dy2Dxx - 2DxDyDxy 其中 D? 表示一階圖像差分,D?? 表示二階圖像差分。 角點(diǎn)被認(rèn)為是函數(shù)的局部最大值: // 假設(shè)圖像格式為浮點(diǎn)數(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 計(jì)算圖像塊的特征值和特征向量,用于角點(diǎn)檢測(cè) void cvCornerEigenValsAndVecs( const CvArr* image, CvArr* eigenvv, int block_size, int aperture_size=3 ); image 輸入圖像. eigenvv 保存結(jié)果的數(shù)組。必須比輸入圖像寬
13、6 倍。 block_size 鄰域大小 (見(jiàn)討論). aperture_size Sobel 算子的核尺寸(見(jiàn) cvSobel). 對(duì)每個(gè)象素,函數(shù) cvCornerEigenValsAndVecs 考慮 block_size block_size 大小的鄰域 S(p),然后在鄰域上計(jì)算圖像差分的相關(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、| 然后它計(jì)算矩陣的特征值和特征向量,并且按如下方式(λ1, λ2, x1, y1, x2, y2)存儲(chǔ)這些值到輸出圖像中,其中 λ1, λ2 - M 的特征值,沒(méi)有排序 (x1, y1) - 特征向量,對(duì) λ1 (x2, y2) - 特征向量,對(duì) λ2 CornerMinEigenVal 計(jì)算梯度矩陣的最小特征值,用于角點(diǎn)檢測(cè) void cvCornerMinEigenVal( const CvArr* image, CvArr* eigenval, int block_size, int aperture_size=3 ); image 輸入圖像. eige
15、nval 保存最小特征值的圖像. 與輸入圖像大小一致 block_size 鄰域大小 (見(jiàn)討論 cvCornerEigenValsAndVecs). aperture_size Sobel 算子的核尺寸(見(jiàn) cvSobel). 當(dāng)輸入圖像是浮點(diǎn)數(shù)格式時(shí),該參數(shù)表示用來(lái)計(jì)算差分固定的浮點(diǎn)濾波器的個(gè)數(shù). 函數(shù) cvCornerMinEigenVal 與 cvCornerEigenValsAndVecs 類似,但是它僅僅計(jì)算和存儲(chǔ)每個(gè)象素點(diǎn)差分相關(guān)矩陣的最小特征值,即前一個(gè)函數(shù)的 min(λ1, λ2) FindCornerSubPix 精確角點(diǎn)位置 void c
16、vFindCornerSubPix( const CvArr* image, CvPoint2D32f* corners, int count, CvSize win, CvSize zero_zone, CvTermCriteria criteria ); image 輸入圖像. corners 輸入角點(diǎn)的初始坐標(biāo),也存儲(chǔ)精確的輸出坐標(biāo) count 角點(diǎn)數(shù)目 win 搜索窗口的一半尺寸。如果 win=(5,5) 那么使用 5*2+1 5*2+1 = 11
17、11 大小的搜索窗口 zero_zone 死區(qū)的一半尺寸,死區(qū)為不對(duì)搜索區(qū)的中央位置做求和運(yùn)算的區(qū)域。它是用來(lái)避免自相關(guān)矩陣出現(xiàn)的某些可能的奇異性。當(dāng)值為 (-1,-1) 表示沒(méi)有死區(qū)。 criteria 求角點(diǎn)的迭代過(guò)程的終止條件。即角點(diǎn)位置的確定,要么迭代數(shù)大于某個(gè)設(shè)定值,或者是精確度達(dá)到某個(gè)設(shè)定值。 criteria 可以是最大迭代數(shù)目,或者是設(shè)定的精確度,也可以是它們的組合。 函數(shù) cvFindCornerSubPix 通過(guò)迭代來(lái)發(fā)現(xiàn)具有子象素精度的角點(diǎn)位置,或如圖所示的放射鞍點(diǎn)(radial saddle points)。 子象素級(jí)角點(diǎn)定位的實(shí)現(xiàn)是基于對(duì)向量
18、正交性的觀測(cè)而實(shí)現(xiàn)的,即從中央點(diǎn)q到其鄰域點(diǎn)p 的向量和p點(diǎn)處的圖像梯度正交(服從圖像和測(cè)量噪聲)。考慮以下的表達(dá)式: εi=DIpiT?(q-pi) 其中,DIpi表示在q的一個(gè)鄰域點(diǎn)pi處的圖像梯度,q的值通過(guò)最小化εi得到。通過(guò)將εi設(shè)為0,可以建立系統(tǒng)方程如下: sumi(DIpi?DIpiT)?q - sumi(DIpi?DIpiT?pi) = 0 其中q的鄰域(搜索窗)中的梯度被累加。調(diào)用第一個(gè)梯度參數(shù)G和第二個(gè)梯度參數(shù)b,得到: q=G-1?b 該算法將搜索窗的中心設(shè)為新的中心q,然后迭代,直到找到低于某個(gè)閾值點(diǎn)的中心位置。 GoodFeaturesToT
19、rack 確定圖像的強(qiáng)角點(diǎn) 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-位或浮點(diǎn)32-比特,單通道 eig_image 臨時(shí)浮點(diǎn)32-位圖像,尺寸與輸入圖像一致 temp_image 另外一個(gè)臨時(shí)圖像,格式與尺寸與 eig_image 一致 corners 輸出參數(shù),檢測(cè)到的角點(diǎn) corner_count 輸出參數(shù),檢測(cè)到的角點(diǎn)數(shù)目 quality_level 最大最小特征值的乘法因子。定義可接受圖像角點(diǎn)的最小質(zhì)量因子。 min_distance 限制因子。得到的角點(diǎn)的最小距離。使用 Euclidian 距離 mask ROI:感興趣區(qū)域。函數(shù)在ROI中計(jì)算角點(diǎn),如果 mask
21、為 NULL,則選擇整個(gè)圖像。 函數(shù) cvGoodFeaturesToTrack 在圖像中尋找具有大特征值的角點(diǎn)。該函數(shù),首先用cvCornerMinEigenVal 計(jì)算輸入圖像的每一個(gè)象素點(diǎn)的最小特征值,并將結(jié)果存儲(chǔ)到變量 eig_image 中。然后進(jìn)行非最大值抑制(僅保留3x3鄰域中的局部最大值)。下一步將最小特征值小于 quality_level?max(eig_image(x,y)) 排除掉。最后,函數(shù)確保所有發(fā)現(xiàn)的角點(diǎn)之間具有足夠的距離,(最強(qiáng)的角點(diǎn)第一個(gè)保留,然后檢查新的角點(diǎn)與已有角點(diǎn)之間的距離大于 min_distance )。 采樣、差值和幾何變換 Init
22、LineIterator 初始化線段迭代器 int cvInitLineIterator( const CvArr* image, CvPoint pt1, CvPoint pt2, CvLineIterator* line_iterator, int connectivity=8 ); image 帶采線段的輸入圖像. pt1 線段起始點(diǎn) pt2 線段結(jié)束點(diǎn) line_iterator 指向線段迭代器狀態(tài)結(jié)構(gòu)的指針 connectivity 被掃描線段的連通數(shù),4 或 8. 函數(shù) cvInitLi
23、neIterator 初始化線段迭代器,并返回兩點(diǎn)之間的象素點(diǎn)數(shù)目。兩個(gè)點(diǎn)必須在圖像內(nèi)。當(dāng)?shù)鞒跏蓟?,連接兩點(diǎn)的光柵線上所有點(diǎn),都可以連續(xù)通過(guò)調(diào)用 CV_NEXT_LINE_POINT 來(lái)得到。線段上的點(diǎn)是使用 4-連通或8-連通利用 Bresenham 算法逐點(diǎn)計(jì)算的。 例子:使用線段迭代器計(jì)算彩色線上象素值的和 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 起點(diǎn) pt2 終點(diǎn) buffer 存儲(chǔ)線段點(diǎn)的緩存區(qū),必須有足夠大小來(lái)存儲(chǔ)點(diǎn) 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 實(shí)現(xiàn)了線段迭代器的
28、一個(gè)特殊應(yīng)用。它讀取由兩點(diǎn) pt1 和 pt2 確定的線段上的所有圖像點(diǎn),包括終點(diǎn),并存儲(chǔ)到緩存中。 GetRectSubPix 從圖像中提取象素矩形,使用子象素精度 void cvGetRectSubPix( const CvArr* src, CvArr* dst, CvPoint2D32f center ); src 輸入圖像. dst 提取的矩形. center 提取的象素矩形的中心,浮點(diǎn)數(shù)坐標(biāo)。中心必須位于圖像內(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ù)象素點(diǎn)坐標(biāo)采用雙線性差值提取。對(duì)多通道圖像,每個(gè)通道獨(dú)立單獨(dú)完成提取。盡管函數(shù)要求矩形的中心一定要在輸入圖像之中,但是有可能出現(xiàn)矩形的一部分超出圖像邊界的情況,這時(shí),該函數(shù)復(fù)制邊界的模識(shí)(hunnish:即用于矩形相交的圖像邊界線段的象素來(lái)代替矩形超越部分的象素)。 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] (見(jiàn)討論). fill_outliers 該標(biāo)志位指定是否對(duì)原始圖像邊界外面的象素點(diǎn)使用復(fù)制模式(fill_outliers=0)進(jìn)行差值或者將其設(shè)置為指定值(fill_outliers=1)。 fill_value 對(duì)超出圖像邊界的矩形象素設(shè)定
31、的值(當(dāng) fill_outliers=1時(shí)的情況). 函數(shù) cvGetQuadrangleSubPix 以子象素精度從圖像 src 中提取四邊形,使用子象素精度,并且將結(jié)果存儲(chǔ)于 dst ,計(jì)算公式是: dst(x+width(dst)/2, y+height(dst)/2)= src( A11x+A12y+b1, A21x+A22y+b2), w其中 A和 b 均來(lái)自映射矩陣(譯者注:A, b為幾何形變參數(shù)) map_matrix | A11 A12 b1 | map_matrix = | | |
32、A21 A22 b2 | 其中在非整數(shù)坐標(biāo) A?(x,y)T+b 的象素點(diǎn)值通過(guò)雙線性變換得到。多通道圖像的每一個(gè)通道都單獨(dú)計(jì)算. 例子:使用 cvGetQuadrangleSubPix 進(jìn)行圖像旋轉(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)系重采樣。當(dāng)圖像縮小時(shí)候,該方法可以避免波紋出現(xiàn)。當(dāng)圖像放大時(shí),類似于 CV_INTER_NN 方法.. CV_INTER_CUBIC - 立方差值. 函數(shù) cvResize 將圖像 src 改變尺寸得到與 dst 同樣大小。若設(shè)定 ROI,函數(shù)將按常規(guī)支持 ROI. WarpAffine 對(duì)圖像做仿射變換 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 插值方法和以下開(kāi)關(guān)選項(xiàng)的組合: CV_WARP_FILL_OUTLIERS - 填充所有縮小圖像的象素。如果部分象素落在輸入圖像的邊界外,那么它們的值設(shè)定為 fillval. CV_WARP_INVERSE_MAP - 指定 matrix 是輸出圖像到輸入圖像的反變換,因此可以直接用來(lái)做象素差
39、值。否則, 函數(shù)從 map_matrix 得到反變換。 fillval 用來(lái)填充邊界外面的值 函數(shù) cvWarpAffine 利用下面指定的矩陣變換輸入圖像: dst(x',y')<-src(x,y) 如果沒(méi)有指定 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ù)類型,有更大的資源開(kāi)銷(因此對(duì)小圖像不太合適)而且輸出圖像的部分可以保留不變。而 cvGetQuadrangleSubPix 可以精確地從8位圖像中提取四邊形到浮點(diǎn)數(shù)緩存區(qū)中,具有比較小的系統(tǒng)開(kāi)銷,而且總是全部改變輸出圖像的內(nèi)容。 要變換稀疏矩陣,使用 cxcore 中的函數(shù) cvTransform 。 2DRotationMatrix 計(jì)算二維旋轉(zhuǎn)的仿射變換矩陣 CvMat* cv2DRotationMatrix( CvPoint2D32f center, double angle, double scale,
41、CvMat* map_matrix ); center 輸入圖像的旋轉(zhuǎn)中心坐標(biāo) angle 旋轉(zhuǎn)角度(度)。正值表示逆時(shí)針旋轉(zhuǎn)(坐標(biāo)原點(diǎn)假設(shè)在左上角). scale 各項(xiàng)同性的尺度因子 map_matrix 輸出 23 矩陣的指針 函數(shù) cv2DRotationMatrix 計(jì)算矩陣: [ α β | (1-α)*center.x - β*center.y ] [ -β α | β*center.x + (1-α)*center.y ] where α=scale*cos(angle), β=scale*sin(angle) 該變換并
42、不改變?cè)夹D(zhuǎn)中心點(diǎn)的坐標(biāo),如果這不是操作目的,則可以通過(guò)調(diào)整平移量改變其坐標(biāo)(譯者注:通過(guò)簡(jiǎn)單的推導(dǎo)可知,放射變換的實(shí)現(xiàn)是首先將旋轉(zhuǎn)中心置為坐標(biāo)原點(diǎn),再進(jìn)行旋轉(zhuǎn)和尺度變換,最后重新將坐標(biāo)原點(diǎn)設(shè)定為輸入圖像的左上角,這里的平移量是center.x, center.y). WarpPerspective 對(duì)圖像進(jìn)行透視變換 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 插值方法和以下開(kāi)關(guān)選項(xiàng)的組合: CV_WARP_FILL_OUTLIERS - 填充所有縮小圖像的象素。如果部分象素落在輸入圖像的邊界外,那么它們的值設(shè)定為 fillval. CV_WARP_INVERSE_MAP - 指定 matrix 是輸出圖像到輸入圖像的反變換,因此可以直接用來(lái)做象素差值。否則, 函
44、數(shù)從 map_matrix 得到反變換。 fillval 用來(lái)填充邊界外面的值 函數(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個(gè)對(duì)應(yīng)點(diǎn)計(jì)算透視變換矩陣 CvMat* cvWarpPerspectiveQMatrix( const CvPoint2D32f* src, const CvPoint2D32f* dst, CvMat* map_matrix ); src 輸入圖像的四邊形的4個(gè)點(diǎn)坐標(biāo) dst 輸出圖像的對(duì)應(yīng)四邊形的4個(gè)點(diǎn)坐標(biāo) map_matrix 輸出的 33 矩陣 函數(shù) cvWarpPerspectiveQMatrix 計(jì)算透視變換矩陣
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 錨點(diǎn)的相對(duì)水平偏移量 anchor_y 錨點(diǎn)的相對(duì)垂直便宜量 shape 結(jié)構(gòu)元素的形狀,可以是下列值: CV_SHAPE_RECT, 長(zhǎng)方形元素; CV_SHAPE_CROSS, 交錯(cuò)元素 a cross-shaped element; CV_SHAPE_ELLIPSE, 橢圓元素; CV_SHAPE_CUSTOM, 用戶自定義元素。這種情況下參數(shù) values 定義了 mask,即象素的那個(gè)鄰域必須考慮。 values 指向結(jié)構(gòu)元素的指針,它是
48、一個(gè)平面數(shù)組,表示對(duì)元素矩陣逐行掃描。(非零點(diǎn)表示該點(diǎn)屬于結(jié)構(gòu)元)。如果指針為空,則表示平面數(shù)組中的所有元素都是非零的,即結(jié)構(gòu)元是一個(gè)長(zhǎng)方形(該參數(shù)僅僅當(dāng)shape參數(shù)是 CV_SHAPE_CUSTOM 時(shí)才予以考慮)。 函數(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 長(zhǎng)方形的結(jié)構(gòu)元素 iterations 腐蝕的次數(shù)
50、 函數(shù) cvErode 對(duì)輸入圖像使用指定的結(jié)構(gòu)元素進(jìn)行腐蝕,該結(jié)構(gòu)元素決定每個(gè)具有最小值象素點(diǎn)的鄰域形狀: dst=erode(src,element): dst(x,y)=min((x,y) in element))src(x+x,y+y) 函數(shù)可能是本地操作,不需另外開(kāi)辟存儲(chǔ)空間的意思。腐蝕可以重復(fù)進(jìn)行 (iterations) 次. 對(duì)彩色圖像,每個(gè)彩色通道單獨(dú)處理。 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 長(zhǎng)方形的結(jié)構(gòu)元素 iterations 膨脹的次數(shù) 函數(shù) cvDilate 對(duì)輸入圖像使用指定的結(jié)構(gòu)元進(jìn)行膨脹,該結(jié)構(gòu)決定每個(gè)具有最小值象素點(diǎn)的鄰域形狀: dst=dilate(src,element): dst(x,y)=max((x,y) in element))src(x+x,y+y) 函數(shù)支持(in-place)模式。膨脹可以重復(fù)進(jìn)行 (iterations) 次. 對(duì)彩色圖像,每個(gè)彩色通道單獨(dú)處理。 Mor
52、phologyEx 高級(jí)形態(tài)學(xué)變換 void cvMorphologyEx( const CvArr* src, CvArr* dst, CvArr* temp, IplConvKernel* element, int operation, int iterations=1 ); src 輸入圖像. dst 輸出圖像. temp 臨時(shí)圖像,某些情況下需要 element 結(jié)構(gòu)元素 operation 形態(tài)操作的類型: CV_MOP_OPEN - 開(kāi)運(yùn)算 CV_MOP_CLOSE - 閉運(yùn)算 CV_MOP
53、_GRADIENT - 形態(tài)梯度 CV_MOP_TOPHAT - "頂帽" CV_MOP_BLACKHAT - "黑帽" iterations 膨脹和腐蝕次數(shù). 函數(shù) cvMorphologyEx 在膨脹和腐蝕基本操作的基礎(chǔ)上,完成一些高級(jí)的形態(tài)變換: 開(kāi)運(yùn)算: dst=open(src,element)=dilate(erode(src,element),element) 閉運(yùn)算: 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 臨時(shí)圖像 temp 在形態(tài)梯度以及對(duì)“頂帽”和“黑帽”操作時(shí)的 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 (簡(jiǎn)單不帶尺度變換的模糊) - 對(duì)每個(gè)象素的 param1param2 領(lǐng)域求和。如果鄰域大小是變化的,可以事先利用函數(shù) cvIntegral 計(jì)算積分圖像。 CV_BLUR (simple blur) - 對(duì)每個(gè)象素param1param2鄰域 求和并做尺度變換 1/(p
56、aram1?param2). CV_GAUSSIAN (gaussian blur) - 對(duì)圖像進(jìn)行核大小為 param1param2 的高斯卷積 CV_MEDIAN (median blur) - 對(duì)圖像進(jìn)行核大小為param1param1 的中值濾波 (i.e. 鄰域是方的). CV_BILATERAL (雙向?yàn)V波) - 應(yīng)用雙向 3x3 濾波,彩色 sigma=param1,空間 sigma=param2. 關(guān)于雙向?yàn)V波,可參考 param1 平滑操作的第一個(gè)參數(shù). param2 平滑操作的第二個(gè)參數(shù). 對(duì)于簡(jiǎn)單/非尺度變換的高斯模糊的情況,如果par
57、am2的值 為零,則表示其被設(shè)定為param1。 param3 對(duì)應(yīng)高斯參數(shù)的 Gaussian sigma (標(biāo)準(zhǔn)差). 如果為零,則標(biāo)準(zhǔn)差由下面的核尺寸計(jì)算: sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 對(duì)應(yīng)水平核, n=param2 對(duì)應(yīng)垂直核. 對(duì)小的卷積核 (33 to 77) 使用如上公式所示的標(biāo)準(zhǔn) sigma 速度會(huì)快。如果 param3 不為零,而 param1 和 par
58、am2 為零,則核大小有 sigma 計(jì)算 (以保證足夠精確的操作). 函數(shù) cvSmooth 可使用上面任何一種方法平滑圖像。每一種方法都有自己的特點(diǎn)以及局限。 沒(méi)有縮放的圖像平滑僅支持單通道圖像,并且支持8位到16位的轉(zhuǎn)換(與cvSobel和cvaplace相似)和32位浮點(diǎn)數(shù)到32位浮點(diǎn)數(shù)的變換格式。 簡(jiǎn)單模糊和高斯模糊支持 1- 或 3-通道, 8-比特 和 32-比特 浮點(diǎn)圖像。這兩種方法可以(in-place)方式處理圖像。 中值和雙向?yàn)V波工作于 1- 或 3-通道, 8-位圖像,但是不能以 in-place 方式處理圖像. Filter2D 對(duì)圖像做卷積 vo
59、id cvFilter2D( const CvArr* src, CvArr* dst, const CvMat* kernel, CvPoint anchor=cvPoint(-1,-1)); #define cvConvolve2D cvFilter2D src 輸入圖像. dst 輸出圖像. kernel 卷積核, 單通道浮點(diǎn)矩陣. 如果想要應(yīng)用不同的核于不同的通道,先用 cvSplit 函數(shù)分解圖像到單個(gè)色彩通道上,然后單獨(dú)處理。 anchor 核的錨點(diǎn)表示一個(gè)被濾波的點(diǎn)在核內(nèi)的位置
60、。 錨點(diǎn)應(yīng)該處于核內(nèi)部。缺省值 (-1,-1) 表示錨點(diǎn)在核中心。 函數(shù) cvFilter2D 對(duì)圖像進(jìn)行線性濾波,支持 In-place 操作。當(dāng)核運(yùn)算部分超出輸入圖像時(shí),函數(shù)從最近鄰的圖像內(nèi)部象素差值得到邊界外面的象素值。 Integral 計(jì)算積分圖像 void cvIntegral( const CvArr* image, CvArr* sum, CvArr* sqsum=NULL, CvArr* tilted_sum=NULL ); image 輸入圖像, WH, 單通道,8位或浮點(diǎn) (32f 或 64f). sum 積分圖像, W+1H+1(譯者注:原
61、文的公式應(yīng)該寫成(W+1)(H+1),避免誤會(huì)), 單通道,32位整數(shù)或 double 精度的浮點(diǎn)數(shù)(64f).
sqsum
對(duì)象素值平方的積分圖像,W+1H+1(譯者注:原文的公式應(yīng)該寫成(W+1)(H+1),避免誤會(huì)), 單通道,32位整數(shù)或 double 精度的浮點(diǎn)數(shù) (64f).
tilted_sum
旋轉(zhuǎn)45度的積分圖像,單通道,32位整數(shù)或 double 精度的浮點(diǎn)數(shù) (64f).
函數(shù) cvIntegral 計(jì)算一次或高次積分圖像:
sum(X,Y)=sumx 62、)2
tilted_sum(X,Y)=sumy 63、de );
src
輸入的 8-比特 或浮點(diǎn)圖像.
dst
輸出的 8-比特 或浮點(diǎn)圖像.
code
色彩空間轉(zhuǎn)換,通過(guò)定義 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: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 眼內(nèi)異物的聲像圖表現(xiàn)課件
- 《望海潮》一等獎(jiǎng)?wù)n件
- 配送中心拆零分揀方法綜述
- 中篇_中國(guó)飲食文化與健康(精品)
- 工作分析與職務(wù)說(shuō)明書介紹
- 三、民主管理:共創(chuàng)幸福生活
- 秋天的懷念(精品)(精品)
- 前山湘之泉米粉加工廠
- 經(jīng)濟(jì)發(fā)展新常態(tài)下的宏觀調(diào)控與穩(wěn)增長(zhǎng)上課件
- 宿新市徐公店-ppt
- 3.彈力彈簧測(cè)力計(jì) (2)(精品)
- 某公司招聘與配置培訓(xùn)
- LED發(fā)光原理與顯示屏的制造
- 體系審核及管理評(píng)審
- 人力資源管理之人員配備教材