?? opencv 圖像處理和計算機視覺參考手冊.htm
字號:
cvSubS( corners, dilated_corners, corners );
cvCmpS( corners, 0, corner_mask, CV_CMP_GE );
cvReleaseImage( &corners );
cvReleaseImage( &dilated_corners );
</PRE>
<HR>
<H3><A name=decl_cvCornerEigenValsAndVecs>CornerEigenValsAndVecs</A></H3>
<P class=Blurb><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Helvetica; mso-hansi-font-family: Helvetica">計算圖像塊的特征值和特征向量,用于角點檢測</SPAN></P><PRE>void cvCornerEigenValsAndVecs( const CvArr* image, CvArr* eigenvv,
int block_size, int aperture_size=3 );
</PRE>
<P>
<DL>
<DT>image
<DD>輸入圖像.
<DT>eigenvv
<DD>保存結(jié)果的數(shù)組。必須比輸入圖像寬 6 倍。
<DT>block_size
<DD>鄰域大小 (見討論).
<DT>aperture_size
<DD>Sobel 算子的核尺寸(見 <A
href="http://fsa.ia.ac.cn/opencv-doc-cn/opencv-doc-cn-0.9.7/ref/opencvref_cv.cn.htm#decl_cvSobel">cvSobel</A>).
</DD></DL>
<P>對每個象素,函數(shù) <A
href="http://fsa.ia.ac.cn/opencv-doc-cn/opencv-doc-cn-0.9.7/ref/opencvref_cv.cn.htm#decl_cvCornerEigenValsAndVecs">cvCornerEigenValsAndVecs</A>
考慮 <CODE>block_size</SPAN></CODE> × <CODE>block_size</SPAN></CODE> 大小的鄰域
S(p),然后在鄰域上計算圖像差分的相關(guān)矩陣:</P><PRE> | sum<SUB>S(p)</SUB>(dI/dx)<SUP>2</SUP> sum<SUB>S(p)</SUB>(dI/dx•dI/dy)|
M = | |
| sum<SUB>S(p)</SUB>(dI/dx•dI/dy) sum<SUB>S(p)</SUB>(dI/dy)<SUP>2</SUP> |
</PRE>
<P>然后它計算矩陣的特征值和特征向量,并且按如下方式(λ<SUB>1</SUB>, λ<SUB>2</SUB>, x<SUB>1</SUB>,
y<SUB>1</SUB>, x<SUB>2</SUB>, y<SUB>2</SUB>)存儲這些值到輸出圖像中,其中<BR><BR>λ<SUB>1</SUB>,
λ<SUB>2</SUB> - <CODE>M 的</SPAN></CODE>特征值,沒有排序<BR>(x<SUB>1</SUB>,
y<SUB>1</SUB>) - 特征向量,對 λ<SUB>1</SUB><BR>(x<SUB>2</SUB>, y<SUB>2</SUB>) - 特征向量,對
λ<SUB>2</SUB><BR></P>
<HR>
<H3><A name=decl_cvCornerMinEigenVal>CornerMinEigenVal</A></H3>
<P class=Blurb><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Helvetica; mso-hansi-font-family: Helvetica">計算梯度矩陣的最小特征值,用于角點檢測</SPAN></P><PRE>void cvCornerMinEigenVal( const CvArr* image, CvArr* eigenval, int block_size, int aperture_size=3 );
</PRE>
<P>
<DL>
<DT>image
<DD>輸入圖像.
<DT>eigenval
<DD>保存最小特征值的圖像. 與輸入圖像大小一致
<DT>block_size
<DD>鄰域大小 (見討論 <A
href="http://fsa.ia.ac.cn/opencv-doc-cn/opencv-doc-cn-0.9.7/ref/opencvref_cv.cn.htm#decl_cvCornerEigenValsAndVecs">cvCornerEigenValsAndVecs</A>).
<DT>aperture_size
<DD>Sobel 算子的核尺寸(見 <A
href="http://fsa.ia.ac.cn/opencv-doc-cn/opencv-doc-cn-0.9.7/ref/opencvref_cv.cn.htm#decl_cvSobel">cvSobel</A>).
當輸入圖像是浮點數(shù)格式時,該參數(shù)表示用來計算差分固定的浮點濾波器的個數(shù). </DD></DL>
<P>函數(shù) <A
href="http://fsa.ia.ac.cn/opencv-doc-cn/opencv-doc-cn-0.9.7/ref/opencvref_cv.cn.htm#decl_cvCornerMinEigenVal">cvCornerMinEigenVal</A>
與 <A
href="http://fsa.ia.ac.cn/opencv-doc-cn/opencv-doc-cn-0.9.7/ref/opencvref_cv.cn.htm#decl_cvCornerEigenValsAndVecs">cvCornerEigenValsAndVecs</A>
類似,但是它僅僅計算和存儲每個象素點差分相關(guān)矩陣的最小特征值,即前一個函數(shù)的 min(λ<SUB>1</SUB>, λ<SUB>2</SUB>) </P>
<HR>
<H3><A name=decl_cvFindCornerSubPix>FindCornerSubPix</A></H3>
<P class=Blurb><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Helvetica; mso-hansi-font-family: Helvetica">精確角點位置</SPAN></P><PRE>void cvFindCornerSubPix( const CvArr* image, CvPoint2D32f* corners,
int count, CvSize win, CvSize zero_zone,
CvTermCriteria criteria );
</PRE>
<P>
<DL>
<DT>image
<DD>輸入圖像.
<DT>corners
<DD>輸入角點的初始坐標,也存儲精確的輸出坐標
<DT>count
<DD>角點數(shù)目
<DT>win
<DD>搜索窗口的一半尺寸。如果 <CODE>win</SPAN></CODE>=(5,5) 那么使用 5*2+1 × 5*2+1 = 11 × 11
大小的搜索窗口
<DT>zero_zone
<DD>死區(qū)的一半尺寸,死區(qū)為不對搜索區(qū)的中央位置做求和運算的區(qū)域。它是用來避免自相關(guān)矩陣出現(xiàn)的某些可能的奇異性。當值為 (-1,-1) 表示沒有死區(qū)。
<DT>criteria
<DD>求角點的迭代過程的終止條件。即角點位置的確定,要么迭代數(shù)大于某個設(shè)定值,或者是精確度達到某個設(shè)定值。
<CODE>criteria</SPAN></CODE> 可以是最大迭代數(shù)目,或者是設(shè)定的精確度,也可以是它們的組合。 </DD></DL>
<P>函數(shù) <A
href="http://fsa.ia.ac.cn/opencv-doc-cn/opencv-doc-cn-0.9.7/ref/opencvref_cv.cn.htm#decl_cvFindCornerSubPix">cvFindCornerSubPix</A>
通過迭代來發(fā)現(xiàn)具有子象素精度的角點位置,或如圖所示的放射鞍點(radial saddle points)。</P>
<P><IMG src="OpenCV 圖像處理和計算機視覺參考手冊.files/cornersubpix.png" align=center> </P>
<P>子象素級角點定位的實現(xiàn)是基于對向量正交性的觀測而實現(xiàn)的,即從中央點<CODE>q</CODE>到其鄰域點<CODE>p</CODE>
的向量和<CODE>p</CODE>點處的圖像梯度正交(服從圖像和測量噪聲)。考慮以下的表達式: </P><PRE>ε<SUB>i</SUB>=DI<SUB>p<SUB>i</SUB></SUB><SUP>T</SUP>•(q-p<SUB>i</SUB>)
</PRE>其中,<CODE>DI<SUB>p<SUB>i</SUB></SUB></CODE>表示在<CODE>q</CODE>的一個鄰域點<CODE>p<SUB>i</SUB></CODE>處的圖像梯度,<CODE>q</CODE>的值通過最小化<CODE>ε<SUB>i</SUB></CODE>得到。通過將<CODE>ε<SUB>i</SUB></CODE>設(shè)為0,可以建立系統(tǒng)方程如下:
<PRE>sum<SUB>i</SUB>(DI<SUB>p<SUB>i</SUB></SUB>•DI<SUB>p<SUB>i</SUB></SUB><SUP>T</SUP>)•q - sum<SUB>i</SUB>(DI<SUB>p<SUB>i</SUB></SUB>•DI<SUB>p<SUB>i</SUB></SUB><SUP>T</SUP>•p<SUB>i</SUB>) = 0
</PRE>
<P>其中<CODE>q</CODE>的鄰域(搜索窗)中的梯度被累加。調(diào)用第一個梯度參數(shù)<CODE>G</CODE>和第二個梯度參數(shù)<CODE>b</CODE>,得到:</P><PRE>q=G<SUP>-1</SUP>•b
</PRE>
<P>該算法將搜索窗的中心設(shè)為新的中心<CODE>q</CODE>,然后迭代,直到找到低于某個閾值點的中心位置。 </P>
<HR>
<H3><A name=decl_cvGoodFeaturesToTrack>GoodFeaturesToTrack</A></H3>
<P class=Blurb><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Helvetica; mso-hansi-font-family: Helvetica">確定圖像的強角點</SPAN></P><PRE>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 );
</PRE>
<P>
<DL>
<DT>image
<DD>輸入圖像,8-位或浮點32-比特,單通道
<DT>eig_image
<DD>臨時浮點32-位圖像,尺寸與輸入圖像一致
<DT>temp_image
<DD>另外一個臨時圖像,格式與尺寸與 <CODE>eig_image</SPAN></CODE> 一致
<DT>corners
<DD>輸出參數(shù),檢測到的角點
<DT>corner_count
<DD>輸出參數(shù),檢測到的角點數(shù)目
<DT>quality_level
<DD>最大最小特征值的乘法因子。定義可接受圖像角點的最小質(zhì)量因子。
<DT>min_distance
<DD>限制因子。得到的角點的最小距離。使用 Euclidian 距離
<DT>mask
<DD>ROI:感興趣區(qū)域。函數(shù)在ROI中計算角點,如果 mask 為 NULL,則選擇整個圖像。 </DD></DL>
<P>函數(shù) <A
href="http://fsa.ia.ac.cn/opencv-doc-cn/opencv-doc-cn-0.9.7/ref/opencvref_cv.cn.htm#decl_cvGoodFeaturesToTrack">cvGoodFeaturesToTrack</A>
在圖像中尋找具有大特征值的角點。該函數(shù),首先用<A
href="http://fsa.ia.ac.cn/opencv-doc-cn/opencv-doc-cn-0.9.7/ref/opencvref_cv.cn.htm#decl_cvCornerMinEigenVal">cvCornerMinEigenVal</A>
計算輸入圖像的每一個象素點的最小特征值,并將結(jié)果存儲到變量 <CODE>eig_image
中。</CODE>然后進行非最大值抑制(僅保留3x3鄰域中的局部最大值)。下一步將最小特征值小于
<CODE>quality_level</SPAN></CODE>•max(<CODE>eig_image</SPAN></CODE>(x,y))
排除掉。最后,函數(shù)確保所有發(fā)現(xiàn)的角點之間具有足夠的距離,(最強的角點第一個保留,然后檢查新的角點與已有角點之間的距離大于 <CODE>min_distance
)。</CODE></P>
<HR>
<H2>采樣、差值和幾何變換</H2>
<HR>
<H3><A name=decl_cvInitLineIterator>InitLineIterator</A></H3>
<P class=Blurb><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Helvetica; mso-hansi-font-family: Helvetica">初始化線段迭代器</SPAN></P><PRE>int cvInitLineIterator( const CvArr* image, CvPoint pt1, CvPoint pt2,
CvLineIterator* line_iterator, int connectivity=8 );
</PRE>
<P>
<DL>
<DT>image
<DD>帶采線段的輸入圖像.
<DT>pt1
<DD>線段起始點
<DT>pt2
<DD>線段結(jié)束點
<DT>line_iterator
<DD>指向線段迭代器狀態(tài)結(jié)構(gòu)的指針
<DT>connectivity
<DD>被掃描線段的連通數(shù),4 或 8. </DD></DL>
<P>函數(shù) <A
href="http://fsa.ia.ac.cn/opencv-doc-cn/opencv-doc-cn-0.9.7/ref/opencvref_cv.cn.htm#decl_cvInitLineIterator">cvInitLineIterator</A>
初始化線段迭代器,并返回兩點之間的象素點數(shù)目。兩個點必須在圖像內(nèi)。當?shù)鞒跏蓟螅B接兩點的光柵線上所有點,都可以連續(xù)通過調(diào)用
<CODE>CV_NEXT_LINE_POINT</SPAN></CODE> 來得到。線段上的點是使用 4-連通或8-連通利用 Bresenham
算法逐點計算的。</P>
<H4><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Helvetica; mso-hansi-font-family: Helvetica">例子:使用線段迭代器計算彩色線上象素值的和</SPAN></H4><PRE> CvScalar sum_line_pixels( IplImage* image, CvPoint pt1, CvPoint pt2 )
{
CvLineIterator iterator;
int blue_sum = 0, green_sum = 0, red_sum = 0;
int count = cvInitLineIterator( image, pt1, pt2, &iterator, 8 );
for( int i = 0; i < count; i++ ){
blue_sum += iterator.ptr[0];
green_sum += iterator.ptr[1];
red_sum += iterator.ptr[2];
CV_NEXT_LINE_POINT(iterator);
/* 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 = iterator.ptr - (uchar*)(image->imageData);
y = offset/image->widthStep;
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 );
}
</PRE>
<HR>
<H3><A name=decl_cvSampleLine>SampleLine</A></H3>
<P class=Blurb><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Helvetica; mso-hansi-font-family: Helvetica">將光柵線讀入緩沖區(qū)</SPAN></P><PRE>int cvSampleLine( const CvArr* image, CvPoint pt1, CvPoint pt2,
void* buffer, int connectivity=8 );
</PRE>
<P>
<DL>
<DT>image
<DD>帶采線段的輸入圖像
<DT>pt1
<DD>起點
<DT>pt2
<DD>終點
<DT>buffer
<DD>存儲線段點的緩存區(qū),必須有足夠大小來存儲點 max(
|<CODE>pt2.x</SPAN></CODE>-<CODE>pt1.x</SPAN></CODE>|+1,
|<CODE>pt2.y</SPAN></CODE>-<CODE>pt1.y</SPAN></CODE>|+1 ) :8-連通情況下,或者
|<CODE>pt2.x</SPAN></CODE>-<CODE>pt1.x</SPAN></CODE>|+|<CODE>pt2.y</SPAN></CODE>-<CODE>pt1.y</SPAN></CODE>|+1
: 4-連通情況下.
<DT>connectivity
<DD>線段的連通方式, 4 or 8. </DD></DL>
<P>函數(shù) cvSampleLine 實現(xiàn)了線段迭代器的一個特殊應(yīng)用。它讀取由兩點 pt1 和 pt2
確定的線段上的所有圖像點,包括終點,并存儲到緩存中。</P>
<HR>
<H3><A name=decl_cvGetRectSubPix>GetRectSubPix</A></H3>
<P class=Blurb><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Helvetica; mso-hansi-font-family: Helvetica">從圖像中提取象素矩形,使用子象素精度</SPAN></P><PRE>void cvGetRectSubPix( const CvArr* src, CvArr* dst, CvPoint2D32f center );
</PRE>
<P>
<DL>
<DT>src
<DD>輸入圖像.
<DT>dst
<DD>提取的矩形.
<DT>center
<DD>提取的象素矩形的中心,浮點數(shù)坐標。中心必須位于圖像內(nèi)部. </DD></DL>
<P>函數(shù) <A
href="http://fsa.ia.ac.cn/opencv-doc-cn/opencv-doc-cn-0.9.7/ref/opencvref_cv.cn.htm#decl_cvGetRectSubPix">cvGetRectSubPix</A>
從圖像 <CODE>src 中提取矩形</SPAN></CODE>:</P><PRE>dst(x, y) = src(x + center.x - (width(dst)-1)*0.5, y + center.y - (height(dst)-1)*0.5)
</PRE>
<P>其中非整數(shù)象素點坐標采用雙線性差值提取。對多通道圖像,每個通道獨立單獨完成提取。盡管函數(shù)要求矩形的中心一定要在輸入圖像之中,但是有可能出現(xiàn)矩形的一部分超出圖像邊界的情況,這時,該函數(shù)復(fù)制邊界的模識(<A
href="http://www.assuredigit.com/">hunnish</A>:即用于矩形相交的圖像邊界線段的象素來代替矩形超越部分的象素)。
</P>
<HR>
<H3><A name=decl_cvGetQuadrangleSubPix>GetQuadrangleSubPix</A></H3>
<P class=Blurb><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Helvetica; mso-hansi-font-family: Helvetica">提取象素四邊形,使用子象素精度</SPAN></P><PRE>void cvGetQuadrangleSubPix( const CvArr* src, CvArr* dst, const CvMat* map_matrix,
int fill_outliers=0, CvScalar fill_value=cvScalarAll(0) );
</PRE>
<P>
<DL>
<DT>src
<DD>輸入圖像.
<DT>dst
<DD>提取的四邊形.
<DT>map_matrix
<DD>3 × 2 變換矩陣 [<CODE>A</SPAN></CODE>|<CODE>b</SPAN></CODE>] (見討論).
<DT>fill_outliers
<DD>該標志位指定是否對原始圖像邊界外面的象素點使用復(fù)制模式(<CODE>fill_outliers</CODE>=0)進行差值或者將其設(shè)置為指定值(<CODE>fill_outliers</CODE>=1)。
<DT>fill_value
<DD>對超出圖像邊界的矩形象素設(shè)定的值(當 <CODE>fill_outliers</CODE>=1時的情況). </DD></DL>
<P>函數(shù) <A
href="http://fsa.ia.ac.cn/opencv-doc-cn/opencv-doc-cn-0.9.7/ref/opencvref_cv.cn.htm#decl_cvGetQuadrangleSubPix">cvGetQuadrangleSubPix</A>
以子象素精度從圖像 <CODE>src</CODE> 中提取四邊形,使用子象素精度,并且將結(jié)果存儲于 <CODE>dst</SPAN></CODE>
,計算公式是:</P><PRE>dst(x+width(dst)/2, y+height(dst)/2)= src( A<SUB>11</SUB>x+A<SUB>12</SUB>y+b<SUB>1</SUB>, A<SUB>21</SUB>x+A<SUB>22</SUB>y+b<SUB>2</SUB>),
w其中 <CODE>A</CODE>和 <CODE>b</CODE> 均來自映射矩陣(譯者注:A, b為幾何形變參數(shù)) <CODE>map_matrix</CODE>
| A<SUB>11</SUB> A<SUB>12</SUB> b<SUB>1</SUB> |
map_matrix = | |
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -