⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opencv 图像处理和计算机视觉参考手册.htm

📁 Opencv的中文参考指南
💻 HTM
📖 第 1 页 / 共 5 页
字号:
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>保存结果的数组。必须比输入图像宽 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>对每个象素,函数 <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),然后在邻域上计算图像差分的相关矩阵:</P><PRE>    | sum<SUB>S(p)</SUB>(dI/dx)<SUP>2</SUP>   sum<SUB>S(p)</SUB>(dI/dx&#8226;dI/dy)|
M = |                                 |
    | sum<SUB>S(p)</SUB>(dI/dx&#8226;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>). 
  当输入图像是浮点数格式时,该参数表示用来计算差分固定的浮点滤波器的个数. </DD></DL>
<P>函数 <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> 
类似,但是它仅仅计算和存储每个象素点差分相关矩阵的最小特征值,即前一个函数的 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>角点数目 
  <DT>win
  <DD>搜索窗口的一半尺寸。如果 <CODE>win</SPAN></CODE>=(5,5) 那么使用 5*2+1 × 5*2+1 = 11 × 11 
  大小的搜索窗口 
  <DT>zero_zone
  <DD>死区的一半尺寸,死区为不对搜索区的中央位置做求和运算的区域。它是用来避免自相关矩阵出现的某些可能的奇异性。当值为 (-1,-1) 表示没有死区。 
  <DT>criteria
  <DD>求角点的迭代过程的终止条件。即角点位置的确定,要么迭代数大于某个设定值,或者是精确度达到某个设定值。 
  <CODE>criteria</SPAN></CODE> 可以是最大迭代数目,或者是设定的精确度,也可以是它们的组合。 </DD></DL>
<P>函数 <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> 
通过迭代来发现具有子象素精度的角点位置,或如图所示的放射鞍点(radial saddle points)。</P>
<P><IMG src="OpenCV 图像处理和计算机视觉参考手册.files/cornersubpix.png" align=center> </P>
<P>子象素级角点定位的实现是基于对向量正交性的观测而实现的,即从中央点<CODE>q</CODE>到其邻域点<CODE>p</CODE> 
的向量和<CODE>p</CODE>点处的图像梯度正交(服从图像和测量噪声)。考虑以下的表达式: </P><PRE>ε<SUB>i</SUB>=DI<SUB>p<SUB>i</SUB></SUB><SUP>T</SUP>&#8226;(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>设为0,可以建立系统方程如下: 
<PRE>sum<SUB>i</SUB>(DI<SUB>p<SUB>i</SUB></SUB>&#8226;DI<SUB>p<SUB>i</SUB></SUB><SUP>T</SUP>)&#8226;q - sum<SUB>i</SUB>(DI<SUB>p<SUB>i</SUB></SUB>&#8226;DI<SUB>p<SUB>i</SUB></SUB><SUP>T</SUP>&#8226;p<SUB>i</SUB>) = 0
</PRE>
<P>其中<CODE>q</CODE>的邻域(搜索窗)中的梯度被累加。调用第一个梯度参数<CODE>G</CODE>和第二个梯度参数<CODE>b</CODE>,得到:</P><PRE>q=G<SUP>-1</SUP>&#8226;b
</PRE>
<P>该算法将搜索窗的中心设为新的中心<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>输出参数,检测到的角点 
  <DT>corner_count
  <DD>输出参数,检测到的角点数目 
  <DT>quality_level
  <DD>最大最小特征值的乘法因子。定义可接受图像角点的最小质量因子。 
  <DT>min_distance
  <DD>限制因子。得到的角点的最小距离。使用 Euclidian 距离 
  <DT>mask
  <DD>ROI:感兴趣区域。函数在ROI中计算角点,如果 mask 为 NULL,则选择整个图像。 </DD></DL>
<P>函数 <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> 
在图像中寻找具有大特征值的角点。该函数,首先用<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> 
计算输入图像的每一个象素点的最小特征值,并将结果存储到变量 <CODE>eig_image 
中。</CODE>然后进行非最大值抑制(仅保留3x3邻域中的局部最大值)。下一步将最小特征值小于 
<CODE>quality_level</SPAN></CODE>&#8226;max(<CODE>eig_image</SPAN></CODE>(x,y)) 
排除掉。最后,函数确保所有发现的角点之间具有足够的距离,(最强的角点第一个保留,然后检查新的角点与已有角点之间的距离大于 <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>线段结束点 
  <DT>line_iterator
  <DD>指向线段迭代器状态结构的指针 
  <DT>connectivity
  <DD>被扫描线段的连通数,4 或 8. </DD></DL>
<P>函数 <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> 
初始化线段迭代器,并返回两点之间的象素点数目。两个点必须在图像内。当迭代器初始化后,连接两点的光栅线上所有点,都可以连续通过调用 
<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, &amp;iterator, 8 );

        for( int i = 0; i &lt; 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-&gt;imageData);
            y = offset/image-&gt;widthStep;
            x = (offset - y*image-&gt;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">将光栅线读入缓冲区</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>存储线段点的缓存区,必须有足够大小来存储点 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>函数 cvSampleLine 实现了线段迭代器的一个特殊应用。它读取由两点 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>提取的象素矩形的中心,浮点数坐标。中心必须位于图像内部. </DD></DL>
<P>函数 <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>其中非整数象素点坐标采用双线性差值提取。对多通道图像,每个通道独立单独完成提取。尽管函数要求矩形的中心一定要在输入图像之中,但是有可能出现矩形的一部分超出图像边界的情况,这时,该函数复制边界的模识(<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>该标志位指定是否对原始图像边界外面的象素点使用复制模式(<CODE>fill_outliers</CODE>=0)进行差值或者将其设置为指定值(<CODE>fill_outliers</CODE>=1)。 

  <DT>fill_value
  <DD>对超出图像边界的矩形象素设定的值(当 <CODE>fill_outliers</CODE>=1时的情况). </DD></DL>
<P>函数 <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> 中提取四边形,使用子象素精度,并且将结果存储于 <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为几何形变参数) <CODE>map_matrix</CODE>
             | A<SUB>11</SUB> A<SUB>12</SUB>  b<SUB>1</SUB> |
map_matrix = |            |

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -