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

📄 opencv用户手册之图像处理部分(之二):采样、差值与几何变换(中文翻译) - hunnish的opencv专栏.htm

📁 Opencv的中文参考指南
💻 HTM
📖 第 1 页 / 共 3 页
字号:
  <DT>line_iterator 
  <DD>指向线段迭代器结构的指针 
  <DT>connectivity 
  <DD>被扫描线段的连通数,<SPAN lang=EN-US>4 或 8.</SPAN> </DD></DL>
<P>函数 <SPAN lang=EN-US><A 
href="file:///C:/DOCUME~1/user/LOCALS~1/Temp/FrontPageTempDir/pvw1.htm#decl_cvInitLineIterator">cvInitLineIterator</A> 
初始化线段迭代器,并返回两点之间的象素点数目。两个点必须在图像内。当迭代器初始化后,连接两点的光栅线上所有点,都可以连续通过调用 
</SPAN><CODE><SPAN lang=EN-US>CV_NEXT_LINE_POINT</SPAN></CODE><SPAN lang=EN-US> 
来得到。线段上的点是使用 4-连通或8-连通利用 Bresenham 算法逐点计算的。</SPAN></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>存储线段点的缓存区,必须有足够大小来存储点<SPAN lang=EN-US> max( |</SPAN><CODE><SPAN 
  lang=EN-US>pt2.x</SPAN></CODE><SPAN lang=EN-US>-</SPAN><CODE><SPAN 
  lang=EN-US>pt1.x</SPAN></CODE><SPAN lang=EN-US>|+1, |</SPAN><CODE><SPAN 
  lang=EN-US>pt2.y</SPAN></CODE><SPAN lang=EN-US>-</SPAN><CODE><SPAN 
  lang=EN-US>pt1.y</SPAN></CODE><SPAN lang=EN-US>|+1 ) :8-连通情况下,以及 
  |</SPAN><CODE><SPAN lang=EN-US>pt2.x</SPAN></CODE><SPAN 
  lang=EN-US>-</SPAN><CODE><SPAN lang=EN-US>pt1.x</SPAN></CODE><SPAN 
  lang=EN-US>|+|</SPAN><CODE><SPAN lang=EN-US>pt2.y</SPAN></CODE><SPAN 
  lang=EN-US>-</SPAN><CODE><SPAN lang=EN-US>pt1.y</SPAN></CODE><SPAN 
  lang=EN-US>|+1 : 4-连通情况下.</SPAN> 
  <DT>connectivity 
  <DD>The line connectivity, 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>函数 <SPAN lang=EN-US><A 
href="file:///C:/DOCUME~1/user/LOCALS~1/Temp/FrontPageTempDir/pvw1.htm#decl_cvGetRectSubPix">cvGetRectSubPix</A> 
从图像 </SPAN><CODE><SPAN lang=EN-US>src 中提取矩形</SPAN></CODE><SPAN 
lang=EN-US>:</SPAN></P><PRE>dst(x, y) = src(x + center.x - (width(dst)-1)*0.5, y + center.y - (height(dst)-1)*0.5)
</PRE>
<P>其中非整数象素点坐标采用双线性差值提取。对多通道图像,每个通道独立单独完成提取。矩形中心必须位于图像内部,而整个矩形可以部分不在图像内。这种情况下,复制的边界模识用来得到图像边界外的象素值(<SPAN 
lang=EN-US>Hunnish:令人费解)</SPAN></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><SPAN lang=EN-US>3 × 2 变换矩阵 [</SPAN><CODE><SPAN 
  lang=EN-US>A</SPAN></CODE><SPAN lang=EN-US>|</SPAN><CODE><SPAN 
  lang=EN-US>b</SPAN></CODE><SPAN lang=EN-US>] (见讨论).</SPAN> 
  <DT>fill_outliers 
  <DD>该标志位指定是否对原始图像边界外面的象素点使用复制模式(<CODE>fill_outliers</CODE>=0)进行差值或者将其设置为指定值(<CODE>fill_outliers</CODE>=1)。 

  <DT>fill_value 
  <DD>对原始图像边界外面的象素设定固定值,当 <CODE><SPAN 
  lang=EN-US>fill_outliers</SPAN></CODE><SPAN lang=EN-US>=1.</SPAN> </DD></DL>
<P>函数 <SPAN lang=EN-US><A 
href="file:///C:/DOCUME~1/user/LOCALS~1/Temp/FrontPageTempDir/pvw1.htm#decl_cvGetQuadrangleSubPix">cvGetQuadrangleSubPix</A> 
从图像 </SPAN><CODE><SPAN lang=EN-US>src</SPAN></CODE><SPAN lang=EN-US> 
中提取四边形,使用子象素精度,并且将结果存储于 </SPAN><CODE><SPAN lang=EN-US>dst</SPAN></CODE><SPAN 
lang=EN-US> ,计算公式是:</SPAN></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>),

where <CODE>A</CODE> and <CODE>b</CODE> are taken from <CODE>map_matrix</CODE>
             | A<SUB>11</SUB> A<SUB>12</SUB>  b<SUB>1</SUB> |
map_matrix = |            |
             | A<SUB>21</SUB> A<SUB>22</SUB>  b<SUB>2</SUB> |
</PRE>
<P>其中在非整数坐标<SPAN lang=EN-US> A•(x,y)<SUP>T</SUP>+b 
的象素点值通过双线性变换得到。多通道图像的每一个通道都单独计算.</SPAN></P>
<H4><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Helvetica; mso-hansi-font-family: Helvetica">例子:使用</SPAN><SPAN 
lang=EN-US> cvGetQuadrangleSubPix </SPAN><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Helvetica; mso-hansi-font-family: Helvetica">进行图像旋转</SPAN></H4><PRE>#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( argc==2 &amp;&amp; (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 factor = (cos(angle*CV_PI/180.) + 1.1)*3;
            CvMat M = cvMat( 2, 3, CV_32F, m );
            int w = src-&gt;width;
            int h = src-&gt;height;

            m[0] = (float)(factor*cos(-angle*2*CV_PI/180.));
            m[1] = (float)(factor*sin(-angle*2*CV_PI/180.));
            m[2] = w*0.5f;
            m[3] = -m[1];
            m[4] = m[0];
            m[5] = h*0.5f;

            cvGetQuadrangleSubPix( src, dst, &amp;M, 1, cvScalarAll(0));

            cvNamedWindow( "dst", 1 );
            cvShowImage( "dst", dst );

            if( cvWaitKey(5) == 27 )
                break;

            angle = (angle + delta) % 360;
        }
    }
    return 0;
}
</PRE>
<HR>

<H3><A name=decl_cvResize>Resize</A></H3>
<P class=Blurb><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Helvetica; mso-hansi-font-family: Helvetica">图像大小变换</SPAN></P><PRE>void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR );
</PRE>
<P>
<DL>
  <DT>src 
  <DD>输入图像. 
  <DT>dst 
  <DD>输出图像. 
  <DT>interpolation 
  <DD>差值方法: 
  <UL>
    <LI>CV_INTER_NN - 最近邻差值, 
    <LI>CV_INTER_LINEAR - 双线性差值 (缺省使用) 
    <LI>CV_INTER_AREA - <SPAN 
    lang=EN-US>使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大是,类似于 </SPAN><CODE><SPAN 
    lang=EN-US>CV_INTER_NN</SPAN></CODE><SPAN lang=EN-US> 方法.</SPAN>. 
    <LI>CV_INTER_CUBIC - 立方差值. </LI></UL></DD></DL>
<P>函数 <SPAN lang=EN-US><A 
href="file:///C:/DOCUME~1/user/LOCALS~1/Temp/FrontPageTempDir/pvw1.htm#decl_cvResize">cvResize</A> 
将图像 </SPAN><CODE><SPAN lang=EN-US>src</SPAN></CODE><SPAN lang=EN-US> 改变尺寸得到与 
</SPAN><CODE><SPAN lang=EN-US>dst 同样大小。</SPAN></CODE>若设定<SPAN lang=EN-US> 
ROI,函数将按常规支持 ROI</SPAN>.</P>
<HR>

<H3><A name=decl_cvWarpAffine>WarpAffine</A></H3>
<P class=Blurb><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Helvetica; mso-hansi-font-family: Helvetica">对图像做仿射变换</SPAN></P><PRE>void cvWarpAffine( const CvArr* src, CvArr* dst, const CvMat* map_matrix,
                   int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,
                   CvScalar fillval=cvScalarAll(0) );
</PRE>
<P>
<DL>
  <DT>src 
  <DD>输入图像. 
  <DT>dst 
  <DD>输出图像. 
  <DT>map_matrix 
  <DD><SPAN lang=EN-US>2×3 变换矩阵</SPAN> 
  <DT>flags 
  <DD>差值方法与开关选项: 
  <UL>
    <LI>CV_WARP_FILL_OUTLIERS - <SPAN 
    lang=EN-US>填充所有缩小图像的象素。如果部分象素落在输入图像的边界外,那么它们的值设定为 </SPAN><CODE><SPAN 
    lang=EN-US>fillval</SPAN></CODE><SPAN lang=EN-US>.</SPAN> 
    <LI>CV_WARP_INVERSE_MAP - <SPAN lang=EN-US>指定 </SPAN><CODE><SPAN 
    lang=EN-US>matrix</SPAN></CODE><SPAN lang=EN-US> 
    是输出图像到输入图像的反变换,因此可以直接用来做象素差值。否则, 函数从 </SPAN><CODE><SPAN 
    lang=EN-US>map_matrix 得到反变换。</SPAN></CODE> </LI></UL>

⌨️ 快捷键说明

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