关键词不能为空

当前您在: 主页 > 英语 >

opencv-采样-几何变换

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-03-01 12:44
tags:

-

2021年3月1日发(作者:冬游)


InitLineIterator




初始化线段迭代器




int


cvInitLineIterator(


const


CvArr*


image,


CvPoint


pt1,


CvPoint


pt2,


CvLineIterator*


line_iterator,


int


connectivity=8


);


image


带采线段的输入图像


.pt1

线段起始点


pt2


线段结束点


li ne_iterator


指向线段迭代器状态结构的指针


con nectivity


被扫描线段的连通数,


4




8.



函数



cvInitLineIterator


初始化线段迭代器, 并返回两点之间的象素点数目。两个点必须在







< br>代















线











< br>通






CV_NEXT_LINE_POINT


来得到。线段上的点是使用



4


-连通或


8


-连通利用



Bresenham


算法逐点计算的。





例子:使用线段迭代器计算彩色线上象素值的和




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


+=


[0];


green_sum


+=


[1];


red_sum


+=


[2];


CV_NEXT_LINE_POINT(iterator);


{


int


offset,


x,


y;


offset


=



-


(uchar*)(image->imageData);


y


=


offset/image->widthStep;


x


=


(offset


-


y*image->widthStep)/(3*sizeof(uchar)


);


printf(


x,


y


);


}


}


return


cvScalar( blue_sum, green_sum, red_sum ); }



[


编辑


]






SampleLine




将图像上某一光栅线上的像素数据读入缓冲区




int


cvSampleLine(


const


CvArr*


image,


CvPoint


pt1,


CvPoint


pt2,


void*


buffer,


int


connectivity=8


);


image


输入图像


pt1


光栅线段 的起点


pt2


光栅线段的终点


buff er


存储线段点


的缓存区,


必须有足够 大小来存储点



max( |pt2.x-pt1.x|+1, |pt2.y-pt1.y|+1 )



8

< br>-连通情况下,


或者



|pt2.x-pt1.x|+|pt2.y-pt1.y|+1




4


-连通 情况下


.connectivity


线段的连通方式

< p>
, 4 or 8.



函数



cvSampleLine < /p>


实现了线段迭代器的一个特殊应用。


它读取由


pt1




pt2


两点确定的


线段上的所有图像 点,包括终点,并存储到缓存中。





[


编辑


]






GetRectSubPix




从图像中提取象素矩形,使用子象素精度




void cvGetRectSubPix( const CvArr* src, CvArr* dst, CvPoint2D32f center ); src


输入图像


.dst


提取的矩形


.center


提取的象素矩形的中心,浮点数坐标。中心必须位于图像 内部


.



函数



cvGetRectSubPix


从图像



src


中提取矩形


:



dst(x, y) = src(x + center.x - (width(dst)-1)*0.5, y + center.y - (height(dst)-1)*0.5)



其中非整数象 素点坐标采用双线性插值提取。对多通道图像,每个通道独立单独完成提取。


尽管函数要 求矩形的中心一定要在输入图像之中,


但是有可能出现矩形的一部分超出图像边


界的情况,这时,该函数复制边界的模识(


hunnish:

< p>
即用于矩形相交的图像边界线段的象素


来代替矩形超越部分的象素)






[


编辑


]






GetQuadrangleSubPix




提取象素四边形,使用子象素精度




void cvGetQuadrangleSubPix( const CvArr* src, CvArr* dst, const CvMat* map_matrix ); src



入图像


.dst


提取的四边形


.map_matrix3


×



2


变换矩阵



[A|b]


(见讨论)


.



函数



cvGetQuadrangleSubPix


以子象素精度从图像



src


中提取四边形,使用子象素精度,


并且将结果存储于

< br>


dst ,


计算公式是:





dst(x + width(dst) / 2,y + height(dst) / 2) = src(A11x + A12y + b1,A21x + A22y + b2)




其中



A




b < /p>


均来自映射矩阵


(


译者注:


A, b


为几何形变参数


)


,映射矩阵为:







其中在非整数坐标




的象素点值通过双线性变换得到。当函数需要图像边界外的像素点时,


使用重复 边界模式(


replication border mode


)恢复出所需的值。多通道图像的每一个通道都


单独计算。





例子:使用



cvGetQuadrangleSubPix


进行图像旋转




#include



#include



#include



int


main(


int


argc,


char**


argv


)


{


IplImage*


src;


if(


argc==2


&&


(src


=


cvLoadImage(argv[1],


-1))!=0)


{


IplImage*


dst


=


cvCloneImage(


src


);


int


delta


=


1;


int


angle


=


0;


cvNamedWindow(



1


);


cvShowImage(


CvMat


M


=


cvMat(


2,


3,


CV_32F,


m


);


int


w


=


src->width;


int


h


=


src->height;


m[0]


=


(float)(fa ctor*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(


break; angle = (angle + delta) % 360; } } return 0; }



[


编辑


]






Resize




图像大小变换




void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR ); src

< p>
输入


图像


.dst


输出图 像


.interpolation


插值方法

:


?


CV_INTER_NN -


最近邻插值


,



?


CV_INTER_LINEAR -


双线性插值



(


缺省使用


)



?


CV_INTER_AREA -


使用象素关系重采样。


当图像缩小时候,


该方法可以避免波纹出现。


当图像放大时,类似于



CV_INTER_NN


方法


..



?


CV_INTER_CUBIC -


立方插值


.




函数



cvResize


将图像



src


改变尺寸得到与



dst


同样大小。若设定



ROI


,函数将按常规支



ROI.




[


编辑


]






WarpAffine




对图像做仿射变换




void


cvWarpAffine(


const


CvArr*


src,


CvArr*


dst,


const


CvMat*


map_matrix,


int


flags=CV_INTER_LINEAR+CV _W


ARP_FILL_OUTLIERS,


CvScalar


fillval=cvScalarAll(0)


);


src


输入图像


.dst

< br>输出图像


.map_matrix2


×

< br>3


变换矩阵


flags


插值方 法和以下开关选项的组合:



?


CV_WARP_FILL_OUTLIERS


-


填充所有输出图像的象素。如果部分象素落在输入图像的< /p>


边界外,那么它们的值设定为



fillval.



?


CV_W


ARP_INVERSE_MAP -


指定



map_matrix


是输出图像到输入图像的反变换,


因此可


以直 接用来做象素插值。否则


,


函数从



map_matrix


得到反变换。




fillval


用来填充边界外面的值




函数



cvWarpAffine


利用下面指定的矩阵变换输入图像:





?如果没有指定



CV_W


ARP_INVERSE_MAP





,



?否则,





函数与



cvGetQuadrangleSubPix


类似,但是不完全相同。



cvWarpAffine


要求输入和输出图


像具有同样的数据类型,


有更大的资源开销


(因此对小 图像不太合适)


而且输出图像的部分


可以保留不变。

< p>



cvGetQuadrangleSubPix


可以精确地从


8


位图像中提取四边形到浮点数缓


存区 中,具有比较小的系统开销,而且总是全部改变输出图像的内容。





要变换稀疏矩阵,使用



cxcore


中的函数



cvTransform






[


编辑


]






GetAffineTransform




由三对点计算仿射变换




CvMat*


cvGetAffineTransform(


const


CvPoint2D32f*


src,


const


CvPoint2D32f*


dst,


CvMat*

-


-


-


-


-


-


-


-



本文更新与2021-03-01 12:44,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/688422.html

opencv-采样-几何变换的相关文章