?? opencv用戶手冊之圖像處理部分(之二):采樣、差值與幾何變換(中文翻譯) - hunnish的opencv專欄.htm
字號:
<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, &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">將光柵線讀入緩沖區</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 && (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->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] = 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 )
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 + -