Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
0404b298
O
Opencv
项目概览
Greenplum
/
Opencv
11 个月 前同步成功
通知
7
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
Opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
0404b298
编写于
3月 29, 2012
作者:
V
Vadim Pisarevsky
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fixed line clipping (ticket #1284)
上级
1564fe9a
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
95 addition
and
64 deletion
+95
-64
modules/core/src/drawing.cpp
modules/core/src/drawing.cpp
+61
-64
modules/highgui/test/test_drawing.cpp
modules/highgui/test/test_drawing.cpp
+34
-0
未找到文件。
modules/core/src/drawing.cpp
浏览文件 @
0404b298
...
...
@@ -552,7 +552,7 @@ Line2( Mat& img, Point pt1, Point pt2, const void* color )
int
dx
,
dy
;
int
ecount
;
int
ax
,
ay
;
int
i
,
j
;
int
i
,
j
,
x
,
y
;
int
x_step
,
y_step
;
int
cb
=
((
uchar
*
)
color
)[
0
];
int
cg
=
((
uchar
*
)
color
)[
1
];
...
...
@@ -560,20 +560,11 @@ Line2( Mat& img, Point pt1, Point pt2, const void* color )
int
pix_size
=
(
int
)
img
.
elemSize
();
uchar
*
ptr
=
img
.
data
,
*
tptr
;
size_t
step
=
img
.
step
;
Size
size
=
img
.
size
();
Size
size
=
img
.
size
()
,
sizeScaled
(
size
.
width
*
XY_ONE
,
size
.
height
*
XY_ONE
)
;
//assert( img && (nch == 1 || nch == 3) && img.depth() == CV_8U );
pt1
.
x
-=
XY_ONE
*
2
;
pt1
.
y
-=
XY_ONE
*
2
;
pt2
.
x
-=
XY_ONE
*
2
;
pt2
.
y
-=
XY_ONE
*
2
;
ptr
+=
img
.
step
*
2
+
2
*
pix_size
;
size
.
width
=
((
size
.
width
-
5
)
<<
XY_SHIFT
)
+
1
;
size
.
height
=
((
size
.
height
-
5
)
<<
XY_SHIFT
)
+
1
;
if
(
!
clipLine
(
size
,
pt1
,
pt2
))
if
(
!
clipLine
(
sizeScaled
,
pt1
,
pt2
))
return
;
dx
=
pt2
.
x
-
pt1
.
x
;
...
...
@@ -620,40 +611,41 @@ Line2( Mat& img, Point pt1, Point pt2, const void* color )
if
(
pix_size
==
3
)
{
#define ICV_PUT_POINT() \
{ \
tptr[0] = (uchar)cb; \
tptr[1] = (uchar)cg; \
tptr[2] = (uchar)cr; \
#define ICV_PUT_POINT(_x,_y) \
x = (_x); y = (_y); \
if( 0 <= x && x < size.width && \
0 <= y && y < size.height ) \
{ \
tptr = ptr + y*step + x*3; \
tptr[0] = (uchar)cb; \
tptr[1] = (uchar)cg; \
tptr[2] = (uchar)cr; \
}
tptr
=
ptr
+
((
pt2
.
x
+
(
XY_ONE
>>
1
))
>>
XY_SHIFT
)
*
3
+
((
pt2
.
y
+
(
XY_ONE
>>
1
))
>>
XY_SHIFT
)
*
step
;
ICV_PUT_POINT
();
ICV_PUT_POINT
((
pt2
.
x
+
(
XY_ONE
>>
1
))
>>
XY_SHIFT
,
(
pt2
.
y
+
(
XY_ONE
>>
1
))
>>
XY_SHIFT
);
if
(
ax
>
ay
)
{
pt
r
+=
(
pt1
.
x
>>
XY_SHIFT
)
*
3
;
pt
1
.
x
>>=
XY_SHIFT
;
while
(
ecount
>=
0
)
{
tptr
=
ptr
+
(
pt1
.
y
>>
XY_SHIFT
)
*
step
;
ICV_PUT_POINT
()
;
ICV_PUT_POINT
(
pt1
.
x
,
pt1
.
y
>>
XY_SHIFT
)
;
pt1
.
x
++
;
pt1
.
y
+=
y_step
;
ptr
+=
3
;
ecount
--
;
}
}
else
{
pt
r
+=
(
pt1
.
y
>>
XY_SHIFT
)
*
step
;
pt
1
.
y
>>=
XY_SHIFT
;
while
(
ecount
>=
0
)
{
tptr
=
ptr
+
(
pt1
.
x
>>
XY_SHIFT
)
*
3
;
ICV_PUT_POINT
();
ICV_PUT_POINT
(
pt1
.
x
>>
XY_SHIFT
,
pt1
.
y
);
pt1
.
x
+=
x_step
;
pt
r
+=
step
;
pt
1
.
y
++
;
ecount
--
;
}
}
...
...
@@ -662,80 +654,85 @@ Line2( Mat& img, Point pt1, Point pt2, const void* color )
}
else
if
(
pix_size
==
1
)
{
#define ICV_PUT_POINT() \
{ \
tptr[0] = (uchar)cb; \
#define ICV_PUT_POINT(_x,_y) \
x = (_x); y = (_y); \
if( 0 <= x && x < size.width && \
0 <= y && y < size.height ) \
{ \
tptr = ptr + y*step + x;\
tptr[0] = (uchar)cb; \
}
tptr
=
ptr
+
((
pt2
.
x
+
(
XY_ONE
>>
1
))
>>
XY_SHIFT
)
+
((
pt2
.
y
+
(
XY_ONE
>>
1
))
>>
XY_SHIFT
)
*
step
;
ICV_PUT_POINT
();
ICV_PUT_POINT
((
pt2
.
x
+
(
XY_ONE
>>
1
))
>>
XY_SHIFT
,
(
pt2
.
y
+
(
XY_ONE
>>
1
))
>>
XY_SHIFT
);
if
(
ax
>
ay
)
{
pt
r
+=
(
pt1
.
x
>>
XY_SHIFT
)
;
pt
1
.
x
>>=
XY_SHIFT
;
while
(
ecount
>=
0
)
{
tptr
=
ptr
+
(
pt1
.
y
>>
XY_SHIFT
)
*
step
;
ICV_PUT_POINT
()
;
ICV_PUT_POINT
(
pt1
.
x
,
pt1
.
y
>>
XY_SHIFT
)
;
pt1
.
x
++
;
pt1
.
y
+=
y_step
;
ptr
++
;
ecount
--
;
}
}
else
{
pt
r
+=
(
pt1
.
y
>>
XY_SHIFT
)
*
step
;
pt
1
.
y
>>=
XY_SHIFT
;
while
(
ecount
>=
0
)
{
tptr
=
ptr
+
(
pt1
.
x
>>
XY_SHIFT
);
ICV_PUT_POINT
();
ICV_PUT_POINT
(
pt1
.
x
>>
XY_SHIFT
,
pt1
.
y
);
pt1
.
x
+=
x_step
;
pt
r
+=
step
;
pt
1
.
y
++
;
ecount
--
;
}
}
#undef ICV_PUT_POINT
}
else
{
#define ICV_PUT_POINT() \
for( j = 0; j < pix_size; j++ ) \
tptr[j] = ((uchar*)color)[j];
#define ICV_PUT_POINT(_x,_y) \
x = (_x); y = (_y); \
if( 0 <= x && x < size.width && \
0 <= y && y < size.height ) \
{ \
tptr = ptr + y*step + x*pix_size;\
for( j = 0; j < pix_size; j++ ) \
tptr[j] = ((uchar*)color)[j]; \
}
tptr
=
ptr
+
((
pt2
.
x
+
(
XY_ONE
>>
1
))
>>
XY_SHIFT
)
*
pix_size
+
((
pt2
.
y
+
(
XY_ONE
>>
1
))
>>
XY_SHIFT
)
*
step
;
ICV_PUT_POINT
();
ICV_PUT_POINT
((
pt2
.
x
+
(
XY_ONE
>>
1
))
>>
XY_SHIFT
,
(
pt2
.
y
+
(
XY_ONE
>>
1
))
>>
XY_SHIFT
);
if
(
ax
>
ay
)
{
pt
r
+=
(
pt1
.
x
>>
XY_SHIFT
)
*
pix_size
;
pt
1
.
x
>>=
XY_SHIFT
;
while
(
ecount
>=
0
)
{
tptr
=
ptr
+
(
pt1
.
y
>>
XY_SHIFT
)
*
step
;
ICV_PUT_POINT
()
;
ICV_PUT_POINT
(
pt1
.
x
,
pt1
.
y
>>
XY_SHIFT
)
;
pt1
.
x
++
;
pt1
.
y
+=
y_step
;
ptr
+=
pix_size
;
ecount
--
;
}
}
else
{
pt
r
+=
(
pt1
.
y
>>
XY_SHIFT
)
*
step
;
pt
1
.
y
>>=
XY_SHIFT
;
while
(
ecount
>=
0
)
{
tptr
=
ptr
+
(
pt1
.
x
>>
XY_SHIFT
)
*
pix_size
;
ICV_PUT_POINT
();
ICV_PUT_POINT
(
pt1
.
x
>>
XY_SHIFT
,
pt1
.
y
);
pt1
.
x
+=
x_step
;
pt
r
+=
step
;
pt
1
.
y
++
;
ecount
--
;
}
}
#undef ICV_PUT_POINT
}
}
...
...
@@ -1013,7 +1010,7 @@ FillConvexPoly( Mat& img, const Point* v, int npts, const void* color, int line_
LineAA
(
img
,
p0
,
p
,
color
);
p0
=
p
;
}
xmin
=
(
xmin
+
delta
)
>>
shift
;
xmax
=
(
xmax
+
delta
)
>>
shift
;
ymin
=
(
ymin
+
delta
)
>>
shift
;
...
...
modules/highgui/test/test_drawing.cpp
浏览文件 @
0404b298
...
...
@@ -408,3 +408,37 @@ int CV_DrawingTest_C::checkLineIterator( Mat& _img )
TEST
(
Highgui_Drawing_CPP
,
regression
)
{
CV_DrawingTest_CPP
test
;
test
.
safe_run
();
}
TEST
(
Highgui_Drawing_C
,
regression
)
{
CV_DrawingTest_C
test
;
test
.
safe_run
();
}
class
CV_FillConvexPolyTest
:
public
cvtest
::
BaseTest
{
public:
CV_FillConvexPolyTest
()
{}
~
CV_FillConvexPolyTest
()
{}
protected:
void
run
(
int
)
{
vector
<
Point
>
line1
;
vector
<
Point
>
line2
;
line1
.
push_back
(
Point
(
1
,
1
));
line1
.
push_back
(
Point
(
5
,
1
));
line1
.
push_back
(
Point
(
5
,
8
));
line1
.
push_back
(
Point
(
1
,
8
));
line2
.
push_back
(
Point
(
2
,
2
));
line2
.
push_back
(
Point
(
10
,
2
));
line2
.
push_back
(
Point
(
10
,
16
));
line2
.
push_back
(
Point
(
2
,
16
));
Mat
gray0
(
10
,
10
,
CV_8U
,
Scalar
(
0
));
fillConvexPoly
(
gray0
,
line1
,
Scalar
(
255
),
8
,
0
);
int
nz1
=
countNonZero
(
gray0
);
fillConvexPoly
(
gray0
,
line2
,
Scalar
(
0
),
8
,
1
);
int
nz2
=
countNonZero
(
gray0
)
/
255
;
CV_Assert
(
nz1
==
40
&&
nz2
==
0
);
}
};
TEST
(
Highgui_Drawing_FillConvexPoly
,
clipping
)
{
CV_FillConvexPolyTest
test
;
test
.
safe_run
();
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录