Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
800da724
O
Opencv
项目概览
Greenplum
/
Opencv
大约 1 年 前同步成功
通知
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,发现更多精彩内容 >>
提交
800da724
编写于
10月 02, 2017
作者:
J
Jasper Shemilt
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix Transposed eigenvals and vecs. Didn't notice at first
上级
0136711c
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
28 addition
and
22 deletion
+28
-22
modules/imgproc/src/shapedescr.cpp
modules/imgproc/src/shapedescr.cpp
+19
-19
samples/cpp/fitellipse.cpp
samples/cpp/fitellipse.cpp
+9
-3
未找到文件。
modules/imgproc/src/shapedescr.cpp
浏览文件 @
800da724
...
...
@@ -544,15 +544,15 @@ cv::RotatedRect cv::fitEllipseAMS( InputArray _points )
// Select the eigen vector {a,b,c,d,e} which has the lowest eigenvalue
int
minpos
=
0
;
double
normi
,
normEVali
,
normMinpos
,
normEValMinpos
;
normMinpos
=
sqrt
(
eVec
.
at
<
double
>
(
0
,
minpos
)
*
eVec
.
at
<
double
>
(
0
,
minpos
)
+
eVec
.
at
<
double
>
(
1
,
minpos
)
*
eVec
.
at
<
double
>
(
1
,
minpos
)
+
\
eVec
.
at
<
double
>
(
2
,
minpos
)
*
eVec
.
at
<
double
>
(
2
,
minpos
)
+
eVec
.
at
<
double
>
(
3
,
minpos
)
*
eVec
.
at
<
double
>
(
3
,
minpos
)
+
\
eVec
.
at
<
double
>
(
4
,
minpos
)
*
eVec
.
at
<
double
>
(
4
,
minpos
)
);
normEValMinpos
=
eVal
.
at
<
double
>
(
0
,
minpos
)
*
normMinpos
;
normMinpos
=
sqrt
(
eVec
.
at
<
double
>
(
minpos
,
0
)
*
eVec
.
at
<
double
>
(
minpos
,
0
)
+
eVec
.
at
<
double
>
(
minpos
,
1
)
*
eVec
.
at
<
double
>
(
minpos
,
1
)
+
\
eVec
.
at
<
double
>
(
minpos
,
2
)
*
eVec
.
at
<
double
>
(
minpos
,
2
)
+
eVec
.
at
<
double
>
(
minpos
,
3
)
*
eVec
.
at
<
double
>
(
minpos
,
3
)
+
\
eVec
.
at
<
double
>
(
minpos
,
4
)
*
eVec
.
at
<
double
>
(
minpos
,
4
)
);
normEValMinpos
=
eVal
.
at
<
double
>
(
minpos
,
0
)
*
normMinpos
;
for
(
i
=
1
;
i
<
5
;
i
++
)
{
normi
=
sqrt
(
eVec
.
at
<
double
>
(
0
,
i
)
*
eVec
.
at
<
double
>
(
0
,
i
)
+
eVec
.
at
<
double
>
(
1
,
i
)
*
eVec
.
at
<
double
>
(
1
,
i
)
+
\
eVec
.
at
<
double
>
(
2
,
i
)
*
eVec
.
at
<
double
>
(
2
,
i
)
+
eVec
.
at
<
double
>
(
3
,
i
)
*
eVec
.
at
<
double
>
(
3
,
i
)
+
\
eVec
.
at
<
double
>
(
4
,
i
)
*
eVec
.
at
<
double
>
(
4
,
i
)
);
normEVali
=
eVal
.
at
<
double
>
(
0
,
i
)
*
normi
;
normi
=
sqrt
(
eVec
.
at
<
double
>
(
i
,
0
)
*
eVec
.
at
<
double
>
(
i
,
0
)
+
eVec
.
at
<
double
>
(
i
,
1
)
*
eVec
.
at
<
double
>
(
i
,
1
)
+
\
eVec
.
at
<
double
>
(
i
,
2
)
*
eVec
.
at
<
double
>
(
i
,
2
)
+
eVec
.
at
<
double
>
(
i
,
3
)
*
eVec
.
at
<
double
>
(
i
,
3
)
+
\
eVec
.
at
<
double
>
(
i
,
4
)
*
eVec
.
at
<
double
>
(
i
,
4
)
);
normEVali
=
eVal
.
at
<
double
>
(
i
,
0
)
*
normi
;
if
(
normEVali
<
normEValMinpos
)
{
minpos
=
i
;
normMinpos
=
normi
;
...
...
@@ -560,11 +560,11 @@ cv::RotatedRect cv::fitEllipseAMS( InputArray _points )
}
};
pVec
(
0
)
=
eVec
.
at
<
double
>
(
0
,
minpos
)
/
normMinpos
;
pVec
(
1
)
=
eVec
.
at
<
double
>
(
1
,
minpos
)
/
normMinpos
;
pVec
(
2
)
=
eVec
.
at
<
double
>
(
2
,
minpos
)
/
normMinpos
;
pVec
(
3
)
=
eVec
.
at
<
double
>
(
3
,
minpos
)
/
normMinpos
;
pVec
(
4
)
=
eVec
.
at
<
double
>
(
4
,
minpos
)
/
normMinpos
;
pVec
(
0
)
=
eVec
.
at
<
double
>
(
minpos
,
0
)
/
normMinpos
;
pVec
(
1
)
=
eVec
.
at
<
double
>
(
minpos
,
1
)
/
normMinpos
;
pVec
(
2
)
=
eVec
.
at
<
double
>
(
minpos
,
2
)
/
normMinpos
;
pVec
(
3
)
=
eVec
.
at
<
double
>
(
minpos
,
3
)
/
normMinpos
;
pVec
(
4
)
=
eVec
.
at
<
double
>
(
minpos
,
4
)
/
normMinpos
;
coeffs
(
0
)
=
pVec
(
0
)
;
coeffs
(
1
)
=
pVec
(
1
)
;
...
...
@@ -715,19 +715,19 @@ cv::RotatedRect cv::fitEllipseDirect( InputArray _points )
// Select the eigen vector {a,b,c} which satisfies 4ac-b^2 > 0
double
cond
[
3
];
cond
[
0
]
=
(
4.0
*
eVec
.
at
<
double
>
(
0
,
0
)
*
eVec
.
at
<
double
>
(
2
,
0
)
-
eVec
.
at
<
double
>
(
1
,
0
)
*
eVec
.
at
<
double
>
(
1
,
0
));
cond
[
1
]
=
(
4.0
*
eVec
.
at
<
double
>
(
0
,
1
)
*
eVec
.
at
<
double
>
(
2
,
1
)
-
eVec
.
at
<
double
>
(
1
,
1
)
*
eVec
.
at
<
double
>
(
1
,
1
));
cond
[
2
]
=
(
4.0
*
eVec
.
at
<
double
>
(
0
,
2
)
*
eVec
.
at
<
double
>
(
2
,
2
)
-
eVec
.
at
<
double
>
(
1
,
2
)
*
eVec
.
at
<
double
>
(
1
,
2
));
cond
[
0
]
=
(
4.0
*
eVec
.
at
<
double
>
(
0
,
0
)
*
eVec
.
at
<
double
>
(
0
,
2
)
-
eVec
.
at
<
double
>
(
0
,
1
)
*
eVec
.
at
<
double
>
(
0
,
1
));
cond
[
1
]
=
(
4.0
*
eVec
.
at
<
double
>
(
1
,
0
)
*
eVec
.
at
<
double
>
(
1
,
2
)
-
eVec
.
at
<
double
>
(
1
,
1
)
*
eVec
.
at
<
double
>
(
1
,
1
));
cond
[
2
]
=
(
4.0
*
eVec
.
at
<
double
>
(
2
,
0
)
*
eVec
.
at
<
double
>
(
2
,
2
)
-
eVec
.
at
<
double
>
(
2
,
1
)
*
eVec
.
at
<
double
>
(
2
,
1
));
if
(
cond
[
0
]
<
cond
[
1
])
{
i
=
(
cond
[
1
]
<
cond
[
2
])
?
2
:
1
;
}
else
{
i
=
(
cond
[
0
]
<
cond
[
2
])
?
2
:
0
;
}
double
norm
=
std
::
sqrt
(
eVec
.
at
<
double
>
(
0
,
i
)
*
eVec
.
at
<
double
>
(
0
,
i
)
+
eVec
.
at
<
double
>
(
1
,
i
)
*
eVec
.
at
<
double
>
(
1
,
i
)
+
eVec
.
at
<
double
>
(
2
,
i
)
*
eVec
.
at
<
double
>
(
2
,
i
));
if
(((
eVec
.
at
<
double
>
(
0
,
i
)
<
0.0
?
-
1
:
1
)
*
(
eVec
.
at
<
double
>
(
1
,
i
)
<
0.0
?
-
1
:
1
)
*
(
eVec
.
at
<
double
>
(
2
,
i
)
<
0.0
?
-
1
:
1
))
<=
0.0
)
{
double
norm
=
std
::
sqrt
(
eVec
.
at
<
double
>
(
i
,
0
)
*
eVec
.
at
<
double
>
(
i
,
0
)
+
eVec
.
at
<
double
>
(
i
,
1
)
*
eVec
.
at
<
double
>
(
i
,
1
)
+
eVec
.
at
<
double
>
(
i
,
2
)
*
eVec
.
at
<
double
>
(
i
,
2
));
if
(((
eVec
.
at
<
double
>
(
i
,
0
)
<
0.0
?
-
1
:
1
)
*
(
eVec
.
at
<
double
>
(
i
,
1
)
<
0.0
?
-
1
:
1
)
*
(
eVec
.
at
<
double
>
(
i
,
2
)
<
0.0
?
-
1
:
1
))
<=
0.0
)
{
norm
=-
1.0
*
norm
;
}
pVec
(
0
)
=
eVec
.
at
<
double
>
(
0
,
i
)
/
norm
;
pVec
(
1
)
=
eVec
.
at
<
double
>
(
1
,
i
)
/
norm
;
pVec
(
2
)
=
eVec
.
at
<
double
>
(
2
,
i
)
/
norm
;
pVec
(
0
)
=
eVec
.
at
<
double
>
(
i
,
0
)
/
norm
;
pVec
(
1
)
=
eVec
.
at
<
double
>
(
i
,
1
)
/
norm
;
pVec
(
2
)
=
eVec
.
at
<
double
>
(
i
,
2
)
/
norm
;
// Q = (TM . pVec)/Ts;
Q
(
0
,
0
)
=
(
TM
(
0
,
0
)
*
pVec
(
0
)
+
TM
(
0
,
1
)
*
pVec
(
1
)
+
TM
(
0
,
2
)
*
pVec
(
2
)
)
/
Ts
;
...
...
samples/cpp/fitellipse.cpp
浏览文件 @
800da724
...
...
@@ -282,15 +282,21 @@ void processImage(int /*h*/, void*)
}
if
(
fitEllipseQ
)
{
box
=
fitEllipse
(
pts
);
if
(
MAX
(
box
.
size
.
width
,
box
.
size
.
height
)
>
MIN
(
box
.
size
.
width
,
box
.
size
.
height
)
*
30
){
continue
;};
if
(
MAX
(
box
.
size
.
width
,
box
.
size
.
height
)
>
MIN
(
box
.
size
.
width
,
box
.
size
.
height
)
*
30
||
MAX
(
box
.
size
.
width
,
box
.
size
.
height
)
<=
0
||
MIN
(
box
.
size
.
width
,
box
.
size
.
height
)
<=
0
){
continue
;};
}
if
(
fitEllipseAMSQ
)
{
boxAMS
=
fitEllipseAMS
(
pts
);
if
(
MAX
(
boxAMS
.
size
.
width
,
boxAMS
.
size
.
height
)
>
MIN
(
boxAMS
.
size
.
width
,
boxAMS
.
size
.
height
)
*
30
){
continue
;};
if
(
MAX
(
boxAMS
.
size
.
width
,
boxAMS
.
size
.
height
)
>
MIN
(
boxAMS
.
size
.
width
,
boxAMS
.
size
.
height
)
*
30
||
MAX
(
box
.
size
.
width
,
box
.
size
.
height
)
<=
0
||
MIN
(
box
.
size
.
width
,
box
.
size
.
height
)
<=
0
){
continue
;};
}
if
(
fitEllipseDirectQ
)
{
boxDirect
=
fitEllipseDirect
(
pts
);
if
(
MAX
(
boxDirect
.
size
.
width
,
boxDirect
.
size
.
height
)
>
MIN
(
boxDirect
.
size
.
width
,
boxDirect
.
size
.
height
)
*
30
){
continue
;};
if
(
MAX
(
boxDirect
.
size
.
width
,
boxDirect
.
size
.
height
)
>
MIN
(
boxDirect
.
size
.
width
,
boxDirect
.
size
.
height
)
*
30
||
MAX
(
box
.
size
.
width
,
box
.
size
.
height
)
<=
0
||
MIN
(
box
.
size
.
width
,
box
.
size
.
height
)
<=
0
){
continue
;};
}
if
(
fitEllipseQ
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录