-
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>代
器
初
始
化
后
,
连
接
两
点
的
光
p>
栅
线
上
所
有
点
,
都
可
以
连
续
< 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
线段的连通方式
, 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:
即用于矩形相交的图像边界线段的象素
来代替矩形超越部分的象素)
。
[
编辑
]
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
输入
图像
.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)
);
p>
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
要求输入和输出图
像具有同样的数据类型,
有更大的资源开销
(因此对小
图像不太合适)
而且输出图像的部分
可以保留不变。
而
cvGetQuadrangleSubPix
可以精确地从
8
位图像中提取四边形到浮点数缓
存区
中,具有比较小的系统开销,而且总是全部改变输出图像的内容。
要变换稀疏矩阵,使用
cxcore
中的函数
cvTransform
。
[
编辑
]
GetAffineTransform
由三对点计算仿射变换
CvMat*
cvGetAffineTransform(
const
CvPoint2D32f*
src,
const
CvPoint2D32f*
dst,
CvMat*
-
-
-
-
-
-
-
-
-
上一篇:神奇的Gamma函数 (下)
下一篇:关于逆矩阵求法的讨论毕业论文